Będąc programistą, jak rozpocząć pracę nad nowym projektem…??
Najpierw zbierasz podstawowe wymagania, a następnie na ich podstawie zaczynasz wdrażać daną funkcję, jedna po drugiej. W miarę postępów w projekcie i dowiadywania się o nim więcej, stale dodajesz i zmieniasz kod w swojej bazie kodu. Później zmieniasz także kod, aby naprawić błędy i przypadki Edge.

Ale co się stanie po kilku dniach lub miesiącach…? Jak wygląda Twój kod…?? Czy to skomplikowane? Czy trudno to zrozumieć? Jeśli tak, to zdecydowanie nie zwróciłeś uwagi na ulepszenie swojego kodu lub jego restrukturyzację. Być może napisałeś zduplikowany kod bez sprawdzania istniejącego kodu lub mogłeś napisać dłuższe metody/funkcje, duże klasy, zbyt wiele parametrów, nieintuicyjne nazwy zmiennych, rozmieszczenie kodu itp.
Ulepszanie lub aktualizacja kodu bez zmiany funkcjonalności oprogramowania lub zewnętrznego zachowania aplikacji nazywa się refaktoryzacją kodu. Zmniejsza koszty techniczne i sprawia, że kod jest bardziej wydajny i łatwiejszy w utrzymaniu. Jeśli wcześniej nie zwrócisz uwagi na proces refaktoryzacji kodu, za błędy w kodzie zapłacisz później. Nie ignoruj więc czyszczenia kodu.
W procesie tworzenia oprogramowania różni programiści mają różne style pisania kodu. Dokonują zmian, utrzymują kod, rozszerzają go i przez większość czasu pozostawiają kod bez ciągłej refaktoryzacji. Zwykle dzieje się tak w przypadku kodu niezrefaktoryzowanego zgnilizna kodu: bardzo zamieszania i bałaganu w kodzie, takiego jak zduplikowany kod, niezdrowe zależności między klasami lub pakietami, zły przydział obowiązków klasowych, zbyt wiele obowiązków na metodę lub klasę itp. Aby uniknąć tych wszystkich problemów, ważna jest ciągła refaktoryzacja.
Teraz pytanie brzmi… jakie są techniki refaktoryzacji kodu?
Omówimy kilka popularnych i powszechnych technik refaktoryzacji kodu, ale wcześniej omówmy kilka krótkich wskazówek…
Porady:
- Refaktoryzację kodu należy przeprowadzić małymi krokami. Wprowadź drobne zmiany w swoim programie, każda z nich sprawi, że Twój kod będzie nieco lepszy i pozostawi aplikację w stanie roboczym.
- Uruchom test TDD i CI po wprowadzeniu niewielkich zmian w procesie refaktoryzacji. Bez przeprowadzenia tych testów stwarzasz ryzyko wprowadzenia błędów.
- Nie twórz żadnych nowych funkcji ani funkcjonalności podczas procesu refaktoryzacji. Powinieneś dokonać refaktoryzacji kodu przed dodaniem jakichkolwiek aktualizacji lub nowych funkcji do istniejącego kodu.
- Proces refaktoryzacji może mieć wpływ na wyniki testów, dlatego dobrze jest zaangażować w proces refaktoryzacji zespół ds. kontroli jakości i zespół testujący.
- Musisz zaakceptować fakt, że nie będziesz w pełni usatysfakcjonowany swoim kodem. Twój refaktoryzowany kod będzie w najbliższej przyszłości nieaktualny i będziesz musiał go ponownie zrefaktoryzować.
Najpopularniejsze techniki refaktoryzacji kodu
Istnieje wiele podejść i technik refaktoryzacji kodu. Omówmy kilka popularnych…
1. Refaktoryzacja czerwono-zielona
Red-Green to najpopularniejsza i powszechnie stosowana technika refaktoryzacji kodu w procesie tworzenia oprogramowania Agile. Technika ta opiera się na podejściu do projektowania i wdrażania opartym na testach, co stanowi podstawę wszelkich form refaktoryzacji. Deweloperzy podejmują inicjatywę w zakresie refaktoryzacji do cyklu programowania opartego na testach i odbywa się to w trzech etapach.

