Code Smells: Długa lista parametrów

Długa lista parametrówOstatnio było o funkcjach

więc pociągnę ten temat nieco dalej. Do Code Smells jest zaliczana długa lista parametrów podawanych do delikwentki. Dlaczego? Ameryki raczej nie odkryję gdy napiszę że łatwiej przeczytać i zrozumieć sygnaturę metody zawierającej dwa parametry niż tej z dwunastoma. Więc jak zwykle chodzi o czytelność, to jednak nie koniec. Długie listy parametrów używane w programach napisanych w językach obiektowych mogą błędnie sugerować programowanie w paradygmacie funkcjonalnym, kolejny powód – zawsze należy unikać wprowadzania w błąd. Oprócz tego w 1956 roku amerykański uczony Georg Miller przeprowadził badania wskazujące na to, że większość osób będzie miała problemy ze śledzeniem > 7 elementów danych jednocześnie. Praca z funkcją polega między innymi na „panowaniu” nad parametrami. Robert C. Martin zauważa w swojej książce „Czysty kod”, że powinniśmy zacząć zastanawiać się nad refaktoryzacją już wtedy, gdy liczba parametrów przekracza 3.

Myślę, że z powyższymi argumentami zgodzi się większość. Jak więc można trzymać w ryzach nasze parametry? Spójrzmy na poniższe fragmenty kodu:

Czytając sygnaturę funkcji customer_data_save, możemy wywnioskować (dzięki dobrej nazwie zarówno funkcji jak i parametrów), że służy ona do zapisywania gdzieś danych klienta, które to dane są podawane do niej  w formie parametrów. W tym wypadku wszystko wskazuje na to, że funkcja wykonuje tylko jedno zadanie więc bezpiecznie zakładamy, że problem nie tkwi w odpowiedzialności a w samych parametrach. Faktycznie  wszystkie reprezentują pewien spójny zbiór bo są ze sobą powiązane. W takim wypadku możemy zamknąć je w obiekcie i cały obiekt przekazywać do funkcji:


 

Może się też zdarzyć, że lista parametrów jest długa ale nie są one ze sobą powiązane. Coś takiego wskazuje zazwyczaj na więcej niż jeden zakres odpowiedzialności metody i wymaga postępowania podobnego do refaktoryzacji długich metod, czyli wydzielenia metody.

W następnym wpisie dotyczącym Code Smells opiszę zbyt duże klasy. Sam problem jest nieco podobny do wielkich metod i różni się przede wszystkim skalą (choć nie tylko) ale o tym za jakiś czas :).

 

Dodaj komentarz

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