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

6voto

Matt Sheppard Punkte 113439

Meine übliche Politik ist es, nur eine Rückgabeanweisung am Ende einer Funktion zu haben, es sei denn, die Komplexität des Codes wird durch das Hinzufügen weiterer Anweisungen erheblich reduziert. Tatsächlich bin ich ein Fan von Eiffel, das die Regel "nur eine Rückgabe" durchsetzt, indem es keine Rückgabeanweisung hat (es gibt nur eine automatisch erstellte "Ergebnis"-Variable, in die das Ergebnis geschrieben wird).

Es gibt sicherlich Fälle, in denen ein Code mit Mehrfachrückgaben klarer ist als die offensichtliche Version ohne sie. Man könnte argumentieren, dass mehr Nacharbeit erforderlich ist, wenn eine Funktion zu komplex ist, um ohne mehrere Rückgabeanweisungen verständlich zu sein, aber manchmal ist es gut, bei solchen Dingen pragmatisch zu sein.

5voto

Brad Gilbert Punkte 33120

Wenn Sie mehr als ein paar Rückgaben erhalten, ist möglicherweise etwas mit Ihrem Code nicht in Ordnung. Ansonsten würde ich zustimmen, dass es manchmal schön ist, von mehreren Stellen in einem Unterprogramm zurückkehren zu können, vor allem, wenn es den Code sauberer macht.

Perl 6: Schlechtes Beispiel

sub Int_to_String( Int i ){
  given( i ){
    when 0 { return "zero" }
    when 1 { return "one" }
    when 2 { return "two" }
    when 3 { return "three" }
    when 4 { return "four" }
    ...
    default { return undef }
  }
}

sollte besser wie folgt geschrieben werden

Perl 6: Gutes Beispiel

@Int_to_String = qw{
  zero
  one
  two
  three
  four
  ...
}
sub Int_to_String( Int i ){
  return undef if i < 0;
  return undef unless i < @Int_to_String.length;
  return @Int_to_String[i]
}

Bitte beachten Sie, dass dies nur ein kurzes Beispiel ist

0 Stimmen

Ok Warum wurde das abgelehnt? Es ist ja nicht so, dass es keine Meinung ist.

5voto

Alphaneo Punkte 11361

Ich stimme für die einmalige Rückgabe am Ende als Leitlinie. Dies hilft einer Gemeinsame Codebereinigung ... Schauen Sie sich zum Beispiel den folgenden Code an ...

void ProcessMyFile (char *szFileName)
{
   FILE *fp = NULL;
   char *pbyBuffer = NULL:

   do {

      fp = fopen (szFileName, "r");

      if (NULL == fp) {

         break;
      }

      pbyBuffer = malloc (__SOME__SIZE___);

      if (NULL == pbyBuffer) {

         break;
      }

      /*** Do some processing with file ***/

   } while (0);

   if (pbyBuffer) {

      free (pbyBuffer);
   }

   if (fp) {

      fclose (fp);
   }
}

0 Stimmen

Sie stimmen für Single Return - in C-Code. Aber was wäre, wenn Sie in einer Sprache mit Garbage Collection und try..finally-Blöcken programmieren würden?

4voto

Andrew Edgecombe Punkte 37795

Dies ist wahrscheinlich eine ungewöhnliche Sichtweise, aber ich denke, dass jeder, der glaubt, dass mehrere Return-Anweisungen zu bevorzugen sind, noch nie einen Debugger auf einem Mikroprozessor benutzen musste, der nur 4 Hardware-Breakpoints unterstützt ;-)

Die Probleme mit dem "Pfeilcode" sind zwar völlig richtig, aber ein Problem, das bei der Verwendung mehrerer Rücksprunganweisungen nicht auftritt, ist die Verwendung eines Debuggers. Sie haben keine bequeme Stelle, an der Sie einen Haltepunkt setzen können, um zu gewährleisten, dass Sie den Ausgang und damit die Rückgabebedingung sehen.

5 Stimmen

Das ist nur eine andere Art der vorzeitigen Optimierung. Sie sollten nie für den Spezialfall optimieren. Wenn Sie einen bestimmten Codeabschnitt häufig debuggen müssen, stimmt mehr nicht als nur die Anzahl der Exit-Points, die er hat.

0 Stimmen

Das hängt auch von Ihrem Debugger ab.

4voto

Bubba88 Punkte 1870

Wenn es in Ordnung ist, nur eine Meinung niederzuschreiben, dann ist das meine:

Ich bin mit der "Single Return Statement"-Theorie absolut nicht einverstanden und halte sie in Bezug auf die Lesbarkeit des Codes, die Logik und die beschreibenden Aspekte für spekulativ und sogar destruktiv.

Die Angewohnheit, nur eine einzige Rückgabe zu haben, ist sogar für reine prozedurale Programmierung schlecht, ganz zu schweigen von höheren Abstraktionen (funktional, kombinatorisch usw.). Außerdem wünsche ich mir, dass der gesamte in diesem Stil geschriebene Code durch einen speziellen Rewriting-Parser läuft, damit er mehrere return statements!

Eine Funktion (wenn sie wirklich eine Funktion/Abfrage im Sinne der "Abfrage-Befehl-Trennung" ist - siehe z.B. Eiffel-Programmiersprache) MUSS einfach so viele Rückgabestellen definieren, wie sie Kontrollfluss-Szenarien hat. Das ist viel klarer und mathematisch konsistent; und es ist der Weg, um zu schreiben Funktionen (d.h. Abfragen)

Aber ich würde nicht so kämpferisch sein, wenn es um die Mutationsmeldungen geht, die Ihr Agent erhält - die Verfahrensaufrufe.

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