Najważniejszą rzeczą do zapamiętania jest to, że są to wytyczne, a nie zasady.
Są przypadki, w których metoda musi po prostu wziąć argument. Pomyśl +
na przykład o metodzie liczb. Lub add
metoda kolekcji.
W rzeczywistości można nawet argumentować, że to, co oznacza dodanie dwóch liczb, zależy od kontekstu, np. W ℤ 3 + 3 == 6
, ale w ℤ | 5 3 + 3 == 2
, więc tak naprawdę operator dodawania powinien być metodą na obiekcie kontekstu, który przyjmuje dwa argumenty zamiast metoda na liczbach, która przyjmuje jeden argument.
Podobnie metoda porównywania dwóch obiektów musi być albo metodą jednego obiektu przyjmującego drugi jako argument, albo metodą kontekstu przyjmującą dwa obiekty jako argumenty, więc po prostu nie ma sensu mieć metody porównawczej z mniej niż jeden argument.
To powiedziawszy, istnieje kilka rzeczy, które można zrobić, aby zmniejszyć liczbę argumentów dla metody:
- Zmniejsz samą metodę : może, jeśli metoda wymaga tak wielu argumentów, robi zbyt wiele?
- Brakująca abstrakcja : jeśli argumenty są ściśle ze sobą powiązane, może należą do siebie i brakuje Ci abstrakcji? (Przykład kanonicznej książki tekstowej: zamiast dwóch współrzędnych podaj
Point
obiekt lub zamiast nazwy użytkownika i adresu e-mail podaj IdCard
obiekt.)
- Stan obiektu : jeśli argument jest potrzebny na wiele sposobów, być może powinien on być częścią stanu obiektu. Jeśli jest to potrzebne tylko przez niektóre metody, ale nie przez inne, być może obiekt robi za dużo i powinien być naprawdę dwoma obiektami.
Jednym ze sposobów jest wyodrębnienie argumentów do nowej klasy, ale z pewnością doprowadziłoby to do eksplozji klas?
Jeśli twój model domeny ma wiele różnych rodzajów rzeczy, wtedy twój kod skończy z wieloma różnymi rodzajami obiektów. Nie ma w tym nic złego.
Czy te klasy prawdopodobnie kończą się nazwami, które naruszają niektóre reguły nazewnictwa (kończące się na „Dane” lub „Informacje” itp.)?
Jeśli nie możesz znaleźć właściwej nazwy, być może zgrupowałeś za dużo argumentów lub za mało. Więc albo masz tylko fragment klasy, albo masz więcej niż jedną klasę.
Inną techniką jest przekształcenie zmiennych używanych przez wiele funkcji w zmienne prywatne, aby uniknąć ich przekazania, ale rozszerza to zakres zmiennej, być może tak, że jest ona otwarta na funkcje, które w rzeczywistości jej nie potrzebują.
Jeśli masz grupę metod, z których wszystkie działają na tych samych argumentach, i inną grupę metod, które nie, być może należą one do różnych klas.
Zauważ, jak często używałem słowa „może”? Dlatego są to wytyczne, a nie zasady. Może Twoja metoda z 4 parametrami jest w porządku!