Ich neige dazu, Guard-Klauseln zu verwenden, um früh zurückzukehren und ansonsten am Ende einer Methode zu beenden. Die Regel des einmaligen Ein- und Ausstiegs hat historische Bedeutung und war besonders hilfreich, als es um alten Code ging, der für eine einzige C++-Methode mit mehreren Rückgaben (und vielen Fehlern) 10 A4-Seiten umfasste. In jüngerer Zeit hat es sich bewährt, die Methoden klein zu halten, so dass mehrere Ausgänge weniger ein Hindernis für das Verständnis darstellen. In dem folgenden Kronoz-Beispiel, das wir oben kopiert haben, geht es um die Frage, was in //Rest des Codes... ?:
void string fooBar(string s, int? i) {
if(string.IsNullOrEmpty(s) || i == null) return null;
var res = someFunction(s, i);
foreach(var r in res) {
if(!r.Passed) return null;
}
// Rest of code...
return ret;
}
Ich weiß, dass das Beispiel etwas konstruiert ist, aber ich wäre versucht, die foreach Schleife in eine LINQ-Anweisung, die dann als Schutzklausel betrachtet werden könnte. Auch hier ist die Absicht des Codes in einem erfundenen Beispiel nicht ersichtlich und someFunction() kann eine andere Nebenwirkung haben oder das Ergebnis kann in der Praxis verwendet werden. // Rest des Codes... .
if (string.IsNullOrEmpty(s) || i == null) return null;
if (someFunction(s, i).Any(r => !r.Passed)) return null;
Geben Sie die folgende überarbeitete Funktion:
void string fooBar(string s, int? i) {
if (string.IsNullOrEmpty(s) || i == null) return null;
if (someFunction(s, i).Any(r => !r.Passed)) return null;
// Rest of code...
return ret;
}
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