- CZERWONY: Pierwszy krok rozpoczyna się od napisania nieudanego czerwonego testu. Zatrzymujesz się i sprawdzasz, co wymaga dopracowania.
- Zielony: W drugim kroku piszesz najprostszy kod i przechodzisz zielone testy deweloperskie.
- Refaktoryzacja: W ostatnim i trzecim kroku skupiasz się na ulepszaniu i ulepszaniu kodu, aby Twój test był ekologiczny.
Zasadniczo technika ta składa się z dwóch odrębnych części: pierwsza część polega na pisaniu kodu, który dodaje nową funkcję do systemu, a druga część polega na refaktoryzacji kodu wykonującego tę funkcję. Pamiętaj, że podczas przepływu pracy nie powinieneś wykonywać obu czynności jednocześnie.
2. Refaktoryzacja poprzez abstrakcję
Ta technika jest najczęściej używana przez programistów, gdy istnieje potrzeba przeprowadzenia dużej ilości refaktoryzacji. Używamy tej techniki głównie w celu zmniejszenia redundancji (duplikacji) w naszym kodzie. Obejmuje to dziedziczenie klas, hierarchię, tworzenie nowych klas i interfejsów, ekstrakcję, zastępowanie dziedziczenia delegacją i odwrotnie.

Podciąganie/Puszczanie w dół metoda jest najlepszym przykładem takiego podejścia.
- Metoda podciągania: Ściąga części kodu do nadklasy i pomaga w eliminacji duplikacji kodu.
- Metoda wciskania: Pobiera część kodu z nadklasy i przenosi ją w dół do podklas.
Wyciągnij treść konstruktora, wyodrębnij podklasę, wyodrębnij nadklasę, zwiń hierarchię, metodę szablonu formularza, wyodrębnij interfejs, zamień dziedziczenie na delegację, zamień delegację na dziedziczenie, przesuń pole w dół – to wszystko inne przykłady.
Zasadniczo w tej technice budujemy warstwę abstrakcji dla tych części systemu, które wymagają refaktoryzacji i odpowiednika, który ostatecznie je zastąpi. Poniżej podano dwa typowe przykłady…
abstrakcja w Javie
- Kapsułkowane pole: Wymuszamy na kodzie dostęp do pola metodami pobierającymi i ustawiającymi.
- Uogólnij typ: Tworzymy bardziej ogólne typy, aby umożliwić współdzielenie kodu, zastępujemy kod sprawdzający typ stanem, zastępujemy warunkowy polimorfizmem itp.
3. Metoda komponowania
W fazie tworzenia aplikacji często piszemy w naszym programie długie metody. Te długie metody sprawiają, że kod jest niezwykle trudny do zrozumienia i trudny do zmiany. W takich przypadkach najczęściej stosowana jest metoda komponowania.
W tym podejściu używamy usprawnionych metod, aby ograniczyć powielanie kodu. Oto kilka przykładów: wyodrębnienie metody, wyodrębnienie zmiennej, inline Temp, zamień Temp na Query, metoda inline, rozdzielenie zmiennej tymczasowej, usunięcie przypisań do parametrów itp.
Ekstrakcja: Dzielimy kod na mniejsze części, aby znaleźć i wyodrębnić fragmentację. Następnie tworzymy osobne metody dla tych fragmentów, a następnie zastępujemy je wywołaniem tej nowej metody. Ekstrakcja obejmuje klasę, interfejs i zmienne lokalne.
Wbudowane: To podejście usuwa szereg niepotrzebnych metod w naszym programie. Znajdujemy wszystkie wywołania metod, a następnie wszystkie zastępujemy zawartością metody. Następnie usuwamy metodę z naszego programu.
dialekt hibernacji
4. Metody upraszczające
W tym podejściu stosuje się dwie techniki… omówmy obie.
- Upraszczanie refaktoryzacji wyrażeń warunkowych: Instrukcja warunkowa w programowaniu z biegiem czasu staje się coraz bardziej logiczne i skomplikowane. Aby zrozumieć cały program, musisz uprościć logikę w swoim kodzie.
Jest wiele sposobów na refaktoryzację kodu i uproszczenie logiki. Niektóre z nich to: konsolidacja wyrażeń warunkowych i powielanie fragmentów warunkowych, rozkładanie warunkowych, zastępowanie warunkowych polimorfizmami, usuwanie flagi kontrolnej, zastępowanie zagnieżdżonych warunkowych klauzulami ochronnymi itp. - Uproszczenie refaktoryzacji wywołań metod: W tym podejściu sprawiamy, że wywołania metod są prostsze i łatwiejsze do zrozumienia. Pracujemy nad interakcją pomiędzy klasami i upraszczamy dla nich interfejsy.
Przykładami są: dodawanie, usuwanie i wprowadzanie nowych parametrów, zastępowanie parametru jawną metodą i wywołaniem metody, parametryzacja metody, tworzenie oddzielnego zapytania od modyfikatora, zachowywanie całego obiektu, usuwanie metody ustawiania itp.
5. Przenoszenie obiektów pomiędzy obiektami
W tej technice tworzymy nowe klasy i bezpiecznie przenosimy funkcjonalność pomiędzy starymi i nowymi klasami. Ukrywamy szczegóły implementacji przed publicznym dostępem.
Teraz pytanie brzmi… kiedy przenieść funkcjonalność pomiędzy klasami lub jak rozpoznać, że nadszedł czas na przeniesienie funkcjonalności pomiędzy klasami?
Kiedy odkryjesz, że klasa ma tak wiele obowiązków i zbyt wiele się dzieje, lub gdy stwierdzisz, że klasa jest niepotrzebna i nic nie robi w aplikacji, możesz przenieść kod z tej klasy do innej klasy i całkowicie go usunąć.
Przykładami są: przeniesienie pola, wyodrębnienie klasy, przeniesienie metody, klasa inline, ukrycie delegata, wprowadzenie obcej metody, usunięcie pośrednika, wprowadzenie lokalnego rozszerzenia itp.
6. Refaktoryzacja przygotowawcza
To podejście najlepiej zastosować, gdy zauważysz potrzebę refaktoryzacji podczas dodawania nowych funkcji w aplikacji. Zasadniczo jest to część aktualizacji oprogramowania z oddzielnym procesem refaktoryzacji. Oszczędzasz sobie przyszłego długu technicznego, jeśli zauważysz, że kod wymaga aktualizacji we wcześniejszych fazach rozwoju funkcji.
Użytkownik końcowy nie może zobaczyć takich wysiłków zespołu inżynierów oko w oko, ale programiści pracujący nad aplikacją odkryją wartość refaktoryzacji kodu podczas budowania aplikacji. Mogą zaoszczędzić czas, pieniądze i inne zasoby, jeśli po prostu poświęcą trochę czasu na wcześniejszą aktualizację kodu.
To tak, jakbym chciał jechać 160 km na wschód, ale zamiast po prostu włóczyć się po lesie, pojadę 20 km na północ do autostrady, a potem 100 km na wschód z trzykrotną prędkością, jaką mógłbym osiągnąć, gdyby Po prostu poszedłem tam prosto. Kiedy ludzie namawiają Cię, żebyś po prostu poszedł prosto tam, czasami musisz powiedzieć: „Poczekaj, muszę sprawdzić mapę i znaleźć najszybszą trasę”. Refaktoryzacja przygotowawcza robi to za mnie.
Jessiki Kerr (Programista)

