Überlast oder optionale Parameter

10

Wenn ich eine Funktion habe, die möglicherweise einen bestimmten Parameter empfängt oder nicht, ist es besser, die Funktion zu überladen oder optionale Argumente hinzuzufügen?

Wenn jeder seine Höhen und Tiefen hat - wann würde ich jeden verwenden?

JNF
quelle
Aus Sicht der Optimierung ist es besser, optionale Parameter zu haben.
Maneet Puri

Antworten:

12

Wenn die Sprache sie ordnungsgemäß unterstützt (z. B. Typensicherheit, falls zutreffend), würde ich aus folgenden Gründen optionale Argumente bevorzugen:

  • Sie vermitteln Ihre Absicht besser, sodass niemand den Verdacht hat, dass Ihre Funktionsüberlastung etwas anderes bewirkt (was es wahrscheinlich sowieso nicht sollte).
  • Weniger zu wartender Code, auch wenn die Funktionsüberladung nur an die umfassendere delegiert. Wenn Sie die Funktion später umbenennen möchten, haben Sie mindestens drei Stellen (zwei Definitionen + ein Aufruf).
  • Der Compiler (falls vorhanden) generiert möglicherweise kleinere Binärdateien.
  • Optionale Argumente lassen sich zumindest in einigen Sprachen besser skalieren. Was ist, wenn Sie 3 optionale Argumente mit der Fähigkeit zum Mischen und Anpassen haben möchten? Für volle Flexibilität benötigen Sie dazu 6 Überladungen.
  • Wenn es sich um eine Objektmethode handelt, behindern mehrere Überladungen die Implementierung von Überschreibungen in Unterklassen erheblich.
Benjamin Kloster
quelle
Würdest du nicht 8 brauchen? Drei optionale Argumente a, bund chat diese Möglichkeiten: nichts, a, b, c, ab, ac, bc, abc. Es ist 2^nfür verschiedene Typen, nichtn!
Mark
0

Angenommen, eine Konstruktorsituation: Ich wähle oft ein fließendes Builder-Muster, um Situationen mit vielen Optionen zu vermeiden.

Z.B. Ordering.natural().onResultOf(function).reverse().compound(Ordering.natural().onResultOf(function2))ist ein Beispiel für den Aufruf einer in Guava implementierten fließenden Builder-Schnittstelle.

Natürlich benötigen Sie jetzt ein separates Objekt, um den Status Ihres Builders zu speichern, aber Sie reduzieren die Gesamtkomplexität, indem Sie das Konstruktionsverhalten vom Konstruktionsverhalten trennen.

Dibbeke
quelle
Dies beantwortet die Frage nicht.
Andy