Code Smells: (Zbyt) Długie metody

Na wstępie chciałbym zaznaczyć, że poniższy wpis dotyczy zarówno funkcji, procedur jak i metod, ale dla uproszczenia będę używał tylko pojęcia metody.

Kiedy mówi się o zbyt długiej metodzie? Definicji tyle ilu twórców – jedni twierdzą, że 15 linii to nadmiar, inni że 30, jeszcze inni mówią że dopuszczalną granicą jest tzw. jeden ekran lub 200 wierszy. Według mnie nie ma żadnego celu trzymać się sztywno określonych ram (choć warto je mieć na uwadze) . Zadając sobie pytanie ‚Czy metoda wymaga refaktoryzacji?’ powinniśmy spojrzeć na zakres odpowiedzialności jaki pełni, aczkolwiek duża ilość linijek kodu jest dobrą przesłanką by zwrócić uwagę na delikwentkę.

Oczywiście zdarzają się też metody, które pełnią dobrze swoją funkcję w kontekście pojedynczej odpowiedzialności, ale są na tyle długie, że ich przeczytanie (i zrozumienie) może stanowić kłopot. Często się zdarza, że nie jest to problem dla programisty który ową metodę popełnił. Niestety przyszły „utrzymywacz” jego prac będzie miał już tylko pod górkę. Z drugiej strony nierzadko bywa, że metoda na starcie jest ok, ale rozrasta się później bo przecież łatwiej dorzucić do istniejącego kawałka 10 linii kodu, niż tworzyć nową metodę lub – nie daj Boże – klasę ;)).

Konsekwencją istnienia długich metod jest nieczytelność na ich poziomie, i pogorszona czytelność na poziomie klasy do której należą. Często towarzyszy im też długa lista parametrów, co też zalicza się do Code Smells, a o czym napiszę niebawem. Tak czy siak, zasadniczo powinniśmy preferować krótkie metody.

Jak sobie radzić z długimi metodami? Spójrzmy na poniższą implementację trywialnego programiku-gry, w której „Gracz” musi odgadnąć wylosowaną przez komputer liczbę z przedziału od 0 do 100. „Implementacja” jest w Pythonie 3.4.2:

Oczywiście powyższy kod nie przedstawia jakiejś naprawdę długiej metody, ale do celów prezentacji nada się wystarczająco. Analizując funkcję guess_number widzimy,  zresztą zgodnie z komentarzem, że jest to po prostu logika całej gry. Metoda zajmuje się inicjalizacją podstawowych wartości, pętlą obsługującą przebieg rozgrywki i  komunikacją z graczem przy pomocy podpowiedzi. Wydaje się więc, że rozsądnym byłoby podzielenie jej na trzy mniejsze. Spójrzmy na poniższy kod:

Po wydzieleniu, mamy trzy opisowo nazwane i bardziej czytelne funkcje z wyraźnie określoną odpowiedzialnością. kod co prawda jest większy objętościowo, ale mniej złożony , przez co łatwiejszy do zrozumienia.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *