In Clean Code heißt es, dass "die ideale Anzahl von Argumenten für eine Funktion Null ist". Die Gründe dafür werden erklärt und sind sinnvoll. Was ich suche, sind Techniken zur Umgestaltung von Methoden mit 4 oder mehr Argumenten, um dieses Problem zu lösen.
Eine Möglichkeit ist, die Argumente in eine neue Klasse zu extrahieren, aber das würde sicherlich zu einer Explosion von Klassen führen? Und diese Klassen werden wahrscheinlich Namen haben, die gegen einige der Namensregeln verstoßen (die mit "Data" oder "Info" usw. enden)?
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.
Ich suche nur nach Möglichkeiten, Funktionsargumente zu minimieren, nachdem ich die Gründe akzeptiert habe, warum es eine gute Idee ist, dies zu tun.
quelle
Antworten:
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 dieadd
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 | 53 + 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:
Point
Übergeben Sie anstelle von zwei Koordinaten ein Objekt, oder übergeben Sie anstelle von Benutzername und E-Mail einIdCard
Objekt.)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.
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.
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!
quelle
add
Funktion für natürliche Zahlen und dieadd
Funktion für den Ring von ganzen Zahlen mod n sind zwei verschiedene Funktionsaktionen für zwei verschiedene Typen. Ich verstehe auch nicht, was Sie unter "Kontext" verstehen.Beachten Sie, dass Null-Argumente keine Nebenwirkungen implizieren, da Ihr Objekt ein implizites Argument ist. Schauen Sie sich zum Beispiel an, wie viele Null-Aritäts-Methoden die unveränderliche Liste von Scala enthält .
Eine nützliche Technik, die ich als "Linsenfokussierung" bezeichne. Wenn Sie ein Kameraobjektiv fokussieren, ist es einfacher, den wahren Fokuspunkt zu erkennen, wenn Sie zu weit gehen, und ihn dann wieder an den richtigen Punkt zu verschieben. Gleiches gilt für Software-Refactoring.
Vor allem, wenn Sie die verteilte Versionskontrolle verwenden, können Sie leicht mit Softwareänderungen experimentieren, um zu sehen, ob Sie sie mögen, und um sich zurückzuziehen, wenn Sie dies nicht tun.
Im Zusammenhang mit Ihrer aktuellen Frage bedeutet dies, dass Sie die Null- oder Ein-Argument-Versionen mit mehreren abgespaltenen Funktionen zuerst schreiben und dann relativ leicht erkennen, welche Funktionen zur besseren Lesbarkeit kombiniert werden müssen.
Beachten Sie, dass der Autor auch ein großer Befürworter der testgetriebenen Entwicklung ist, die zu Beginn tendenziell Funktionen mit geringer Arität hervorbringt, da Sie mit Ihren einfachen Testfällen beginnen.
quelle
Ein Ansatz, der einfach (und naiv - oder sollte ich auch blind sagen ) nur darauf abzielt, die Anzahl der Argumente für Funktionen zu reduzieren, ist wahrscheinlich falsch. Es ist absolut nichts falsch an Funktionen mit einer großen Anzahl von Argumenten. Wenn sie von der Logik benötigt werden, sind sie auch erforderlich ... Eine lange Parameterliste macht mir überhaupt keine Sorgen - solange sie richtig formatiert und aus Gründen der Lesbarkeit kommentiert ist.
In dem Fall, dass alle oder eine Teilmenge von Argumenten zu einer eindeutigen logischen Entität gehören und üblicherweise in Gruppen innerhalb Ihres Programms weitergegeben werden, ist es möglicherweise sinnvoll, sie in einem Container zu gruppieren - in der Regel einer Struktur oder einem anderen Objekt. Typische Beispiele sind Nachrichten oder Ereignisdatentypen .
Sie können diesen Ansatz leicht übertreiben. Wenn Sie feststellen, dass das Ein- und Auspacken von Gegenständen in und aus solchen Transportbehältern mehr Aufwand verursacht als die Lesbarkeit verbessert, sind Sie wahrscheinlich zu weit gegangen.
Große Parameterlisten können ein Zeichen dafür sein, dass Ihr Programm möglicherweise nicht richtig strukturiert ist. Möglicherweise versucht die Funktion, die eine so große Anzahl von Parametern erfordert, zu viel und sollte in mehrere kleinere Funktionen aufgeteilt werden. Ich möchte lieber hier anfangen, als mir Gedanken über die Anzahl der Parameter zu machen.
quelle
Es gibt keinen magischen Weg: Sie müssen die Problemdomäne beherrschen, um die richtige Architektur zu finden. Das ist der einzige Weg zur Umgestaltung: die Beherrschung der Problemdomäne. Mehr als vier Parameter sind nur eine sichere Wette, dass Ihre aktuelle Architektur fehlerhaft und falsch ist.
Die einzigen Ausnahmen sind Compiler (Metaprogramme) und Simulationen, bei denen die Grenze theoretisch 8, aber wahrscheinlich nur 5 beträgt.
quelle