Jak / jeśli refaktorować program Delphi używając tylko formularzy i modułów danych

Po latach kodowania programów Delphi jako kodu nie do odtworzenia w formularzach i modułach danych, w tym zmiennych globalnych, a jedynymi klasami są same formularze, zawierające cały kod potrzebny do samego interfejsu formularza.

Jak przekonwertować kod na zestaw klas, które wykonują rzeczywistą pracę? Czy muszę przestać używać zasobów/zbiorów danych i robić wszystko w klasach? Czy potrzebuję ORM?

Jest zazwyczaj zero potrzeba ponownego użycia kodu w formularzach, tak samo czy konwersja logiki na klasy ma sens?

Author: Michael Riley - AKA Gunny, 2009-02-14

6 answers

Jeśli napotkam formę (lub inną klasę) z zbyt dużą odpowiedzialnością, Zwykle postępuję zgodnie z poniższym wzorem:

  1. Zdefiniuj nową klasę dla logiki.
  2. Utwórz zmienną członkowską nowej klasy w formularzu.
  3. Utwórz klasę w onCreate i zwolnij ją w onDestroy formularza.
  4. Przenieś pojedynczy fragment logiki (na przykład zmienną) do nowej klasy.
  5. Przenieś lub utwórz wszystkie metody do nowej klasy.
  6. skompilować i przetestować.
  7. Kontynuuj dopóki cała logika nie zostanie umieszczona w nowej klasie.
  8. spróbuj oddzielić klasę logiki od klasy form. (Możesz nawet pracować z interfejsami, jeśli chcesz).

Są sytuacje, w których jedna klasa nie wystarcza, więc nie ma problemu, aby utworzyć więcej klas. I te klasy mogą mieć inne klasy do.

Dzięki tym krokom możesz rozwiązać większość z tych problemów.

 27
Author: Toon Krijthe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-14 19:32:25

Na początek Gorąco polecam lekturę książki Refaktoryzacja autorstwa Martina Fowlera.

To da ci prawdziwe zrozumienie, jak najlepiej rozsądnie podejść do wprowadzania zmian w istniejącym kodzie (nie OO), aby poprawić konserwowalność.

Nie spojrzę na ORM, dopóki nie będziesz miał jasnego zrozumienia, jakie korzyści (jeśli w ogóle) przyniesie twoja aplikacja.

 8
Author: Ash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-14 17:11:57

Mam taki problem z jedną aplikacją, zaczynam robić co następuje:

  1. Zdefiniuj główne klasy dla najbardziej ogólnej logiki w kodzie.
  2. w każdym formularzu przenieś kod przetwarzający logikę biznesową wewnątrz zdarzeń jako funkcję / procedury w tej formie.
  3. następnie przenieś te funkcje / procedury do tych klas jako Statyczne metody .
  4. na koniec wykonaj tylko potrzebny kod w formularzach takich jak validation UI i wywołaj do klasy.
  5. dla zmiennych globalnych staraj się pominąć jak najwięcej i po prostu przekaż wartości jako parametry metodom.

Użyłem metod statycznych, ponieważ łatwiej jest usunąć kod ze zdarzeń i po prostu wywołać go bez konieczności tworzenia / wolnego obiektu dla każdej operacji. Oryginalny projekt nie został zaprojektowany w celu oddzielenia formularzy od kodu logiki biznesowej.

Ostateczna aplikacja nie była pełna OO, ale przynajmniej łatwiej było przetestować metody bez wymagającego interakcji z formami i wydarzeniami jak poprzednio.

Czasami czujesz, że jeśli przeprojektujesz aplikację od zera, będzie to łatwiejsze niż wprowadzanie zmian, aby uczynić ją prawdziwym projektem OO.

 5
Author: Mohammed Nasman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-15 07:50:48

Kolejną książką, którą mogę bardzo, bardzo polecić - moim zdaniem nawet bardziej pasującą niż "generyczna" książka refaktoryzacyjna Fowlera - jest "Working Effectively with Legacy Code" Michaela Feathersa. Naprawdę prezentuje główne nierówności, które trafisz podczas wykonywania tego rodzaju pracy. Refaktoryzacja kodu może być bardzo trudna dla twojej psychiki. Mam nadzieję, że poradzisz sobie z frustracją... Podoba mi się ten cytat (nie pamiętam skąd go wziąłem): "Bóg był w stanie stworzyć świat w 6 dni, tylko dlatego, że nie było żadnego kodu". Powodzenia. ;)

 4
Author: Tobias Hertkorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-15 08:31:53

Importowanie do Modelmaker jest moją pierwszą akcją w konfrontacji z istniejącym projektem Delphi. Modelmaker pomoże ci w refaktoryzacji Twojego kodu ponieważ:

  • tograficznie przedstawia wszystkie klasy, metody, zmienne itp.
  • jest bardzo ściśle zintegrowany w Delphi IDE (Menu główne, menu podręczne, oddzielny ModelMaker explorer, pasek narzędzi, skróty klawiaturowe). To integracja pozwala na szybkie wykonaj niezbędne działania bez leaving the IDE
  • posiada dedykowany moduł "refaktoring" pozwalający na szybkie tworzenie, przenoszenie I zmienić nazwy klas i zmiennych bez martwiąc się o zmianę kod podstawowy. Modelarz będzie automagicznie Zmień nazwy i odniesienia w wszystkich jednostkach.

Podstawowa funkcjonalność Modelmaker jest łatwa do nauczenia. Modelmaker jest jak każde inne dobre narzędzie produktywności - im więcej w niego wkładasz, tym więcej z niego korzystasz to. Modelmaker nie jest darmowy, ale łatwo opłaca się zwiększoną produktywnością. Nie znalazłem lepszego narzędzia do refaktoryzacji kodu Delphi. Oferują bezpłatną wersję próbną i przyzwoite filmy instruktażowe. Daj Modelmaker spróbować i powodzenia...

 4
Author: Kris De Decker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-21 03:06:34

Po zrozumieniu, czego potrzebujesz do refaktoryzacji kodu, a jeśli chcesz OPF/ORM, proponuję Jazz SDK

 1
Author: Cesar Romero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-14 18:31:36