Strategia refaktoryzacji na dużą skalę

Obecnie pracuję nad fragmentem kodu, w którym zarówno logika, jak i dostęp do danych są obecne w klasach GUI. Oczywiście chciałbym poprawić tę sytuację.

Obecna struktura to w zasadzie:

  • wielka kula błota

Ostatecznym celem jest osiągnięcie struktury podobnej do DDD:

  • DAL
  • Model domeny
  • warstwa usług
  • Model prezentacji
  • GUI

Jak więc zaatakować problem?

    Big bang
    • Zdefiniuj strukturę stanu końcowego i wypchnij kod do jego ostatecznego domu.
  • Divide and conquer
      Postaraj się rozdzielić dużą kulę błota na dwie części. Powtarzaj do końca...
  • duszenie
  • Author: Rodja, 2008-12-01

    9 answers

    Nigdy nie próbuj "Wielkiego Wybuchu". To prawie zawsze wieje w twarz, ponieważ jest to ryzykowne, desperackie działanie, gdy Wszystko inne zawiodło.

    Dziel i rządź: to działa dobrze ... jeśli twój świat ma tylko dwie strony. W prawdziwym oprogramowaniu trzeba podbić tak wiele frontów w tym samym czasie, rzadko można sobie pozwolić na życie w czarno-białej fantazji.

    Myślę, że używam czegoś w rodzaju "Duszenia" przez większość mojej kariery: stopniowo przekształcając zły stary kod w lśniący nowy. Oto mój przepis:

    Zacznij od czegoś, nieważne gdzie. Napisz kilka testów jednostkowych, aby zobaczyć, jak naprawdę zachowuje się kod. Dowiedz się, jak często robi to, co myślisz, a jak często nie. użyj IDE do refaktoryzacji kodu, aby móc go przetestować.

    Po pierwszym dniu, Zgadnij, czy zaczął się w odpowiednim miejscu, aby rozebrać tego potwora na części. Jeśli tak, to śmiało. Jeśli nie, Znajdź nowe miejsce i zacznij od nowa.

    Zalety tej strategii: działa w małych kroki, więc ryzyko może być utrzymane w ryzach i jeśli coś się zepsuje, jeśli musi być w kodzie, nad którym pracowałeś w zeszłym tygodniu.

    Wada: to zajmuje dużo czasu i poczujesz się sfrustrowany, ponieważ często postęp będzie wydawał się tak powolny, aż" węzeł " wyskakuje i nagle wszystko zaczyna się układać jak za pomocą magii.

     15
    Author: Aaron Digulla,
    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
    2008-12-01 08:32:34

    Nigdy nie słyszałem o określeniu "zastosowanie dusiciela" - podoba mi się. Tam, gdzie to możliwe, zawsze byłoby to dobre podejście, z pewnością minimalizuje ryzyko i jest dość pragmatyczne, odpryskując na wielki Gmach kawałek po kawałku.

    Gdzie to nie działa z mojego doświadczenia, to gdzie potrzebne są od razu dość znaczące zmiany - zmiany, które będą wymagały odrobiny refaktoryzacji (lub dużo hakowania). W tej sytuacji często uważałem, że zmiany, które musiałem zrobić, były w samym sercu z wielkiej kuli błota i nie było opcji, ale pobrudzenie - nawet to, co powinno być standardową konserwacją lub niewielkimi zmianami ulepszeń, było po prostu straszne, a główny refaktor był najlepszym rozwiązaniem.

    W takich przypadkach wybrałbym divide and conquer - pierwszym celem, do którego zawsze zmierzam, jest testability, gdy już się ma, że cała reszta jest o wiele łatwiejsza. W rzeczywistości jest to często jeden z głównych sterowników, które mam do refaktoryzacji z dala od wielkiej kuli błota – tego rodzaju kod jest często bardzo prawie nie do przetestowania, mam nadzieję, że są przykładowe wejścia i wyjścia interfejsu użytkownika, ale czasami nawet tego brakuje.

    Więc w obliczu kodu, w którym wszystko jest wrzucane do interfejsu użytkownika, zwykle zaczynam od uwzględnienia dyskretnych jednostek funkcjonalności w klasy i metody, a następnie spychając te części kodu w dół do warstwy domeny lub usługi. Robienie tego krok po kroku znacznie zmniejsza szansę na złamanie czegoś i ułatwia wskazywanie, gdzie znajdował się kod łamania, gdy wszystko idzie źle.

    Uruchom wszystkie dostępne przypadki testowe pod koniec każdej zmiany i upewnij się, że nadal spełniasz jakąś linię bazową.

    Jeśli piszesz dobre testy jednostkowe, możesz zacząć zmniejszać skalę problemu i odkryłem, że wkrótce praktyczne staje się podejście dusicielskie - przy przyzwoitych testach jednostkowych lub przynajmniej odpowiednim frameworku pozwalającym na pisanie przyzwoitych testów jednostkowych staje się znacznie bardziej praktyczne stopniowe zastępowanie części testów jednostkowych. funkcjonalność.

     6
    Author: David Hall,
    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
    2008-12-01 07:56:09

    Natknąłem się na "metodę Mikado", która wydaje się obiecująca dla atakowania problemów tego rodzaju.

    Http://mikadomethod.wordpress.com/

    Jest też mowa o metodzie Mikado z Øredev 2010.

    Http://oredev.org/2010/sessions/large-scale-refactorings-using-the-mikado-method

     4
    Author: Andreas,
    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
    2010-12-02 18:15:49

    Zależy od tego, czy musisz mieć zawsze działający stan, aby można było naprawiać błędy i wdrażać je zawsze, wtedy Devide i Conquer byłoby dobrym rozwiązaniem. Jeśli zachowasz stary kod podczas pracy nad nowym (i będziesz mieć możliwość stosowania poprawek błędów w obu bazach kodu), lepszym rozwiązaniem może być ponowne zapisanie.

     1
    Author: Peter Miehle,
    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
    2008-12-01 07:55:10

    Jeśli przez refaktoryzację masz na myśli Ulepszanie kodu bez modyfikowania funkcjonalności, zacząłbym od stworzenia linii bazowej automatycznego testowania regresji. Istnieje wiele narzędzi, które pomogą w tym. Używam TestComlete choć istnieją dobre tanie alternatywy.

    Po ustaleniu podstawy testu regresyjnego, osobiście wybrałbym divide and conquer, ponieważ z mojego doświadczenia wynika, że jest to najbardziej prawdopodobne. Gdy masz testową bazę, ma to znaczenie mniej, które podejście wybrać.

     1
    Author: Shane MacLaughlin,
    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
    2008-12-01 08:00:53

    Dla mnie to zależy od sytuacji.

    Jeśli jest to bardzo mały projekt, skusiłbym się na przepisanie go od podstaw...jednak nie często masz ten luksus.

    W Przeciwnym Razie poszedłbym na odpryski kawałek po kawałku. Napiszę testy jednostkowe, aby zweryfikować istniejącą funkcjonalność i powoli wykorzystam TDD, aby przekształcić kod w elegancki i dobrze zaprojektowany system. W zależności od tego, jak długo ten proces potrwa, prawdopodobnie zacznie wyglądać jak StranglerApplication, o którym wspomniałeś powyżej.

    BigBang jest bardzo ryzykowny, ponieważ nie ma łatwego sposobu sprawdzenia, czy zaktualizowany system działa tak samo, jak stary.

    Divide and Conquer jest mniej ryzykowne niż BigBang...ale jeśli jest wystarczająco duży system może skończyć się tak samo problematyczne jak BigBang.

     1
    Author: mezoid,
    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
    2008-12-01 08:41:30

    Big bang / Big re-design / przepisywanie SW ... czy jakakolwiek inna nazwa nie zadziała na żywą SW. Powody są następujące:

    • Nadal musisz wspierać istniejące oprogramowanie (prawdopodobnie) tymi samymi zasobami, które posiadasz.

    • Prawdopodobnie nie masz wymagań dotyczących przepisywania. Twój stary kod ma wszystkie wymagania osadzone w nim. Żaden z Twoich inżynierów nie zna wszystkich domen SW i wszystkich wymagań.

    • Przepisanie zajmie trochę czasu. Na pod koniec tego czasu przekonasz się, że istniejący SW zmienił się, aby wspierać rzeczy, które były wymagane w tym czasie. Twój nowy program SW faktycznie rozdzielony od oryginału i scalony będzie potrzebny (co również zajmie trochę czasu).

     1
    Author: Sharon Katz,
    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
    2015-09-17 08:47:29

    Czy total rewrite jest opcją? Z mojego doświadczenia wynika, że przepisywanie od podstaw często może być bardziej efektywne niż próba posprzątania istniejącego bałaganu. Nadal zachowujesz części istniejącego kodu, ale w nowym kontekście. To samo dotyczy gui i bazy danych, jeśli go posiadasz. Przepisać od podstaw i zabrać ze sobą to, co można użyć.

     0
    Author: Rune Grimstad,
    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
    2008-12-01 07:38:53

    Zaczynanie od czystej nowej architektury i przenoszenie starych peices kodu do tej nowej architektury kawałek po kawałku i refaktoryzacja go do nowego łuku byłoby dobrym rozwiązaniem. Myślę, że podejście oddolne przy przenoszeniu funkcji byłoby dobre.

     -1
    Author: Manoj,
    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
    2008-12-01 08:08:14