Ist es eine schlechte Praxis, break
Anweisungen in einer for
Schleife zu verwenden ?
Angenommen, ich suche nach einem Wert in einem Array. Vergleichen Sie innerhalb einer for-Schleife und wenn ein Wert gefunden wird, break;
um die for-Schleife zu verlassen.
Ist das eine schlechte Praxis? Ich habe die verwendete Alternative gesehen: Definieren Sie eine Variable vFound
und setzen Sie sie auf true, wenn der Wert gefunden wird, und überprüfen Sie vFound
die for
Anweisungsbedingung. Aber ist es notwendig, nur zu diesem Zweck eine neue Variable zu erstellen?
Ich frage im Kontext einer normalen C oder C ++ for Schleife.
PS: Die MISRA-Codierungsrichtlinien raten von der Verwendung von break ab.
break
in der gleichen Liga wiegoto
:)Antworten:
Viele Antworten hier, aber ich habe dies noch nicht erwähnt gesehen:
Die meisten "Gefahren", die mit der Verwendung
break
odercontinue
in einer for-Schleife verbunden sind, werden negiert, wenn Sie ordentliche, leicht lesbare Schleifen schreiben. Wenn der Hauptteil Ihrer Schleife mehrere Bildschirmlängen umfasst und mehrere verschachtelte Unterblöcke enthält, können Sie leicht vergessen, dass nach der Unterbrechung kein Code ausgeführt wird. Wenn die Schleife jedoch kurz und präzise ist, sollte der Zweck der break-Anweisung offensichtlich sein.Wenn eine Schleife zu groß wird, verwenden Sie stattdessen einen oder mehrere gut benannte Funktionsaufrufe innerhalb der Schleife. Der einzige wirkliche Grund, dies zu vermeiden, ist die Verarbeitung von Engpässen.
quelle
Nein, Pause ist die richtige Lösung.
Das Hinzufügen einer booleschen Variablen erschwert das Lesen des Codes und fügt eine potenzielle Fehlerquelle hinzu.
quelle
goto
breche ich aus verschachtelten Schleifen der Stufe 2+ aus - weil es keine gibtbreak(level)
Sie können alle Arten von professionellem Code mit 'break'-Anweisungen finden. Es ist durchaus sinnvoll, dies bei Bedarf zu verwenden. In Ihrem Fall ist diese Option besser, als eine separate Variable zu erstellen, nur um aus der Schleife herauszukommen.
quelle
Die Verwendung
break
sowiecontinue
in einerfor
Schleife ist vollkommen in Ordnung.Es vereinfacht den Code und verbessert seine Lesbarkeit.
quelle
Python (und andere Sprachen?) Erweitert die
for
Schleifenstruktur , sodass ein Teil davon nur ausgeführt wird, wenn die Schleife dies nicht tutbreak
.Ausgabe:
Äquivalenter Code ohne
break
und so praktischelse
:quelle
Es ist an sich nichts Falsches daran, eine break-Anweisung zu verwenden, aber verschachtelte Schleifen können verwirrend werden. Um die Lesbarkeit zu verbessern, unterstützen viele Sprachen ( zumindest Java ) das Aufbrechen in Labels, wodurch die Lesbarkeit erheblich verbessert wird.
Ich werde sagen, dass break (und return) -Anweisungen häufig die zyklomatische Komplexität erhöhen , was es schwieriger macht, zu beweisen, dass Code in allen Fällen das Richtige tut.
Wenn Sie eine Pause beim Durchlaufen einer Sequenz für ein bestimmtes Element in Betracht ziehen, sollten Sie die Datenstruktur, in der Ihre Daten gespeichert sind, überdenken. Die Verwendung eines Sets oder einer Karte kann zu besseren Ergebnissen führen.
quelle
for
Schleifen untersuchen.break ist eine völlig akzeptable Aussage (also weiter , übrigens). Es geht nur um die Lesbarkeit von Code - solange Sie keine überkomplizierten Schleifen und dergleichen haben, ist das in Ordnung.
Es ist nicht so, als wären sie die gleiche Liga wie goto . :) :)
quelle
Allgemeine Regel: Wenn Sie nach dem Befolgen einer Regel etwas Unangenehmeres und Schwierigeres tun müssen, als die Regel zu brechen, dann brechen Sie die Regel.
Im Falle einer Schleife, bis Sie etwas finden, stoßen Sie beim Aussteigen auf das Problem, gefunden und nicht gefunden zu unterscheiden. Das ist:
Okay, Sie können ein Flag setzen oder einen "gefundenen" Wert auf null initialisieren. Aber
Deshalb ziehe ich es im Allgemeinen vor, meine Suche in Funktionen zu verschieben:
Dies hilft auch, den Code übersichtlicher zu gestalten. In der Hauptzeile wird "find" zu einer einzelnen Anweisung, und wenn die Bedingungen komplex sind, werden sie nur einmal geschrieben.
quelle
break
, versuche ich oft , einen Weg zu finden, den Code in eine Funktion umzuwandeln, damit ich ihnreturn
stattdessen verwenden kann.Das hängt von der Sprache ab. Während Sie möglicherweise eine boolesche Variable hier überprüfen können:
Es ist nicht möglich, dies zu tun, wenn Sie über ein Array jucken:
Auf jeden Fall
break
würden beide Codes besser lesbar machen.quelle
In Ihrem Beispiel kennen Sie die Anzahl der Iterationen für die for- Schleife nicht. Warum nicht stattdessen die while- Schleife verwenden, bei der die Anzahl der Iterationen zu Beginn unbestimmt sein kann?
Es ist daher nicht erforderlich, die Unterbrechungsanweisung im Allgemeinen zu verwenden, da die Schleife besser als while- Schleife angegeben werden kann.
quelle
Ich stimme anderen zu, die die Verwendung empfehlen
break
. Die offensichtliche Folgefrage ist, warum jemand etwas anderes empfehlen würde. Nun ... wenn Sie break verwenden, überspringen Sie den Rest des Codes im Block und die verbleibenden Iterationen. Manchmal verursacht dies Fehler, zum Beispiel:Eine am oberen Rand des Blocks erfasste Ressource kann am unteren Rand freigegeben werden (dies gilt auch für Blöcke innerhalb von
for
Schleifen). Dieser Freigabeschritt kann jedoch versehentlich übersprungen werden, wenn ein "vorzeitiger" Exit durch einebreak
Anweisung verursacht wird (in "modern"). In C ++ wird "RAII" verwendet, um dies zuverlässig und ausnahmesicher zu handhaben: Grundsätzlich geben Objektzerstörer Ressourcen zuverlässig frei, unabhängig davon, wie ein Bereich beendet wird.Jemand kann den bedingten Test in der
for
Anweisung ändern, ohne zu bemerken, dass andere delokalisierte Austrittsbedingungen vorliegenIn der Antwort von ndim wird festgestellt, dass einige Benutzer möglicherweise vermeiden
break
, eine relativ konsistente Schleifenlaufzeit aufrechtzuerhalten, aber Sie haben mit derbreak
Verwendung einer booleschen Steuervariablen für den frühen Ausgang verglichen , bei der dies nicht zutrifftHin und wieder erkennen Leute, die solche Fehler beobachten, dass sie durch diese "No Breaks" -Regel verhindert / gemildert werden können ... in der Tat gibt es eine ganze verwandte Strategie für "sicherere" Programmierung, die "strukturierte Programmierung" genannt wird, bei der jede Funktion haben soll ein einziger Ein- und Ausstiegspunkt (dh kein Goto, keine vorzeitige Rückkehr). Es kann einige Fehler beseitigen, aber es führt zweifellos andere ein. Warum machen sie das?
quelle
break
. Sie haben es vermieden, aber nicht über die Bedingungen nachgedacht, die die Verwendung von Pause ersetzten.Es ist absolut gültig zu verwenden
break
- wie andere betont haben, ist es nirgends in der gleichen Liga wiegoto
.Obwohl Sie die
vFound
Variable möglicherweise verwenden möchten, wenn Sie außerhalb der Schleife prüfen möchten, ob der Wert im Array gefunden wurde. Auch unter dem Gesichtspunkt der Wartbarkeit kann es nützlich sein, ein gemeinsames Flag zu haben, das die Austrittskriterien signalisiert.quelle
Ich habe einige Analysen der Codebasis durchgeführt, an der ich gerade arbeite (40.000 Zeilen JavaScript).
Ich habe nur 22
break
Aussagen gefunden, von denen:switch
Anweisungen verwendet (wir haben insgesamt nur 3 switch-Anweisungen!).for
Schleifen verwendet - ein Code, den ich sofort als in separate Funktionen umgestaltet und durchreturn
Anweisung ersetzt klassifizierte .break
Insider-while
Schleife betrifft ... Ich bin gelaufen, umgit blame
zu sehen, wer diesen Mist geschrieben hat!Also laut meiner Statistik: Wenn
break
es außerhalb von verwendet wirdswitch
, ist es ein Code-Geruch.Ich habe auch nach
continue
Aussagen gesucht . Keine gefunden.quelle
Ich sehe keinen Grund, warum es eine schlechte Praxis wäre, vorausgesetzt, Sie möchten die STOP-Verarbeitung an diesem Punkt abschließen.
quelle
In der eingebetteten Welt gibt es viel Code, der das folgende Konstrukt verwendet:
Dies ist ein sehr allgemeines Beispiel, viele Dinge passieren hinter dem Vorhang, insbesondere Interrupts. Verwenden Sie dies nicht als Boilerplate-Code, ich versuche nur, ein Beispiel zu veranschaulichen.
Meine persönliche Meinung ist, dass es nichts Falsches ist, eine Schleife auf diese Weise zu schreiben, solange angemessen darauf geachtet wird, dass sie nicht auf unbestimmte Zeit in der Schleife bleibt.
quelle
continue
die Anwendungslogik enthält Anweisungen. Gibt es?Hängt von Ihrem Anwendungsfall ab. Es gibt Anwendungen, bei denen die Laufzeit einer for-Schleife konstant sein muss (z. B. um einige zeitliche Einschränkungen zu erfüllen oder um Ihre Dateninternalen vor zeitbasierten Angriffen zu verbergen).
In diesen Fällen ist es sogar sinnvoll, ein Flag zu setzen und den Flag-Wert erst zu überprüfen, nachdem alle
for
Schleifeniterationen tatsächlich ausgeführt wurden. Natürlich müssen alle for-Schleifeniterationen Code ausführen, der immer noch ungefähr dieselbe Zeit benötigt.Wenn Sie sich nicht für die Laufzeit interessieren ... verwenden Sie
break;
undcontinue;
, um den Code leichter lesbar zu machen.quelle
Nach den MISRA 98-Regeln, die in meinem Unternehmen in C dev verwendet werden, darf die break-Anweisung nicht verwendet werden ...
Bearbeiten: Pause ist in MISRA '04 erlaubt
quelle
Natürlich
break;
ist dies die Lösung, um die for-Schleife oder die foreach-Schleife zu stoppen. Ich habe es in PHP in foreach und for loop verwendet und festgestellt, dass es funktioniert.quelle
Ich bin nicht einverstanden!
Warum sollten Sie die integrierte Funktionalität einer for-Schleife ignorieren, um Ihre eigene zu erstellen? Sie müssen das Rad nicht neu erfinden.
Ich denke, es ist sinnvoller, Ihre Schecks so oben in Ihrer for-Schleife zu haben
oder wenn Sie die Zeile zuerst verarbeiten müssen
Auf diese Weise können Sie eine Funktion schreiben, um alles auszuführen und viel saubereren Code zu erstellen.
Oder wenn Ihr Zustand kompliziert ist, können Sie diesen Code auch verschieben!
"Professional Code", der mit Pausen durchsetzt ist, klingt für mich nicht wirklich nach professionellem Code. Es klingt nach fauler Codierung;)
quelle
break
abraten, argumentieren, dass dies der Lesbarkeit von Code dient. Schauen Sie sich jetzt noch einmal den verrückten 5 Meilen langen Zustand in den Schleifen oben an ...