Ist ein Kodierungsprinzip - zB das Single-Exit-Prinzip
Menschen, die immer noch daran interessiert sind, ob sie nur einen oder mehrere Ausgänge haben, stecken noch in den späten 1960er Jahren fest. Damals war eine solche Diskussion wichtig, da wir uns noch in den Kinderschuhen eines strukturierten Programmierers befanden, und es gab zahlreiche Lager, in denen behauptet wurde, dass die Ergebnisse des Bohm-Jacopini-Satzes für strukturierte Programme nicht für alle Programmierkonstrukte universell anwendbar sind.
Es ist etwas, das vor langer Zeit hätte beigelegt werden sollen. Nun, es wurde entschieden (beinahe vier Jahrzehnte, um genau zu sein, sowohl in der akademischen Welt als auch in der Industrie), aber die Leute (die absolut pro oder gegen sind) haben nicht aufgepasst.
Was den Rest meiner Antworten angeht, ist alles relativ (was ist nicht in der Software?):
- Wirklich eine gute Sache?
Ja. Meistens für den allgemeinen Fall mit Vorbehalten, die für Randfälle und sprachspezifische Programmierkonstrukte spezifisch sind.
Immer oder nur manchmal?
Meistens.
Wie viel Unterschied macht es wirklich?
Hängt davon ab.
Lesbarer Code im Vergleich zu nicht lesbarem Code. Erhöhte Komplexität (die wir inzwischen kennen sollten, erhöht die Wahrscheinlichkeit, Fehler einzuführen) im Vergleich zu einfacherer Komplexität (und damit geringerer Wahrscheinlichkeit von Fehlern). Sprachen, deren Compiler keine implizite Rückgabe hinzufügen (z. B. Pascal, Java oder C #) Standardeinstellung ist int (C und C ++).
Am Ende ist es eine Fertigkeit, die mit Mannstunden hinter einer Tastatur geschliffen wurde. Manchmal ist es in Ordnung, mehrere return-Anweisungen zu haben, wie hier (in einigen Pascal'esque-Pseudocodes):
function foo() : someType
begin
if( test1 == true )
then
return x;
end
doSomethignElseThatShouldnHappenIfTest1IsTrue();
return somethingElse();
end;
Die Absicht ist klar, und der Algorithmus ist klein genug und unkompliziert genug, um die Erstellung einer 'Flag'-Variablen nicht zu rechtfertigen, die den in einem einzelnen Rückgabepunkt verwendeten Rückgabewert enthält. Der Algorithmus könnte fehlerhaft sein, seine Struktur ist jedoch so einfach, dass der Aufwand zum Erkennen eines Fehlers (höchstwahrscheinlich) vernachlässigbar ist.
Manchmal ist es nicht so (hier mit einem C-ähnlichen Pseudocode):
switch(someVal)
{
case v1 : return x1;
case v2 : return x2:
case v3 : doSomething(); // fall-through
case v4: // fall-through
case v5: // fall-through
case v6: return someXthingie;
...
...
default:
doSomething(); // no return statement yet
}
Hier hat der Algorithmus keine einfache Struktur und die switch-Anweisung (eine C-artige) erlaubt Fall-Through-Schritte, die absichtlich als Teil des Algorithmus ausgeführt werden können oder nicht.
Vielleicht ist der Algorithmus korrekt, aber schlecht geschrieben.
Oder vielleicht, durch äußere Kräfte über die Fähigkeit des Programmierers, ist dies die tatsächliche (und richtig) Darstellung eines rechtmäßig benötigt Algorithmus.
Vielleicht ist es falsch.
Um die Wahrheit darüber herauszufinden, ist weitaus mehr Aufwand erforderlich als im vorherigen Beispiel. Und hierin liegt etwas, woran ich fest glaube (wohlgemerkt, dass ich keine formalen Studien habe, um dies zu belegen):
Angenommen, ein Codeausschnitt ist korrekt:
Mehrere return-Anweisungen erhöhen die Lesbarkeit und Einfachheit eines solchen Code-Snippets, wenn das Snippet einen einfachen Algorithmus mit einer von Natur aus einfachen Ablaufstruktur darstellt. Mit einfach meine ich nicht klein, sondern von Natur aus verständlich oder selbsterklärend , was keinen unverhältnismäßigen Leseaufwand erfordert (noch Menschen dazu bringen, sich zu übergeben, die Mutter von jemandem zu verfluchen oder eine Kugel zu schlucken, wenn sie sie lesen müssen). )
Eine einzelne return-Anweisung erhöht die Lesbarkeit und Einfachheit eines solchen Codes, wenn der Rückgabewert entweder während der Ausführung des Algorithmus berechnet wird oder wenn die Schritte des Algorithmus, die für die Berechnung verantwortlich sind, an einer Stelle in der Struktur des Algorithmus zusammengefasst werden können .
Eine einzelne return-Anweisung verringert die Lesbarkeit und Einfachheit eines solchen Codeteils, wenn Zuweisungen zu einer oder mehreren Flag-Variablen erforderlich sind, wobei die Positionen solcher Zuweisungen im gesamten Algorithmus nicht einheitlich sind.
Mehrere return-Anweisungen verringern die Lesbarkeit und Einfachheit eines solchen Codeteils, wenn die return-Anweisungen nicht gleichmäßig über den Algorithmus verteilt sind und wenn sie sich gegenseitig ausschließende Codeblöcke abgrenzen, deren Größe oder Struktur untereinander nicht einheitlich sind.
Dies hängt eng mit der Komplexität eines fraglichen Codeausschnitts zusammen. Und dies hängt wiederum mit zyklomatischen und Halbstandkomplexitätsmessungen zusammen. Daraus könnte man folgendes beobachten:
Je größer eine Subroutine oder eine Funktion ist, desto größer und komplexer ist ihre interne Kontrollflussstruktur und desto größer ist die Wahrscheinlichkeit, dass Sie vor der Frage stehen, ob mehrere oder einzelne return-Anweisungen verwendet werden sollen.
Das Fazit daraus ist: Halten Sie Ihre Funktionen klein und tun Sie nur eine Sache (und tun Sie es gut). Wenn sie nominell kleine zyklomatische und Halstead-Komplexitätsmetriken aufweisen, müssen sie nicht nur höchstwahrscheinlich korrekt sein und Aufgaben ausführen, die nachvollziehbar sind, sondern ihre inneren Strukturen sind auch relativ offensichtlich.
Dann, und nur dann, können Sie ganz einfach und ohne viel Schlafverlust entscheiden, ob Sie eine einzelne Rückgabe und mehrere Rückgaben verwenden möchten, ohne das Risiko einzugehen, dass bei beiden Entscheidungen Fehler auftreten.
Man könnte all dies auch betrachten und darauf hinweisen, dass Menschen, die mit dem Problem der einfachen oder mehrfachen Rückgabe zu kämpfen haben, entweder aufgrund von Unerfahrenheit, Dummheit oder mangelnder Arbeitsmoral keinen sauberen Code schreiben und dazu neigen, diesen zu schreiben monströse Funktionen unter völliger Nichtbeachtung von zyklomatischen und halbstaatlichen Maßnahmen.