.

Szczegółowe wskazówki, jak refaktoryzować kod strony internetowej

Czy kiedykolwiek w trakcie pracy nad projektem złapałeś się za głowę czytając kod? Czy przynajmniej raz pomyślałeś sobie: “To nie jest optymalny kod - można to napisać lepiej i wydajniej”? Czy dodanie lub zmiana teoretycznie małej funkcjonalności na Twojej stronie powoduje lawinę problemów i wymaga wprowadzania zmian w wielu innych miejscach? Jeśli odpowiedź na przynajmniej jedno z tych pytań jest twierdząca, może to być czas na zaplanowanie refaktoringu kodu.

Co to znaczy refaktoryzować kod?

Refaktoryzacja kodu oznacza walkę z długiem technologicznym. To proces transformacji chaotycznego, niezgodnego ze standardami i dobrymi praktykami kodu w czysty kod, którego struktura jest prosta, zrozumiała i rozszerzalna.

Czym jest czysty kod?

Kod jest czysty, jeśli każdy z zespołu jest w stanie go łatwo zrozumieć. Funkcjonalność dostarczana przez czysty kod może być łatwo rozszerzana przez wszystkich programistów z zespołu, nie tylko autora danego kodu.

Czysty kod charakteryzuje się:

  • prostotą,
  • zrozumiałością dla innych programistów,
  • brakiem duplikatów,
  • minimalizmem,
  • pełnym otestowaniem,
  • łatwością i taniością w utrzymaniu.

Krok 1: Poznanie aplikacji lub strony internetowej

Na początku procesu refaktoryzacji kodu powinna mieć miejsce dogłębna analiza aplikacji i wyszczególnienie elementów trudnych w rozwoju i utrzymaniu. Pomocną metodą podczas tego etapu (a jednocześnie jedną z metod refaktoringu) jest Exploratory Refactoring. Na czym to polega? Ustaw stoper na 25-30 minut i w ciągu tego czasu prowadź refaktoryzację funkcjonalności, którą chcesz zrozumieć. Na tym etapie nie jest ważne, że zmiany, które wprowadzasz nie są optymalne lub że kod przestaje działać tak jak powinien. Celem wprowadzania zmian w tym momencie jest dogłębne poznanie funkcjonalności i zrozumienie przestarzałego kodu (legacy code), który przychodzi ci zrefaktoryzować. To podejście skraca czas potrzebny na analizę - statyczne czytanie kodu prawie nigdy nie pozwoli Ci na uzyskanie pełnego obrazu sytuacji.

Krok 2: Spisanie tego, co może stanowić problem

Hej, wziąłem na tapetę klasę “AplicationManager”. Nie jest w ogóle otestowana, ma wiele odpowiedzialności, a do tego jest bardzo krucha i ma literówkę w nazwie. Tą 250 linijkową metodę, która ma 7 parametrów i 2 flagi, można rozbić nie na parę metod, ale na 3 klasy. W trakcie Exploratory Refactoringu doszedłem do tych wniosków, a także do tego, że w pierwszej kolejności powinniśmy…

To jeden z przykładów wyniku użycia metody Exploratory Refactoring. Podczas analizy spisuj problemy, na które natrafiłeś i potencjalne rozwiązania tych problemów. Ta lista będzie niezbędna do prawidłowego i optymalnego procesu projektowania odświeżonej aplikacji. Na tym etapie nie skupiaj się na szczegółach, nie próbuj definiować dokładnych rozwiązań - na to jeszcze przyjdzie czas.

Jakie rzeczy mogą stanowić problem? W wielu przypadkach możemy czuć, że z kodem jest coś nie tak. Ma tak wiele osób, więc to przeczucie doczekało się swojej nazwy - code smells. Code smells można pogrupować i użyć tych grup do iteracyjnego refaktoringu.

Pęczniejący kod

Wiem, że ta klasa ma już 648 linii, wiele zależności i odpowiedzialności, ale ja tylko dopisałem na szybko jedną metodę, bo potrzebowałem jej do mojego zadania. Ta klasa wydała mi się odpowiednia. Co? Czemu zrobiłem to już 6 razy w 6 różnych, niezwiązanych ze sobą zadaniach? Mówię Ci przecież, że to tak na szybko.

