779 Stimmen

Sollte eine Funktion nur eine Rückgabeanweisung haben?

Gibt es gute Gründe, warum es besser ist, nur eine Rückgabeanweisung in einer Funktion zu haben?

Oder ist es in Ordnung, aus einer Funktion zurückzukehren, sobald dies logisch korrekt ist, d.h. es kann viele Return-Anweisungen in der Funktion geben?

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

4voto

hazzen Punkte 16604

Je mehr Rückgabeanweisungen in einer Funktion enthalten sind, desto komplexer ist diese eine Methode. Wenn Sie sich fragen, ob Sie zu viele Rückgabeanweisungen haben, sollten Sie sich fragen, ob Sie zu viele Codezeilen in dieser Funktion haben.

Gegen eine/mehrere Rückmeldungen ist jedoch nichts einzuwenden. In einigen Sprachen ist dies eine bessere Praxis (C++) als in anderen (C).

3voto

Dinah Punkte 50664

Mehrere Exit-Points zu haben, ist im Wesentlichen dasselbe wie die Verwendung eines GOTO . Ob das etwas Schlechtes ist, hängt davon ab, was man von Raubvögeln hält oder nicht.

20 Stimmen

Ich stimme nicht mit Ihnen überein, dass Mehrfachrückgaben dasselbe sind wie Gotos. Leider geben Sie keine Gründe für Ihre Ansicht an. Der Rest Ihres Beitrags ist einfach nur Schuld durch Assoziation.

9 Stimmen

Eine while-Schleife ist auch "im Wesentlichen das Gleiche wie ein goto" - das bedeutet aber nicht, dass sie die gleichen Nachteile hat.

5 Stimmen

"im Wesentlichen das Gleiche wie die Verwendung eines GOTO" - eine sehr, sehr ungenaue Meinung. Warum nicht sagen: "Die Verwendung von switch-case ist dasselbe wie die Verwendung einer Reihe von GOTOs" - Sie wissen schon, break; GOTO End;

3voto

JosephStyons Punkte 55410

Es macht keinen Sinn, immer erfordern einen einzigen Rückgabetyp. Ich denke, es ist eher ein Hinweis darauf, dass etwas vereinfacht werden muss. Manchmal ist es notwendig, mehrere Rückgaben zu haben, aber oft kann man die Dinge einfacher halten, indem man zumindest Versuch eine einzige Ausstiegsstelle zu haben.

3voto

martinus Punkte 17248

Die einzige wichtige Frage ist: "Wie wird der Code einfacher, besser lesbar, leichter verständlich?" Wenn es mit Mehrfachrückgaben einfacher ist, dann verwenden Sie sie.

2 Stimmen

Leider liegt die "Verständlichkeit" im Auge des Betrachters.

2voto

TMN Punkte 3032

Nun, vielleicht bin ich einer der wenigen hier, die alt genug sind, um sich an einen der Hauptgründe zu erinnern, warum "nur eine Rückgabeanweisung" so stark gefordert wurde. Es geht darum, dass der Compiler effizienteren Code ausgeben kann. Bei jedem Funktionsaufruf schiebt der Compiler normalerweise einige Register auf den Stack, um ihre Werte zu erhalten. Auf diese Weise kann die Funktion diese Register als Zwischenspeicher verwenden. Wenn die Funktion zurückkehrt, müssen diese gespeicherten Register vom Stack wieder in die Register zurückgeschoben werden. Das ist eine POP (oder MOV -(SP),Rn) Anweisung pro Register. Wenn Sie eine Reihe von Rückgabeanweisungen haben, muss entweder jede einzelne alle Register zurückholen (was den kompilierten Code vergrößert) oder der Compiler muss verfolgen, welche Register geändert wurden und nur diese zurückholen (was die Codegröße verringert, aber die Kompilierungszeit erhöht).

Ein Grund, warum es auch heute noch sinnvoll ist, mit einer einzigen Rückgabeanweisung auszukommen, ist die einfache automatisierte Umstrukturierung. Wenn Ihre IDE das Refactoring durch Methodenextraktion (Auswahl einer Reihe von Zeilen und Umwandlung in eine Methode) unterstützt, ist es sehr schwierig, dies zu tun, wenn die Zeilen, die Sie extrahieren möchten, eine Return-Anweisung enthalten, insbesondere wenn Sie einen Wert zurückgeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X