N
quelloffen schrieb:
Der Grund, weshalb viele (mich eingeschlossen) den Default-Parametern kritisch gegenüber stehen ist, dass es oft eine schlechte Idee ist, diese zu verwenden. Eine Funktion sollte genau eine Aufgabe haben und sobald Default-Parameter im Spiel sind, hat sie meistens mehrere Aufgaben, was bedeutet, dass man sie lieber in zwei Funktionen aufteilt und diese anders benennt. Weil man leicht in die Versuchung kommt, Default-Parameter zu übernutzen, ist es für Anfänger besser, diese generell zu vermeiden.
Die Begründung finde ich nicht überzeugend. Erstens sehe ich den Zusammenhang zwischen optional angegebenen Argumenten und zu vielen Aufgaben nicht -- es kann gut sein, dass eine Aufgabe bestimmte Parameter erfordert, die aber in den meisten Situationen nicht explizit angegeben werden müssen. Konsequenterweise müsstest du sonst auch gegen Default-Template-Parameter sein.
Zweitens, selbst wenn die Version mit Default-Parametern dazu tendiert, zu viele Aufgaben zu vereinen, dann gilt das Gleiche für überladene Funktionen, welche Aufrufe lediglich weiterleiten. Aus der Sicht des Aufrufers (welcher die Aufgaben anordnet) gibt es überhaupt keinen Unterschied. Und das Problem der zu vielen Aufgaben ist sowieso nicht gelöst, da eine Funktion immer noch alles tut, aber es eben noch zusätzliche Funktionen gibt, die (ausser der Weiterleitung) nichts tun.
Wo Default-Parameter verwirrend sein können, ist bei virtuellen Funktionen, zumal der C++-Standard die Überschreibung mit verschiedenen Default-Werten erlaubt. In Fällen, wo die Implementierung bei Angabe des Defaultparameters eine komplett andere ist, wäre Überladung wohl auch die bessere Wahl. Aber ich sehe keinen Sinn darin, kategorisch mehr Boilerplate-Code wie in Java (lediglich weiterleitende Funktionen) zu schreiben, nur um Default-Parameter zu meiden.