Napęczniały kod to taki, który jest na tyle duży, że jego zrozumienie, utrzymanie, modyfikacja lub rozszerzenie jest czasochłonne. Kod tego typu jest kosztowny i trudny w przetestowaniu. Charakteryzuje się:

  • długimi metodami,
  • długimi klasami,
  • długą listą parametrów,
  • duplikacją zmiennych w wielu klasach,
  • używaniem prymitywnych pól zamiast prostych klas.

Niepełne lub nieodpowiednie użycie obiektowości

Kod zbiera w sobie wszystkie nadużycia i niepoprawne użycia obiektowości - łamie zasady, traci na czytelności. Zmiany, utrzymanie i testowanie stają się bardziej kosztowne.

Lista code smells zawiera w tym przypadku:

  • duplikację funkcjonalności,
  • kompleksowe switche, które można wyeliminować przy użyciu polimorfizmu,
  • zmienne tymczasowe w metodzie.

Blokery zmian

Zmiana w klasie powoduje potrzebę nadpisania teoretycznie niezwiązanych z nią metod. Wydłuża to czas potrzebny na wprowadzenie usprawnień lub rozszerzeń kodu.

Zbędne elementy kodu

- Podczas Code Review trafiłam na zmienną $fooMaganer, którą skomentowałeś “Foo Manager variable, used to manage the Foo”. Myślisz, że to odpowiedni komentarz?

- Nie wiem, ale w standardach mamy, że każda zmienna ma być skomentowana a nie, że ten komentarz ma coś wnosić. Więc jak? Dasz approval?

Przez zbędne elementy należy rozumieć wszystko, co nie wnosi nic nowego do kodu lub jest niewykorzystywane. Zalicza się do tego między innymi:

  • kod nadmiernie wypełniony zbędnymi komentarzami,
  • duplikacje kodu,
  • nieużywany kod,
  • nieużywane klasy,
  • nieużywane metody.

Łączniki

Cześć Adam, Anna potrzebuje listę dziesięciu pierwszych liczb z ciągu Fibonacciego. Daj mi ją proszę to przekaże w twoim imieniu. Dzięki!

Łączniki to zbędne elementy aplikacji, których zadanie polega jedynie na wywoływaniu funkcjonalności zaimplementowanej w innych klasach i przekazywaniu wyników do klasy wywołującej.

Łączniki to między innymi:

  • metody odwołujące się w większości do innego obiektu,
  • klasy czerpiące z wewnętrznych pól i metod danej klasy,
  • łańcuchy wywołań,
  • klasy, których jedyną odpowiedzialnością jest wywołanie metody w innej klasie.

Może Cię także zainteresować: Narzędzia programistyczne, które zwiększają naszą produktywność

Krok 3: Zaprojektowanie odświeżonej aplikacji

Po zidentyfikowaniu i opisaniu problematycznych miejsc przychodzi czas na zaplanowanie właściwego procesu. Refaktoryzacja może być przeprowadzona iteracyjnie lub całościowo. Wszystko zależy od ilości czasu, który możesz poświęcić na proces. Podejście całościowe wymaga oczywiście więcej czasu, ale benefity z obrania za cel tego podejścia są większe, niż w przypadku podejścia iteracyjnego. To ostatnie jest metodą refaktoringu zmian, polegającą na poprawianiu wybranych elementów aplikacji. Podejście iteracyjne można podzielić na poprawianie konkretnej listy code smell oraz pełny refaktoring, ale jedynie określonej funkcjonalności.

Jak refaktoryzować kod? Podsumowanie

Refaktoryzacja jest procesem zmniejszającym koszt wprowadzania zmian i nowych funkcjonalności do aplikacji. Korzystają na nim wszyscy, od właściciela projektu, przez zespół programistów i testerów, aż do użytkowników końcowych. Czysty kod jest łatwiejszy w testowaniu. Proces wdrażania zmian na stronę produkcyjną staje się przez to mniej stresujący. Jeśli wprowadzenie zmian na Twojej stronie jest czasochłonne, a kod można określić mianem kruchego - przyszedł czas na rozważenie przeprowadzenia refaktoringu. Rozpoczęcie tego procesu przyniesie Ci długoterminowe benefity.

Jeśli masz stronę internetową lub aplikację na Drupalu i nie wiesz, jak prawidłowo zrekatoryzować kod, nasz zespół wsparcia Drupala Ci w tym pomoże.

3. Najlepsze praktyki zespołów programistycznych