Angenommen, Sie haben Funktionen wie diese, die eine zunehmende Anzahl optionaler Parameter (und eine Pseudosprache, die keine optionalen Parameter und eine beliebige Anzahl von Parametern zulässt) annehmen:
function doStuff(Param a)
function doStuff(Param a, Param b)
function doStuff(Param a, Param b, Param c)
Was ist ein guter Weg, um sie zu einem einzigen Anruf zu vereinheitlichen? Ich kann mir zwei Designs vorstellen:
Durch alles fallen:
function doStuff(Param a)
doStuff(a, defaultB)
function doStuff(Param a, Param b)
doStuff(a, b, defaultC)
function doStuff(Param a, Param b, Param c)
// magic goes here
- Der Vorteil: Nicht viel Codeduplizierung, einfaches Ändern eines einzelnen Standardparameters.
- Der Nachteil: Viele Funktionsaufrufe können dazu führen, dass Stacktraces schwerer zu lesen oder unbrauchbar werden.
Oder rufen Sie direkt die 'letzte' Funktion auf:
function doStuff(Param a)
doStuff(a, defaultB, defaultC)
function doStuff(Param a, Param b)
doStuff(a, b, defaultC)
function doStuff(Param a, Param b, Param c)
// magic goes here
- Der Vorteil: Nicht viele Funktionsaufrufe, keine Sorge, wenn der Kette eine neue Funktion hinzugefügt wird.
- Der Nachteil: Viel Codeduplizierung, insbesondere die Standardwerte.
Woran habe ich nicht gedacht?
design-patterns
Bobby
quelle
quelle
a
undb
keine angeben muss ), aber die erste Option gewinnt immer noch, um die Fehlerduplizierung zu minimieren. Übrigens, Tippfehler: Die Implementierung der mittleren Überlastung sollte zwischen den Beispielen identisch sein.Antworten:
Ich bevorzuge die erste Methode. Die Möglichkeit, überall Standardwerte zu duplizieren, kann die Wartbarkeit erheblich beeinträchtigen. Ich bin auf dieses spezielle Problem in freier Wildbahn gestoßen, und es war ein Albtraum.
quelle
Das erste sind nur zwei zusätzliche Zeilen in einem Stacktrace, was nicht so viel ist. In Java habe ich nie festgestellt, dass Stacktraces aufgrund ähnlicher Methodennamen schwer zu lesen sind.
Auf jeden Fall könnte die Verwendung zu vieler Parameter einen schlechten Codegeruch verursachen: Wie viele Parameter sind zu viele?
quelle
Ich würde mich für das zweite Paradigma entscheiden (direkt die "letzte" Funktion aufrufen). Dies ist in Ordnung und stellt keine echte Codeduplizierung dar, da keine Manipulation eines Zustands erforderlich ist.
Es hilft auch zu erkennen, dass das, was Sie tun, indem Sie mehrere Überladungen bereitstellen, einfach ein Trick ist, nur um die Illusion optionaler Parameter zu erzeugen. Sobald Sie es so sehen, wird klar, dass die "letzte" und nur die "letzte" Methode diejenige ist, die echte Arbeit leisten soll, so dass jede Delegierung unter den nicht letzten Methoden einfach sinnlos ist.
Persönlich muss ich mich nicht mehr um dieses Problem kümmern, da ich C # verwende, das optionale Parameter unterstützt, sodass ich keine Tricks wie diese ausführen muss, um sie zu emulieren.
quelle