Einstieg optionale Parameter

Optionale Parameter sind Parameter einer Funktion, welche optional sind und nicht zwingend übergeben werden müssen.
Nehmen wir als Beispiel eine Funktion namens "Shorten", die eine gegebene Zeichenkette kürzen soll. Beispielsweise für einen Textauszug.

// Kürzt einen String auf 20 Zeichen
public string Shorten(string input) {
  return input.Substring(20);
}
Beispielfunktion ohne optionalen Parameter

Hier hat der Nutzer/Entwickler keine Möglichkeit die Länge selbst zu bestimmen. Eine Alternative wäre eine Methodenüberladung. Dazu legen wir eine neue Methode mit dem selben Namen an.

public string Shorten(string input, int length) {
  return input.Substring(length);
}

public string Shorten(string input) {
  return Shorten(input, 20);
}
Die Methode Shorten wird überladen

Bei der Überladung haben wir die Methode im Prinzip zwei Mal implementiert. Die Methode mit der geringeren Anzahl an Parametern muss Standardwerte an die andere Methode übergeben, sofern das möglich ist.

Mit optionalen Parametern reicht eine Methode vollkommen aus, um beide Fälle abzudecken:

public string Shorten(string input, optional int length = 20) {
  return input.Substring(length);
}

Zu beachten sind das Schlüsselwort "optional" und der Standardwert bei der Deklaration. Zudem dürfen optionale Parameter nur am Ende stehen.

Vorteile von optionalen Parametern

Wie oben ersichtlich kann man grundlegend ein paar Zeilen Code sparen. Bei solch kleinen Methoden ist der Vortail allerdings kaum ersichtlich. Nehmen wir an, es gibt eine Methode mit mehreren Parametern:

public void DoSomething(optional string param1 = "",
                        optional string param2 = "",
                        optional int param3 = 100,
                        optional bool param4 = false,
                        optional int param5 = 0);
Funktion mit mehreren optionalen Parametern

Es gibt durchaus Funktionen im .NET Framework oder .NET Core, welche mehrere Parameter in beliebieger Kombination erlauben. Um das via Überladung zu leisten wären hier sehr sehr viele Methoden notwendig.

Als Nutzer erhalten wir die maximale Flexibilität. Wir können die Parameter nutzen, die uns für diese Funktion wichtig sind:

// In diesem Fall sind die ersten beiden Beispiele
// identisch. "param1" ist der erste Parameter
// und daher wird kein expliziter Name benötigt
DoSomething("foo")
DoSomething(param1: "foo");

DoSomething();
DoSomething(param2: "bar");
DoSomething(param1: "foo", param4: true, param5: 22);
Aufrufen der Methode mit einzelnen Parametern

Nachteile von optionalen Parametern

Aus eigener Erfahrung habe ich oft gesehen, dass optionale Parameter vor allem bei kleinen Funktionen (<= 3 Parametern) "Ballast" sind.
Mit Ballast meine ich, dass ein optionaler Parameter vorhanden ist, jedoch nie überschrieben wird. Ich gehe davon aus, dass es Überbleibsel von Refactoring oder Aufräumarbeiten sind. Da die Methode noch in Benutzung ist, übersieht man die nicht-Nutzung des Parameters.
Persönlich bin ich der Meinung, dass nicht-notwendige Parameter entfernt werden sollten, um den Code zu vereinfachen.

Als größeren Nachteil empfinde ich es, wenn eine Methode sehr viele optionale Parameter hat und intern viele IFs genutzt werden, um diese "Sonderfälle" abzudecken. Hier wird die Wart- und Lesbarkeit erheblich gestört, wo eine Überladung oder sprechende Namen die Nutzung vereinfachen.

Fazit

Gezielt eingesetzt können optionale Parameter helfen, die Menge an Code zu reduzieren und dynamische Methoden ohne Überladung bereitzustellen.
Für wenige Parameter bietet sich die Überladung an wodurch die Referenzen/Aufrufe innerhalb eines Programms besser nachvollziehen lassen.


Bildnachweis: Pixabay.com

Named and Optional Arguments (C# Programming Guide)