Es gibt gute Argumente für einen einzigen Ausstiegspunkt, genauso wie es schlechte Argumente für den unvermeidlichen Ausstiegspunkt gibt. "Pfeil" die daraus resultierende Programmierung.
Wenn bei der Eingabevalidierung oder der Ressourcenzuweisung mehrere Exit-Points verwendet werden, versuche ich, alle "Fehler-Exits" gut sichtbar an den Anfang der Funktion zu stellen.
Sowohl die Spartanische Programmierung Artikel der "SSDSLPedia" und der einzelne Funktionsausstiegspunkt Artikel des "Portland Pattern Repository's Wiki" haben einige aufschlussreiche Argumente zu diesem Thema. Außerdem gibt es natürlich diesen Beitrag zu berücksichtigen.
Wenn man wirklich einen einzigen Exit-Point haben möchte (in jeder nicht-ausnahmefähigen Sprache), um z.B. Ressourcen an einer einzigen Stelle freizugeben, finde ich die vorsichtige Anwendung von goto gut; siehe z.B. dieses ziemlich konstruierte Beispiel (komprimiert, um Bildschirmfläche zu sparen):
int f(int y) {
int value = -1;
void *data = NULL;
if (y < 0)
goto clean;
if ((data = malloc(123)) == NULL)
goto clean;
/* More code */
value = 1;
clean:
free(data);
return value;
}
Ich persönlich mag die Pfeilprogrammierung im Allgemeinen nicht so sehr wie mehrere Ausstiegspunkte, obwohl beide nützlich sind, wenn sie richtig angewendet werden. Am besten ist es natürlich, wenn Sie Ihr Programm so strukturieren, dass beides nicht erforderlich ist. Die Aufteilung einer Funktion in mehrere Teile ist in der Regel hilfreich :)
Obwohl ich dabei feststelle, dass ich ohnehin mehrere Ausstiegspunkte habe, wie in diesem Beispiel, wo eine größere Funktion in mehrere kleinere Funktionen aufgeteilt wurde:
int g(int y) {
value = 0;
if ((value = g0(y, value)) == -1)
return -1;
if ((value = g1(y, value)) == -1)
return -1;
return g2(y, value);
}
Je nach Projekt oder Kodierungsrichtlinien könnte der meiste Standardcode durch Makros ersetzt werden. Nebenbei bemerkt: Durch diese Aufteilung lassen sich die Funktionen g0, g1 und g2 sehr leicht einzeln testen.
In einer OO- und ausnahmefähigen Sprache würde ich solche if-Anweisungen natürlich nicht verwenden (oder überhaupt nicht, wenn ich mit geringem Aufwand damit auskommen könnte), und der Code wäre viel einfacher. Und nicht pfeilartig. Und die meisten der nicht endgültigen Rückgaben wären wahrscheinlich Ausnahmen.
Kurz gesagt;
- Wenige Erträge sind besser als viele Erträge
- Mehr als eine Rückkehr ist besser als große Pfeile, und Schutzklauseln sind im Allgemeinen in Ordnung.
- Ausnahmen könnten/sollten wahrscheinlich die meisten "Schutzklauseln" ersetzen, wenn dies möglich ist.
25 Stimmen
Ich stimme nicht zu, dass die Frage sprachenfeindlich ist. Bei einigen Sprachen ist die Mehrfachrückgabe natürlicher und bequemer als bei anderen. Ich würde mich eher über frühe Rückgaben in einer C-Funktion beschweren als in einer C++-Funktion, die RAII verwendet.
3 Stimmen
Diese Frage ist eng damit verbunden und enthält ausgezeichnete Antworten: programmers.stackexchange.com/questions/118703/
0 Stimmen
Sprachunabhängig? Erklären Sie jemandem, der eine funktionale Sprache verwendet, dass er einen Return pro Funktion verwenden muss :p