7. Refaktoryzacja interfejsu użytkownika
Możesz wprowadzać proste zmiany w interfejsie użytkownika i refaktoryzować kod. Na przykład: wyrównaj pole wprowadzania, zastosuj czcionkę, przeredaguj aktywny głos, wskaż format, zastosuj wspólny rozmiar przycisku i zwiększ kontrast kolorów itp.
Ostatnie słowa
Proces refaktoryzacji kodu należy traktować jako porządkowanie porządku. Niepotrzebny bałagan w domu może stworzyć chaotyczną i stresującą atmosferę. To samo dotyczy kodu pisanego. Czysty i dobrze zorganizowany kod jest zawsze łatwy do zmiany, łatwy do zrozumienia i łatwy w utrzymaniu. Nie będziesz mieć trudności później, jeśli wcześniej zwrócisz uwagę na proces refaktoryzacji kodu.
Dwóch najbardziej wpływowych twórców oprogramowania Martina Fowlera I Kenta Becka poświęcili swój czas na wyjaśnienie procesu refaktoryzacji kodu i jego technik. Napisali także całą książkę na ten temat Refaktoryzacja: ulepszanie projektu istniejącego kodu . W tej książce opisano różne techniki refaktoryzacji wraz z jasnym wyjaśnieniem pracy nad procesem refaktoryzacji. Jeśli chcesz dogłębnie poznać proces refaktoryzacji kodu, zalecamy przeczytanie tej książki.