Zapachy kodu (ang. code smell) – określenie używane w programowaniu. Nazywa pewne cechy kodu źródłowego mówiące o złym sposobie implementacji i będące sygnałem do refaktoryzacji.

Historia

edytuj

Termin został sformułowany[1] przez Kenta Becka w artykule Once and Only Once zamieszczonym na Wiki c2.com. Pojęcie zostało rozpowszechnione przez książkę Martina Fowlera pod tytułem Refaktoryzacja. Ulepszanie struktury istniejącego kodu. Kent Beck był współautorem rozdziału o zapachach kodu.

Przykłady

edytuj
  • Długa metoda (ang. Large method) – istnieją bardzo długie metody.
  • Duża klasa (ang. Large class) – istnieją klasy posiadające zbyt wiele odpowiedzialności. Należy przeorganizować strukturę klas w projekcie.
  • Zazdrość o kod (ang. Feature envy) – istnieją metody intensywnie korzystające z danych innej klasy, metoda taka powinna być przeniesiona do klasy, z której danych korzysta.
  • Zbyt mała intymność (ang. Inappropriate intimacy) – istnieją klasy, których działanie jest zależne od implementacji innych klas. Jest to sprzeczne z ideą hermetyzacji, gdzie nie musimy znać szczegółów implementacyjnych innych klas, a jedynie ich interfejs.
  • Odrzucony spadek (ang. Refused bequest) – istnieją klasy pochodne, które przeciążają metodę z nadklasy tak, że naruszają jej kontrakt. Jest to naruszenie zasady podstawienia Liskov.
  • Leniwa klasa (ang. Lazy class) – istnieją klasy posiadające bardzo mały zakres odpowiedzialności.
  • Powielony kod (ang. Duplicated code) – ten sam fragment kodu powtarza się w kilku miejscach; utrudnia to wprowadzanie zmian (muszą zostać odnalezione wszystkie miejsca w kodzie, które realizują to samo zadanie)[2].
  • Wymyślna złożoność (ang. Contrived Complexity) – użyte zostały skomplikowane wzorce projektowe, gdzie zastosowanie znacznie prostszych byłoby wystarczające.

Podział

edytuj

Mika Mäntylä w artykule A Taxonomy for „Bad Code Smells”[3] dzieli brzydkie zapachy w kodzie na pięć kategorii:

  • ang. The Bloaters – coś co rozrosło się do tak dużych rozmiarów, iż nie może być poprawnie obsłużone: duża klasa, długa metoda, obsesja typów podstawowych, długa lista parametrów, zbitki danych.
  • ang. The Object-Orientation Abusers: – rozwiązania które nie wykorzystują w pełni możliwości programowania obiektowego: instrukcje switch, pole tymczasowe, odrzucony spadek, różne klasy z identycznym interfejsem.
  • ang. The Change Preventers – utrudniają zmiany lub rozwój oprogramowania: poszatkowanie, równoległe hierarchie dziedziczenia, rozbieżna zmiana.
  • ang. The Dispensables – zawierają coś, co powinno być usunięte z kodu źródłowego: leniwa klasa, klasa danych, powtórzony kod, martwy kod, spekulatywna ogólność.
  • ang. The Couplers – zapachy związane z powiązaniem kodu: zazdrość o kod, niewłaściwy poziom intymności, pośrednik, łańcuchy wywołań.

Inny podział proponuje Jeff Atwood w jednym z postów na blogu Coding Horror[4] podaje następujący podział:

  • zapachy wewnątrz klas (ang. Code Smells Within Classes): komentarze, długa metoda, długa lista parametrów, powielony kod, skomplikowane warunki, duża klasa, zagnieżdżanie typu w nazwie, niewiele mówiąca nazwa, niespójne nazwy, nieużywany kod, spekulatywną ogólność, pole tymczasowe
  • zapachy kodu między klasami (ang. Code Smells Between Classes): podobne klasy o różnych interfejsach, obsesja typów podstawowych, klasy danych, zbitki danych, odrzucony spadek, zbytnia intymność, zazdrość o kod, leniwa klasa, łańcuchy wywołań, pośrednik, poszatkowanie, równoległe hierarchie dziedziczenia, niekompletna klasa bazowa

Automatyczne wykrywanie

edytuj

Narzędzia do statycznej analizy kodu dostarczają możliwości automatycznego wykrywania brzydkich zapachów w kodzie. W przypadku języka Java są to np. SonarQube, PMD (oprogramowanie), Checkstyle, FindBugs.

Zobacz też

edytuj

Przypisy

edytuj
  1. Kent Beck: CodeSmell. 2006-03-03. [dostęp 2009-11-21]. (ang.).
  2. Martin Fowler: Refaktoryzacja. Ulepszanie struktury istniejącego kodu. Warszawa: WNT, 2006, s. 78. ISBN 83-204-3110-7.
  3. Mika Mäntylä: A Taxonomy for „Bad Code Smells”. [dostęp 2009-11-21]. [zarchiwizowane z tego adresu (2012-01-11)]. (ang.).
  4. Jeff Atwood: Code Smells. 2006-05-18. [dostęp 2009-11-21]. (ang.).