Code Smells powiązane jest w dużej mierze z Refaktoryzacją.
Podchodząc do refaktoryzacji możesz nauczyć się X technik w jaki sposób przekształcić dany kod w inny. Jednakże jak znaleźć te miejsca, które należy zmienić?
Martin Fowler we współpracy z Kentem Beckiem pracując przy już X projektach w swojej karierze, zaczęli zauważać, że często kod, który należy zmodyfikować ma podobne symptomy. Symptomy te nazwali „Code smells” („Zapachy kodu” / „Brzydkie zapaszki w kodzie”). Code smells to lista zapaszków na podstawie których nam jako developerom powinna zapalić się lampka, że dany fragment kodu z dużym prawdopodobieństwem należy zmodyfikować.
I tutaj bardzo istotna uwaga, „z dużym prawdopodobieństwem” oznacza, że jest spora szansa, że należy to miejsce zmodyfikować, ale nie oznacza to, że tak właśnie jest. Jeśli widzimy jakiś zapaszek w naszym kodzie nie oznacza to, że na pewno jest to miejsce do modyfikacji. Po zauważeniu zapaszku należy przeanalizować najpierw czy faktycznie dany fragment należy zmodyfikować, bo code smells to wskazówki, a nie z góry narzucone wytyczne, że zawsze dane miejsce w kodzie jest złe i należy je szybko zmienić.

Lista zapaszków (code smells) po pierwszej publikacji zaczęła rosnąć, a także doczekała się swojej kategoryzacji przestawionej przez Mika Mäntylä ([Bad code smells]). Poniżej krótki opis tych kategorii oraz zapaszków w niej zawartej. Obok zapaszku możesz zobaczyć tajemnicze oznaczenia 1, 2, 3, 4, 5 – są to oznaczenia źródeł w którym dany zapaszek został poruszony.

Z czasem do każdego zapaszku przygotuję wpis, aby dokładnie opisać konkretny code smell. Wpisy zostaną tutaj podlinkowane.

The Bloaters

Kod (klasa / metoda / fukcja) który rozrósł się do dużych rozmiarów.

  • Long Method (długa metoda) [1, 2, 3, 4, 5, 7]
  • Large Class (duża klasa) [1, 2, 3, 4, 5, 7]
  • Primitive Obsession (pierwotna obsesja / opętanie typami prostymi) [1, 2, 4, 5, 7]
  • Long Parameter List (długa lista parametrów) [1, 3, 4, 5, 6, 7]
  • Data Clumps (stada danych) [1, 3, 4, 5]

The Object-Orientation Abusers

Kod który nie jest w pełni zgodny z pisaniem kodu obiektowego.

  • Switch Statements (instrukcje switch) [1, 2, 3, 4, 6, 7]
  • Temporary Field (pole tymczasowe) [1, 3, 4, 5]
  • Refused Bequest (odmowa przyjęcia spadku) [1, 3, 4, 5]
  • Alternative Classes with Different Interfaces (podobna klasa o innych interfejsach / alternatywne klasy z różnymi interfejsami) [1, 2, 3, 4, 5]

The Change Preventers

Kod utrudniający wprowadzanie zmian.

  • Divergent Change (rozbieżne zmiany) [1, 3, 4, 5]
  • Shotgun Surgery (fala uderzeniowa) [1, 3, 4, 5]
  • Parallel Inheritance Hierarchies [3, 4, 5]

The Dispensables

Kod który powinien zostać usunięty.

  • Lazy class (leniwa klasa) [1, 2, 3, 4, 5]
  • Data class (klasa danych) [1, 3, 4, 5]
  • Duplicate Code (powtórzenia kodu / zduplikowany kod) [1, 2, 3, 4, 5, 6, 7]
  • Dead Code [4, 5, 6]
  • Speculative Generality (spekulacyjne uogólnienia) [1, 3, 4, 5]

The Couplers

Kod za mocno powiązany, zazdroszczący danych.

  • Feature Envy (zazdrosne funkcjonalności) [1, 3, 4, 5, 6, 7]
  • Inappropriate Intimacy /Insider Trading (niestosowna bliskość) [1, 3, 4, 5, 7]
  • Message Chains (łańcuchy komunikatów) [1, 3, 4, 5]
  • Middle Man (pośrednik) [1, 3, 4, 5]
  • Incomplete Library Class [3, 4, 5]

Pozostałe code smells

W książce M. Fowlera (Rekatoryzacja. Ulepszanie struktury istniejacego kodu) oraz książce J. Kerievsky (Refaktoryzacja do wzorców projektowych) znajdują się jeszcze inne zapaszki, które nie zostały uwzględnione w kategoriach, bądź nie pasowały do tych kategorii utworzonych przez Mika Mäntylä.

  • Conditional Complexity (złożoność warunków) [2, 5]
  • Indecent Exposure (nieprzyzwoite obnażanie się) [2, 5, 7]
  • Solution Spawl (rozrzucanie rozwiązania) [2, 5]
  • Combinatorial Explosion (eksprozja kombinatoryczna) [2, 5]
  • Oddball Solution (osobliwe rozwiązanie) [2, 5]
  • Mysterious Name (tajemnicza nazwa) [1, 5, 6]
  • Global Data (dane globalne) [1]
  • Mutable Data (dane mutowalne) [1]
  • Loops (pętle) [1]
  • Comments (komentarze) [1, 3, 5, 6, 7]
  • Inconsistent Names [5, 6]

 

Inny podział na kategorie

Inny podział możesz znaleźć na blogu o nazwie Coding Horror, który prowadzi Jeff Atwood.

Tam znajduje się podział na dwie kategorie:

  • Code Smells Within Classes (zapaszki wewnątrz klas)
  • Code Smells Between Classes (zapaszki pomiędzy klasami)

 


Źródła

Czysty kod. Podręcznik dobrego programisty Refaktoryzacja do wzorców projektowych Rafaktoryzacja