'Goto' ist das schlecht?
Nachdem ich einige reseach, wie zu brechen, die durch eine sekundäre Schleife
while (true) { //Main Loop
for (int I = 0; I < 15; I++) { //Secondary loop
//Do Something
break; //Break main loop?
}
}
meisten Menschen empfohlen, rufen Sie die 'gehe zu' - Funktion
Suchen, wie im folgenden Beispiel:
while (true) { //Main Loop
for (int I = 0; I < 15; I++) { //Secondary Loop
//Do Something
goto ContinueOn; //Breaks the main loop
}
}
ContinueOn:
Jedoch; ich habe oft gehört, dass die 'goto' - Anweisung ist eine schlechte Praxis. Das Bild unten ist perfekt illustriert meinen Punkt:
So
- Wie schlimm ist die goto-Anweisung wirklich, und warum?
- gibt es eine effektivere Art und Weise zu brechen, die die main-loop als mit der 'goto' - Anweisung?
InformationsquelleAutor der Frage dotTutorials | 2012-08-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
EDIT:
Hängt es von der genauen situation. Ich kann mich nicht erinnern, jedes mal wo ich es gemacht, den code lesbarer als refactoring. Es hängt auch von Ihrer persönlichen Sicht auf die Lesbarkeit - einige Leute mögen es mehr als andere, wie aus den anderen Antworten. (Als ein Punkt des Interesses, es ist weit verbreitet in generiert code - all das async/await-code in C# 5 basiert auf effektiv eine Menge von gotos).
Das problem ist, dass Situationen, in denen
goto
eher neigen zu sein, die Art von Situationen, wo refactoring aids-Dinge, die ohnehin - in der Erwägung, dassgoto
- sticks mit einer Lösung, die schwieriger zu Folgen, als der code wird komplizierter.Absolut. Extrahieren Sie Ihre Methode in eine separate Funktion:
Ich in der Regel bevorzugen, tun dies über die Einführung eines zusätzlichen lokalen Variablen zu verfolgen "habe ich fertig" - obwohl, das wird funktionieren, natürlich.
InformationsquelleAutor der Antwort Jon Skeet
Ist es wirklich schlecht für die normalen Gründe. Es prefectly in Ordnung, wenn die Emulation beschriftet Schleifen in Sprachen, die diese nicht unterstützen.
Ersetzen Sie es mit Funktionen wird in vielen Fällen scatter-Logik, die wirklich gelesen werden sollte, da die gleiche Einheit. Dies macht es schwieriger zu Lesen.
Niemand mag es, Folgen Sie den Spuren von Funktionen, die nicht wirklich etwas, bis am Ende der Reise, wenn Sie etwas vergessen
wo aus Sie gestartet sind.
Ersetzen Sie es mit booleans und eine Reihe weiterer ifs und Pausen ist einfach wirklich klobig und macht es schwieriger zu Folgen, wahren Absichten, wie jedes Geräusch.
In java (und javascript), dies ist durchaus akzeptabel (mit Schlaufen):
In C#, es sieht aus wie eine sehr enge Entsprechung nicht:
Weil das Wort
goto
das hat einen psychologischen Effekt, dass Menschen ablegen, die alle Ihren gesunden Menschenverstand und machen Sie link xkcd unabhängig vom Kontext.In einigen Fällen gibt es nicht, weshalb die anderen Sprachen beschriftet loops und C# bietet
goto
. Beachten Sie, dass Ihr Beispiel ist zu einfach und es machtdie Workarounds nicht zu schlecht aussieht, weil Sie sind zugeschnitten auf die Beispiel. In der Tat, ich könnte genauso gut vorschlagen, diese:
Wie wäre es damit:
Tut dies immer noch gut Aussehen auf Sie:
InformationsquelleAutor der Antwort Esailija
Werde ich Stimme nicht mit all den anderen Antworten hier. Der code, den Sie präsentieren mit
goto
hat nichts falsch mit ihm. Es ist ein Grund C# hat einegoto
- Anweisung, und es ist genau für diese Arten von Szenarien, die Sie beschreiben.goto
hat einfach eine negative Stigmatisierung, weil in den 1970er Jahren und vor Menschen zu schreiben, wäre schrecklich, vollständig wartbaren code, wo Ablaufsteuerung sprang ganz über dem Platz, weil dergoto
. C#'sgoto
gar nicht erlauben, den übergang zwischen den Methoden! Aber trotzdem ist da diese irrationale stigma gegen Sie.Meiner Meinung nach, gibt es absolut nichts falsch mit der Verwendung einer "modernen"
goto
zu brechen, aus einer inneren Schleife. Die "alternativen" Menschen bieten immer am Ende wird komplizierter und schwerer zu Lesen.Methoden sind im Allgemeinen soll wiederverwendbare. Eine ganze eigene Methode für den inneren Teil einer Schleife, die immer nur mitgehen, einem Ort, wo die Implementierung der Methode können am Ende wird an einer entfernten Stelle im Quellcode, ist nicht eine Verbesserung.
Diese Art von dumme übung zu vermeiden
goto
ist im Grunde das äquivalent der politischen Korrektheit, aber in der Welt des Programmierens.InformationsquelleAutor der Antwort MgSam
Stimme ich mit der Mehrheit der Antworten darüber, wie schlecht ist springen.
Meine sugestion zu vermeiden, springen ist etwas wie dieses:
InformationsquelleAutor der Antwort Marcelo Assis
Benutze ich manchmal "springen" und ich fand es gut aussieht, wie das Beispiel oben;
Ich weiß, Sie können tun, die gleiche Sache, die rekursiv, aber who cares, es funktioniert einfach und ich verwenden.
InformationsquelleAutor der Antwort Abdurrahim
Einem Kollegen von mir (die 15 Jahre+ in der firmware-Programmierung) und ich gehe die ganze Zeit. Wir verwenden allerdings nur für den Umgang mit Ausnahmen!!!! Zum Beispiel:
Meines Wissens nach ist dies der beste Weg, um behandeln Sie Ausnahmen in C. ich glaube, ich arbeitet für C# zu. Auch bin ich nicht der einzige, der so denkt: Beispiele guter gotos in C oder C++
InformationsquelleAutor der Antwort H_squared
Gehen, die gefährlich sind, abgesehen von der Nennung einer anderen Fragen. Springen Sie den bypass-ordnungsgemäße Zusammenstellung in einigen Sprachen nehmen C# zum Beispiel, obwohl Sie keine return-Anweisungen in dieser Funktion, dies kompiliert.
InformationsquelleAutor der Antwort johnny 5
Ich persönlich halte goto als "goto" führt in die Hölle"...und in vieler Hinsicht ist dies wahr, wie es kann dazu führen, sehr wartbaren code und wirklich schlechte Praktiken.
That being said, es ist immer noch umgesetzt werden für einen Grund, und wenn verwendet, sollte es sparsam verwendet werden, wenn KEINE andere Lösung verfügbar ist. OO-Sprachen bieten sich auch nicht wirklich brauchen (viel).
Das einzige mal, das ich JEMALS sehen, es verwendet in diesen Tagen ist in der Verschleierung...ein goot Beispiel für die Verwendung von goto zu erstellen, die code aus der Hölle, damit die Leute abgeschreckt werden versuchen, es zu verstehen!
Einige Sprachen angewiesen auf entsprechende keywords. Zum Beispiel in x86-assember haben Sie keywords wie JMP (Sprung), JE (Jump if Equal) und JZ (Jump if Zero). Diese sind erforderlich, Häufig in Assembler, da gibt es kein OO auf dieser Ebene, und es gibt paar andere Methoden zum bewegen in einer Anwendung.
AFAIK...bleiben Sie Weg von es, es sei denn ABSOLUT NOTWENDIG.
InformationsquelleAutor der Antwort series0ne