Single-entry/single-exit-Regel
Habe ich gelesen, die in der Regel irgendwo:
Folgen Sie den single-entry/single-exit-Regel. Schreiben Sie niemals mehrere return-Anweisungen in derselben Funktion.
Ist diese Aussage wahr? Wenn das so ist, könnten Sie bitte geben Sie mehr Details, warum sollten wir diese Regel befolgen?
- "Ist das wahr?" Sowie Sie nicht haben, um ihm zu Folgen, die Sprache ist vollkommen glücklich, mit mehreren
return
Aussagen, und meiner Meinung nach, es ist in Ordnung, Sie zu benutzen. Das problem ist, wenn Sie haben eine Menge vonreturn
s in kompliziert verschachtelten Logik. Das kann schwierig sein, zu Folgen. Wenn die Funktion eine Mengereturn
s, die Sie wahrscheinlich benötigen, zu überarbeiten. Sie könnten auch interessiert zu wissen, dass in Fortran-Funktionen können mehrere Einstiegspunkte sowie, und die Leute tun Sie verwenden. - Ich dachte immer, die Regel ist dumm, in der coding-Regeln
- Es ist auch zu Bedenken, dass Ihre Funktionen kann die Ausfahrt über eine Ausnahme, wie gut, die Dinge komplizieren sich weiter, und es ist oft schwierig zu wissen, wo Sie kommen könnte.
- Das klingt wie etwas, was ein C-Programmierer sagen könnte. In C++, vorzeitiger Ausstieg ist ein sehr nützliches idiom.
- SESE nicht viel hinzuzufügen Wert in garbage Collection-Sprachen wie C# und Java, aber es ist eine gute übung für C und C++. Lecks oder Abstürze durch fehlende oder falsche clean-up-Logik ist ein sehr häufiger Fehler. Selbst wenn Sie makellos sind, sicherzustellen, dass jeder Ausgangspunkt in Ihren Funktionen reinigt richtig -, Wartungs-Programmierer sind viel eher zu Fehlern führen, wenn Sie fügen Sie eine zusätzliche Prüfung für die Bedingungen, die waren nicht zunächst erwartet, zeigte sich aber während der Prüfung. SESE sorgt dafür, dass es nur ein Stück code, pro-Funktion, die Griffe clean-up, und es gibt keinen Weg, um es zu umgehen.
- Ich werde nur hinzufügen, dass ich nennen würde SESE, eine 'gute Praxis', in der Regel nicht. Wenn kann eine Funktion eine Ausnahme werfen, die Sie brauchen, um es zu fangen, so dass Sie Aufräumen können, bevor erneute auslösen oder beenden in der Regel. Wenn Sie brauchen, um rethrow die Ausnahme, können Sie feststellen, dass mehrere Punkte zu beenden, jedes mit seiner eigenen Kopie des clean-up-code ist die beste option.
- Es ist eine Frage, die auf das Thema der SE-Software Engineering, mit sehr guten Antworten : Wo haben die Vorstellung von "eine Rückkehr nur" kommen?. (Ich lasse das hier, weil ich denke, es könnte helfen, Menschen auf der Suche nach Materialien zum Thema)
- Es ist falsch. das Prinzip der "single-entry-single-exit-Unterprogramm" stammt aus einer Zeit, als die Menschen versuchten, zur Förderung der "strukturierten Programmierung". C++ als Sprache, strukturiert ist. Außer für longjmp() alle Funktionen haben einen einzigen Ausgang, unabhängig davon, wie viele return-Anweisungen sind dort, weil Sie alle zurück an den gleichen Ort (die Funktionen aufrufen-site). In den 1960er Jahren war das nicht unbedingt wahr in Programme. So wurde die Zuordnung von IEC61508 der Begriff "single-exit", um eine "Rückkehr" in C++ ist falsch!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin persönlich nicht gegen zu früh verlassen, aber ich werde vorschlagen, eine Dritte alternative zu SingerOfTheFall für die Prüfung.
Vorteile:
der code
"etwas" versehentlich ausführen eines code-block
Nachteil:
in sub-Funktionen)
Dass das, was die Regel sagt, in Orten, wo es verwendet wird und durchgesetzt werden. Ist es eine gute Regel? Ich Kämpfe gegen seine Einführung zahn-und Nagelpflege. Ich denke es ist eine blöde Regel. Schlimmer als dumm: Es ist eine schädliche Regel für C++.
Ich bin einverstanden mit dem ersten Teil der Regel, "single entry". Die Fortran -
entry
- Anweisung bewirkt, dass viel mehr Probleme, als es löst. Dieser erste Teil der Regel nicht beziehen sich auf C oder C++, aus dem einfachen Grund, dass weder Sprache bietet eine multiple-entry-point-Mechanismus. "Single entry" ist eine no-op in C und C++.Also, was über "single-exit"? Die vorzeitige Rückreise muss nicht unbedingt zu Problemen führen. Andernfalls Umgang mit Ressourcen zugewiesen vor der Rückgabe ist das, was Probleme verursacht. Die richtige Regel ist, "clean up your mess", oder " don ' T leave baumeln Ressourcen. Eine Ausfahrt nicht dieses problem lösen, weil es nicht sagen, eine Sache zu bereinigen Ihre Durcheinander.
In C, die single-entry /single-exit-Regel, die in der Regel hand in hand geht mit erlaubt (und sogar ermutigt) die Verwendung von
goto
für die Fehlerbehandlung. Ich kann sehen, dass der Platz fürgoto
wie für die Fehlerbehandlung in den Linux-kernel-code. Aber nicht in C++. Dies ist der Grund, warum ich schrieb, dass single-entry /single-exit wird schädlich in C++. Diese Regel vermeidet die Verwendung von RAII und exception-sicher Programmieren, und ermutigt die Verwendung vongoto
.Nein, das ist nicht die Regel, und manchmal ist es auch schwer/unmöglich zu erreichen. Der code einer entry-und eine exit-Punkt ist einfacher zu verstehen und zu Debuggen obwohl. Vergleichen Sie dies:
und so:
Jetzt haben wir nur einen exit-Punkt, und (unter Berücksichtigung der Variablen-name auch), es ist viel einfacher zu verstehen, was die Funktion tut. Sie können auch einen breakpoint auf die Letzte zurück und wissen, dass dies ist der Punkt, wo die Funktion endet, und, dass Sie definitiv schlagen.
errorCode
vielleicht nicht die beste, da möchten Sie vielleicht, um tatsächlich zu stoppen, Ausführung rechts, wo der Fehler Auftritt, aber ich hoffe, Sie bekommen die Idee.Dieser Regel kann gelten in C, aber es kann als obsolet werden in C++ wegen der Ausnahmen. Sobald Sie Ihre Funktion löst eine exception aus oder ruft eine Funktion, die werfen können, haben Sie eine zusätzliche exit-Punkt:
Neben dem Punkt, auf den in anderen Antworten: diese Regel beabsichtigt, um den code leichter zu Folgen, aber es ist leicht, Beispiele zu finden, wo das ist nicht wahr. Viel besser:
als:
Und dann haben Sie auch dann der Fall, wenn Sie sich entscheiden, den Rückgabewert in einer
switch
:statt:
Auch mehrere Ausgänge sein könnte, einige performance-Problem: wenn der Prozessor führt den aktuellen Befehl an der gleichen clock tick it-Prozesse einige weiter Befehle und führt einige Operationen mit Ihnen. Also, wenn Ihr code hat mehrere Ausgänge, so:
und erste Bedingung wahr ist, wird die Extraktion von
DoSomething()
Befehl wird nutzlos sein.Tatsächlich, mit der branch prediction ist es noch in Ordnung sein kann, aber trotzdem ist es besser, halten diese Sache im Auge.
Können Sie speichern Ihren Rückgabewert in einer Variablen, wenn Sie wollen, um dies zu erreichen, aber es ist nicht wahr. Sie können mehrere gibt in der gleichen Funktion ohne Probleme.