Refaktoryzacja jest - i powinna być - ciągłym procesem. Nie wystarczy po prostu spełnić wymagania dzięki działającej i przetestowanej implementacji, która wciąż jest nieco niekompletna.
„Spraw, by działało, a następnie spraw, aby działało lepiej” .
Nie pamiętam, gdzie przeczytałem ten cytat, ale jest to klucz do dobrego zastosowania refaktoryzacji i uważam to za nieprofesjonalne, aby zrobić inaczej.
Ciągłe refaktoryzowanie jest jak wycieranie rozlanych płynów podczas gotowania i czyszczenie naczyń po zjedzeniu posiłku. Ukierunkowane refaktoryzacja jest jak znalezienie brudnej kuchni, ale tylko czas na umycie brudnej szklanki lub dwóch. Czy wolisz mieszkać z ciągle brudną kuchnią, czy wolisz utrzymywać porządek w czystości?
Dostajesz kod do działania, a następnie refaktoryzujesz kod, aby zapewnić najlepszą możliwą implementację. Jeśli robisz coś znajomego, być może za pierwszym razem wdrażasz najlepszy kod, jednak upewnienie się wymaga czasu. Jeśli wygląda na to, że możesz poprawić swój kod, to spróbuj refaktoryzować, aby upewnić się, że Twój kod jest co najmniej tak ubogi i czysty, jak to tylko możliwe. Oznacza to, że redukujesz kwotę długu technicznego, który pozostawiasz za sobą, a także ułatwiasz czytanie i refaktoryzację, gdy następnym razem zajdzie potrzeba załatwienia kodu. Jest to podstawowa wartość mantry TDD „Red-Green-Refactor”, z tym wyjątkiem, że w TDD refaktoryzujesz przede wszystkim w celu usunięcia duplikacji, opłaca się również przejrzeć inne elementy, które można zrefaktoryzować, takie jak duże klasy, długie metody
Jeśli znajdziesz się w obliczu poważnego przeprojektowania, być może możesz go odłożyć na chwilę, szczególnie jeśli masz mało czasu w harmonogramie. Jest to jednak możliwe pod warunkiem, że funkcjonalność Twojego kodu nie zostanie naruszona, a także pod warunkiem, że implementacja będzie nadal spełniać wymagania. Tego rodzaju sytuacja powinna być rzadka i możesz pomóc w zapewnieniu, że będzie to jeszcze rzadsze, jeśli będziesz ciągle refaktoryzować w trakcie. Jeszcze ważniejsze jest jednak to, że nie możesz ryzykować zbyt długiego pozostawienia poważnych zmian, w przeciwnym razie później stworzysz jeszcze większe obciążenie, które może być o wiele bardziej kosztowne do naprawienia, lub może skończyć się jeszcze bardziej kosztownym niepowodzenie projektu.
Mam wrażenie, że wiele osób często mylić definicje Refaktoryzacja i re-engineering . Te dwa terminy opisują strategie radzenia sobie z bardzo różnymi sytuacjami. Jeśli chcesz przeprojektować, zobowiązujesz się dokonać drastycznej zmiany, która zmieni zachowanie systemu. Spowoduje to unieważnienie niektórych testów, a także będzie wymagać nowych testów. Po dokonaniu refaktoryzacji upewniasz się, że system nadal zachowuje się dokładnietak samo jak przed zmianą, ale zapewniasz również, że Twój kod będzie miał długowieczność i że będzie łatwiej utrzymać go z czasem. Do cholery nie „wypychasz” swojego kodu, zobowiązujesz się do profesjonalnego standardu czystego kodu, który zmniejszy ryzyko niepowodzenia i zapewni, że Twój kod pozostanie przyjemnością do pracy, i profesjonalnym standardem .
Wracając do analogii zepsutych okien, jeśli rozbisz okno, powinieneś je natychmiast naprawić. Jeśli nie zauważyłeś, że okno jest zepsute, musisz zdecydować o kosztach, jeśli pozostawisz okno zepsute. Teraz powtórzyć poprzednie dwa zdania, ale substytutem Bug za oknem. W końcu potrzebujesz innej strategii. Jeśli stworzyłeś błąd podczas kodowania, naprawisz go od razu lub zobaczysz, czy zmiany będą wymagały ponownego zaprojektowania i podejmiesz komercyjną decyzję, kiedy najlepiej będzie rozwiązać problem. Aby uniknąć problemów, nie dokonujesz refaktoryzacji, refaktoryzujesz, aby łatwiej było znaleźć i naprawić problemy. Nie obchodzi mnie, jak zdumiewający jest twój kod, złożone systemy zawsze będą miały problemy, z którymi trzeba będzie się uporać. Na tym właśnie polega dług techniczny i dlaczego refaktoryzacja musi być procesem ciągłym podczas wdrażania kodu , a nie pozostawiona na jakiś arbitralny przyszły czas.
Krótko mówiąc, odpowiedź, że w rzadkich przypadkach akceptowalne może być odroczenie poważnych zmian w kodzie w celu dotrzymania terminu, nie należy jednak uważać za normalną praktykę traktowania refaktoryzacji jako ćwiczenia niezależnego od codziennej pracy wdrożeniowej, a na pewno nigdy nie wykorzystywane jako wymówka dla zespołów niezaznajomionych z bazą kodu jako opcja, aby uniknąć zapewnienia, że ich implementacja jest tak uproszczona i czysta, jak to możliwe, w danych okolicznościach.