Zapachy kodu
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.
Spis treści |
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.
- Zbytnia 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]
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]
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]
Przypisy
- ↑ Kent Beck: CodeSmell (ang.). 2006-03-03. [dostęp 2009-11-21].
- ↑ 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" (ang.). [dostęp 2009-11-21].
- ↑ Jeff Atwood: Code Smells (ang.). 2006-05-18. [dostęp 2009-11-21].