Das Wichtigste, woran Sie sich erinnern sollten, ist, dass dies Richtlinien und keine Regeln sind.
Es gibt Fälle, in denen eine Methode einfach ein Argument annehmen muss . Denken Sie an die+
Methode für Zahlen. Oder die add
Methode für eine Sammlung.
In der Tat könnte argumentieren , man sogar das , was es bedeutet, zwei Zahlen zu addieren auf Kontext, zum Beispiel in z abhängig ist 3 + 3 == 6
, aber in z | 5 3 + 3 == 2
, so sollte wirklich der Additionsoperator ein Verfahren auf einem Kontextobjekt sein , das dauert zwei Argumente anstelle einem Methode für Zahlen mit einem Argument.
Ebenso muss eine Methode zum Vergleichen von zwei Objekten entweder eine Methode sein, bei der ein Objekt das andere als Argument verwendet, oder eine Methode des Kontexts, bei der zwei Objekte als Argumente verwendet werden. Daher ist es einfach nicht sinnvoll, eine Vergleichsmethode mit zu haben weniger als ein Argument.
Es gibt jedoch einige Möglichkeiten, um die Anzahl der Argumente für eine Methode zu verringern:
- Verkleinern Sie die Methode selbst : Wenn die Methode so viele Argumente benötigt, tut sie vielleicht zu viel?
- Eine fehlende Abstraktion : Wenn die Argumente eng miteinander korrelieren, gehören sie möglicherweise zusammen, und es fehlt eine Abstraktion? (Beispiel für ein kanonisches Lehrbuch:
Point
Übergeben Sie anstelle von zwei Koordinaten ein Objekt, oder übergeben Sie anstelle von Benutzername und E-Mail ein IdCard
Objekt.)
- Objektstatus : Wenn das Argument von mehreren Methoden benötigt wird, sollte es möglicherweise Teil des Objektstatus sein. Wenn es nur von einigen Methoden, aber nicht von anderen benötigt wird, tut das Objekt möglicherweise zu viel und sollte eigentlich zwei Objekte sein.
Eine Möglichkeit ist, die Argumente in eine neue Klasse zu extrahieren, aber das würde sicherlich zu einer Explosion von Klassen führen?
Wenn Ihr Domain-Modell viele verschiedene Arten von Dingen enthält, hat Ihr Code am Ende viele verschiedene Arten von Objekten. Daran ist nichts auszusetzen.
Und diese Klassen werden wahrscheinlich Namen haben, die gegen einige der Namensregeln verstoßen (die mit "Data" oder "Info" usw. enden)?
Wenn Sie keinen richtigen Namen finden, haben Sie möglicherweise zu viele oder zu wenige Argumente gruppiert. Sie haben also entweder nur ein Fragment einer Klasse oder Sie haben mehr als eine Klasse.
Eine andere Methode besteht darin, Variablen, die von mehreren Funktionen verwendet werden, zu privaten Membervariablen zu machen, um deren Übergabe zu vermeiden. Dadurch wird der Gültigkeitsbereich der Variablen jedoch möglicherweise so erweitert, dass sie für Funktionen offen ist, die sie nicht wirklich benötigen.
Wenn Sie eine Gruppe von Methoden haben, die alle mit denselben Argumenten arbeiten, und eine andere Gruppe von Methoden, die dies nicht tun, gehören sie möglicherweise zu verschiedenen Klassen.
Beachten Sie, wie oft ich das Wort "vielleicht" verwendet habe. Deshalb sind das Richtlinien, keine Regeln. Vielleicht ist Ihre Methode mit 4 Parametern völlig in Ordnung!