Ist es in Ordnung, aus verschachtelten Schleifen auszubrechen?

8

JavaScript unterstützt eine gotoähnliche Syntax zum Aufbrechen von verschachtelten Schleifen. Es ist im Allgemeinen keine großartige Idee, aber es wird als akzeptable Praxis angesehen. C # unterstützt nicht direkt die break labelName Syntax ... aber es unterstützt die berüchtigte goto .

Ich glaube, dass das Äquivalent in C # erreicht werden kann:

%Vor%

Nach der gleichen Logik von JavaScript ist das Szenario mit verschachtelten Schleifen eine akzeptable Verwendung von goto ? Ansonsten ist die einzige Möglichkeit, die ich kenne, um diese Funktionalität zu erreichen, darin zu bestehen, ein bool mit einem geeigneten Bereich zu setzen.

    
P.Brian.Mackey 24.10.2011, 21:53
quelle

9 Antworten

26

Meine Meinung: Komplexe Code-Flows mit verschachtelten Schleifen sind schwer zu verstehen; Verzweigen, ob es mit Goto oder Pause ist, macht es nur schwieriger. Anstatt den goto zu schreiben, würde ich zuerst ernsthaft darüber nachdenken, ob es einen Weg gibt, die verschachtelten Schleifen zu eliminieren.

Ein paar nützliche Techniken:

Erste Technik: Refactor die innere Schleife zu einer Methode. Lassen Sie die Methode zurückgeben, ob Sie aus der äußeren Schleife ausbrechen oder nicht. Also:

%Vor%

wird

%Vor%

Zweite Technik: Wenn die Schleifen keine Nebenwirkungen haben, verwenden Sie LINQ.

%Vor%

stattdessen, schreiben Sie:

%Vor%

Keine Schleifen, daher ist kein Ausbrechen erforderlich.

Alternativ können Sie, wie der Konfigurator in einem Kommentar angibt, den Code in folgender Form schreiben:

%Vor%

Die Moral der Geschichte: Schleifen betonen den Kontrollfluss auf Kosten der Geschäftslogik . Statt zu versuchen, mehr und mehr komplexe Steuerungsabläufe übereinander zu stapeln, versuchen Sie, den Code zu refaktorieren, damit die Geschäftslogik klar ist.

    
Eric Lippert 24.10.2011, 22:03
quelle
12

Ich persönlich würde versuchen zu vermeiden, goto hier zu verwenden, indem Sie einfach die Schleife in eine andere Methode setzen - während Sie nicht leicht aus einer bestimmten Ebene der Schleife ausbrechen können, können Sie leicht Rückkehr von einer Methode jederzeit.

Nach meiner Erfahrung hat dieser Ansatz im Allgemeinen zu einem einfacheren und besser lesbaren Code mit kürzeren Methoden geführt (im Allgemeinen bei einer bestimmten Aufgabe).

    
Jon Skeet 24.10.2011 21:57
quelle
10

Lassen Sie uns eines klarstellen: Es gibt nichts grundsätzlich Falsches an der goto -Anweisung, es ist nicht böse - es ist nur ein weiteres Werkzeug in der Toolbox. Es ist wie Sie es verwenden , das wirklich wichtig ist, und es wird leicht missbraucht.

Das Ausbrechen einer verschachtelten Schleife einer Beschreibung kann eine gültige Verwendung der Anweisung sein, obwohl Sie zuerst nachsehen sollten, ob sie neu entworfen werden kann. Können die Exits für den Loop-Exit neu geschrieben werden? Verwenden Sie die geeignete Art von Schleife? Können Sie die Liste der Daten filtern, die Sie durchlaufen, so dass Sie nicht vorzeitig beenden müssen? Sollten Sie einen Schleifencode in eine separate Funktion umwandeln?

    
slugster 24.10.2011 21:57
quelle
4

IMO ist akzeptabel in Sprachen, die break n; nicht unterstützen, wobei n die Anzahl der Schleifen angibt, die es ausbrechen soll.
Zumindest ist es viel lesbarer als das Setzen einer Variablen, die dann in der äußeren Schleife überprüft wird.

    
ThiefMaster 24.10.2011 21:54
quelle
2

Ich glaube, das "Goto" ist in dieser Situation akzeptabel. C # unterstützt leider keine raffinierten Möglichkeiten, um aus verschachtelten Loops auszubrechen.

    
tier1 24.10.2011 21:55
quelle
2

In C # ist das ein wenig inakzeptabel. Wenn dein Design es nicht vermeiden kann, dann musst du es benutzen. Aber erschöpfen Sie alle anderen Alternativen zuerst. Es wird für bessere Lesbarkeit und Wartbarkeit sorgen. Für Ihr Beispiel habe ich ein solches potenzielles Refactoring erstellt:

%Vor%     
Jesse C. Slicer 24.10.2011 22:02
quelle
0

In C # nicht akzeptabel.

Wickeln Sie die Schleife einfach in eine Funktion und verwenden Sie return .

BEARBEITEN: Bei SO wird das Abwählen für falsche Antworten verwendet und nicht für Antworten, mit denen Sie nicht einverstanden sind. Da das OP ausdrücklich gefragt hat, "ist es akzeptabel?", Ist die Antwort "inakzeptabel" nicht inkorrekt (obwohl Sie dem widersprechen könnten).

    
Sjoerd 24.10.2011 21:56
quelle
0
%Vor%     
rare 25.10.2011 00:48
quelle
0

Ich empfehle, continue zu verwenden, wenn Sie dieses eine Element überspringen möchten, und break , wenn Sie die Schleife beenden möchten. Für tiefer verschachtelt setzen Sie es in eine Methode und verwenden return . Ich persönlich würde lieber einen Status bool als ein goto verwenden. Verwenden Sie stattdessen goto als letztes Mittel.

    
Gerhard Powell 24.10.2011 22:08
quelle

Tags und Links