JavaScript:
Refaktoryzacja

Jak to zrobić:

Spójrzmy na prosty przykład, gdzie refaktoryzacja może uczynić twój kod bardziej zwięzłym i czytelnym. Oto jak refaktoryzujemy funkcję, która oblicza sumę tablicy liczb.

Przed:

function calculateSum(arr) {
  let sum = 0;
  for (let i = 0; i < arr.length; i++) {
    sum += arr[i];
  }
  return sum;
}

console.log(calculateSum([1, 2, 3, 4])); // Wynik: 10

Po:

function calculateSum(arr) {
  return arr.reduce((sum, num) => sum + num, 0);
}

console.log(calculateSum([1, 2, 3, 4])); // Wynik: 10

Widzisz, jak metoda reduce zmniejsza rozmiar funkcji, zachowując przy tym jej funkcjonalność? To właśnie refaktoryzacja.

Głębsze zanurzenie

Refaktoryzacja nie pojawiła się jako formalna praktyka aż do publikacji książki Martina Fowlera “Refactoring: Improving the Design of Existing Code” w 1999 roku. Ta książka, wraz z rozwojem zwinnych metod wytwarzania oprogramowania, pomogła wprowadzić refaktoryzację do głównego nurtu.

Opisywanie refaktoryzacji jako aspektu wytwarzania oprogramowania jest jak tłumaczenie, dlaczego warto sprzątać warsztat: robisz to, aby następnym razem, gdy będziesz musiał coś naprawić (w tym przypadku kod), spędzić mniej czasu na radzeniu sobie z bałaganem, a więcej na faktycznym problemie.

Gdy mówimy o alternatywach dla refaktoryzacji, wchodzimy w szerszą dyskusję na temat strategii utrzymania oprogramowania. Można by wybrać pełne przepisanie kodu, ale jest to często droższe i ryzykowniejsze. Refaktoryzując stopniowo, czerpiesz ciągłe korzyści bez zatapiania statku przez nagłą przebudowę.

Refaktoryzacja została wspomagana przez rozwój zintegrowanych środowisk programistycznych (IDEs) oraz narzędzi takich jak JSHint, ESLint i Prettier w ekosystemie JavaScript, które automatyzują sprawdzanie jakości kodu i wskazują możliwości do refaktoryzacji.

Chodzi o to, aby kod był czysty, wyrazisty i łatwy w utrzymaniu. W ramach procesu refaktoryzacji mogą występować zaawansowane algorytmy, optymalizacje struktur danych, a nawet zmiany architektoniczne, jak przejście z programowania proceduralnego na funkcyjne.

Refaktoryzacja musi być przeprowadzana ostrożnie; istotne jest, aby mieć solidny zestaw testów, aby upewnić się, że zmiany nie zmieniły nieoczekiwanie zachowania oprogramowania—kolejny powód, dla którego Test-Driven Development (TDD) dobrze współgra z refaktoryzacją, gdyż domyślnie zapewnia tę siatkę bezpieczeństwa.

Zobacz również