Wie verkette ich überladene Funktionen richtig?


8

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?


1
"Neue Funktion wird hinzugefügt" (was "neuer Parameter" bedeutet?) scheint im ersten Beispiel nicht schwieriger zu sein. Was im ersten Beispiel etwas schwieriger ist, ist das Löschen einer Option (z. B. damit der Benutzer beide aund bkeine 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.

CodeReview dient zum Überprüfen des tatsächlichen Codes, da Sie Pseudocode präsentieren, der dort nicht zum Thema gehört.
Winston Ewert

Antworten:


6

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.


2

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?


Ahrm, nimm eine beliebige Anzahl von Methoden / Parametern an.
Bobby

0

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.