<p>Ostatnio było o metodach, 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. Jak zwykle więcchodzi 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 <a href="https://pl.wikipedia.org/wiki/Programowanie_proceduralne">paradygmacie funkcjonalnym</a>, kolejny powód – zawsze należy unikać wprowadzania w błąd. Oprócz tego w 1956 roku amerykański uczony Georg Miller przeprowadził <a href="http://www.historyofinformation.com/expanded.php?id=3839">badania</a> 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.</p>
<p>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:</p>
<pre class="language-python" tabindex="0"><code class="language-python">def customer_data_save(name, surname, phone, postal_code, city, street, house_number):</code></pre>
<p>Czytając sygnaturę funkcji <i>customer_data_save</i>, 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:</p>
<pre class="language-python" tabindex="0"><code class="language-python">def customer_data_save(customer_data):</code></pre>
---
<p>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 <a href="http://www.przemyslawowsianik.net/2017/01/30/code-smells-zbyt-dlugie-metody/">refaktoryzacji długich metod</a>, czyli wydzielenia metody.</p>
<p>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 :).</p>