Zapachy kodu

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, wyszukiwania

Zapachy kodu - 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 | edytuj kod]

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 | edytuj kod]

  • 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 iż 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].
  • Contrived Complexity - użyte zostały skomplikowane wzorce projektowe, gdzie zastosowanie znacznie prostszych byłoby wystarczające.

Podział[edytuj | edytuj kod]

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, zbytnia intymność, 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 | edytuj kod]

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: PMD (oprogramowanie), Checkstyle, FindBugs.

Zobacz też[edytuj | edytuj kod]

Przypisy

  1. Kent Beck: CodeSmell (ang.). 2006-03-03. [dostęp 2009-11-21].
  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" (ang.). [dostęp 2009-11-21].
  4. Jeff Atwood: Code Smells (ang.). 2006-05-18. [dostęp 2009-11-21].