Zapachy kodu
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
edytujTermin 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ł
edytujMika 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
edytujNarzę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ż
edytujPrzypisy
edytuj- ↑ Kent Beck: CodeSmell. 2006-03-03. [dostęp 2009-11-21]. (ang.).
- ↑ Martin Fowler: Refaktoryzacja. Ulepszanie struktury istniejącego kodu. Warszawa: WNT, 2006, s. 78. ISBN 83-204-3110-7.
- ↑ Mika Mäntylä: A Taxonomy for „Bad Code Smells”. [dostęp 2009-11-21]. [zarchiwizowane z tego adresu (2012-01-11)]. (ang.).
- ↑ Jeff Atwood: Code Smells. 2006-05-18. [dostęp 2009-11-21]. (ang.).