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
- [1] – książka: Refaktoryzacja. Ulepszanie struktury istniejącego kodu, Martin Fowler we współpracy z Kentem Beckiem
- [2] – książka: Refaktoryzacja do wzorców projektowych, Joshua Kerievsky
- [3] – www: Bad Smells in Software – a Taxonomy and an Empirical Study, Mika Mäntylä
- [4] – www: Code Smells, Aleksander Shvets
- [5] – www: Code Smells, Jeff Atwood
- [6] – książka: Czysty kod. Podręcznik dobrego programisty, Robert C. Martin
- [7] – książka: Mastering PHP Design Patterns, Junade Ali