GoTo-Anweisungen und alternativen VB.NET
Habe ich geschrieben ein code-snippet, das auf einem anderen forum um Hilfe zu bitten und die Leute mich darauf hingewiesen, dass die Verwendung GoTo
Aussagen ist sehr schlechter Programmierstil. Ich Frage mich: warum ist es schlecht?
Welche alternativen zu GoTo
gibt es für den Einsatz in VB.NET das wäre in der Regel mehr als eine bessere Praxis?
Betrachten Sie dieses snippet unten, wo der Benutzer zur Eingabe Ihrer Geburtsdatum. Wenn die Monat/Datum/Jahr ungültig sind oder unrealistisch, würde ich mag, um eine Schleife zurück und bitten Sie den Benutzer wieder. (Ich bin mit if-Anweisungen zum überprüfen der integer der Größe... ob es einen besseren Weg, dies zu tun, würde ich es begrüßen, wenn Sie mir sagen könnten das auch :D)
retryday:
Console.WriteLine("Please enter the day you were born : ")
day = Console.ReadLine
If day > 31 Or day < 1 Then
Console.WriteLine("Please enter a valid day")
GoTo retryday
End If
InformationsquelleAutor qais | 2010-04-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werde ich Verschieden von allen anderen und sagen, dass GOTOs selbst sind nicht die bösen. Das böse kommt aus dem Mißbrauch von GOTO.
Im Allgemeinen, es gibt fast immer bessere Lösungen als die Verwendung eines "GOTO", aber es gibt wirklich Zeiten, wenn GOTO ist der richtige Weg, es zu tun.
That being said, Sie sind ein Anfänger, so sollte man sich nicht richten darf, wenn SPRINGEN die richtige ist oder nicht (weil es kaum jemals ist) für ein paar weitere Jahre.
Ich würde schreiben Sie Ihren code wie folgt (meine VB ist ein wenig eingerostet...):
Wenn Sie Ihre GOTO-code und schauen Sie, wie jemand den ersten Ansatz, Ihren code? "Hmm.. retryday? Was bedeutet das? Wann wird dies geschehen? Ach so, wir springen, dass das label, wenn der Tag ist außerhalb des gültigen Bereichs. Ok, so wollen wir die Schleife bis das Datum wird als gültig und in Reichweite".
In der Erwägung, dass, wenn Sie bei mir Aussehen:
"Oh, wir wollen das auch weiterhin tun, bis es Gültig ist. Es ist nur gültig, wenn das Datum innerhalb der Reichweite."
um Gottes Willen, verwenden Sie nicht springen, um zu vermeiden, mit einer return-Anweisung. Das würde die Qualifikation zum bösen verwenden von goto. Das Prinzip hier ist einfach: wenn ein "goto" aufgetreten ist, hat der Leser zu Folgen, die springen, um zu wissen, was Los ist. Wenn explizit zu konstruieren, wie die Rückkehr gesehen wird, wird der Leser sofort weiß genau, was Los ist. Und weiß, dass die coder nicht als potenziell blöd. Außerdem, was beginnt, wie eine triviale Verwendung von goto kann weniger offensichtlich, als eine Methode Hinzugefügt, um im Laufe der Zeit.
re C# vs VB.NET: C#, seit Tag 1, hat eine Entsprechung zu jedem flow-control-Konstrukt, VB.NET hat. Auch springen ist NIE notwendig, in beiden Sprachen. Faktor eine Methode (auch wenn man nur von einem Ort) und verwenden gibt. Verwenden Sie Während/Until-Schleife mit einen booleschen flag.
Was redest du da? Sind Sie sicher, dass Sie die Beantwortung meiner kleinen Kommentar?
Sie scheinen zu implizieren, dass die Verwendung
return
Aussagen wie flow-control-statements ist okay. Doch, meiner Meinung nach, dass man durchaus als böse Verwendung vonreturn
, macht den code schwer zu Lesen und die Methode erhöht die Komplexität.InformationsquelleAutor Earlz
http://xkcd.com/292/
ich denke, das ist die standard Meinung von Goto.
stattdessen versuchen Sie und verwenden Sie eine do-while-Schleife. do-while-Schleifen wird immer einmal ausgeführt und sind groß, wenn Sie brauchen, um propmt die Benutzer, aber stellen Sie sicher, dass Sie die korrekten Informationen eingeben.
Ich habe ein int, weil ich war nicht sicher, ob VB hatte eine Boolesche Klasse. Ich erklärte gültig = 0, denn man sollte immer sicherstellen, dass Variablen werden explizit deklariert werden, bevor Sie auf Sie.
InformationsquelleAutor Andy
Den
GOTO
Konstrukt erzeugt sphagetti-code. Dies macht die Führung durch code fast unmöglich.Prozedurale /Funktionale Programmierung ist ein viel besserer Ansatz.
oder neigt. das ist auch gut so
InformationsquelleAutor Raj More
Fragen über die Vorzüge des
GoTo
- Anweisung (oder eher das fehlen davon) sind Dauerbrenner auf dieser Seite. Klicken Sie hier für ein Beispiel: GoTo noch schädlich?Hinsichtlich einer alternative zu
GoTo
im snippet zur Verfügung gestellt, einwhile
loop wäre nett den trick tun, vielleicht so etwas wie:InformationsquelleAutor mjv
GOTOs sind ein ziemlich politisches Thema. Die 'Lösung' GOTOs ist die Verwendung von anderen built-in navigation Konstrukte wie Funktionen, Methoden, Schleifen, etc. Für VB, könnten Sie eine sub-Prozedur, die ausgeführt wird, dass code, oder legen Sie es in eine While-Schleife. Sie können google diese beiden Themen relativ leicht.
InformationsquelleAutor brydgesk
Ein wenig klobig, aber:
Berücksichtigen Sie auch einige grundlegende loops "goto land"
Hier ist die schöne äquivalent:
Welche ist besser lesbar und weniger Fehler-anfällig?
InformationsquelleAutor Jeremy
Verwendung von goto wurde als eine schlechte Praxis seit Jahrzehnten. Vielleicht war es eine Gegenreaktion gegen die original-BASIC (vor Visual Basic). In der original-BASIC es wurden keine while-Schleifen, keine lokalen Variablen (nur globals), und (in den meisten BASIC-Versionen) Funktionen können keine Parameter oder Rückgabewerte. Darüber hinaus Funktionen wurden nicht explizit getrennt; die Kontrolle kann implizit fiel von einer Funktion zur anderen wechseln, wenn Sie vergessen haben, eine RETURN-Anweisung. Schließlich, code-Einrückung war ein Fremdwort in diesen frühen Grundlagen.
Wenn Sie die original-BASIC für eine gewisse Zeit (wie ich), würden Sie kommen, um zu schätzen, wie die Verwendung von globalen Variablen und gotos macht überall dort ein großes Programm schwer zu verstehen, und ohne große Pflege, verwandelte Sie in einem Wirren Durcheinander von "spaghetti". Als ich erfuhr, QBASIC, mit seinen, WÄHREND Sie..WEND-Schleifen und SUBs, ich sah noch nie zurück.
Ich glaube nicht, dass gotos verletzt in kleinen Mengen, aber in der coder-Kultur ein starkes Gefühl zurückbleibt, dass Sie irgendwie böse ist. Ich möchte deshalb vermeiden Sie gotos aus keinem anderen Grund als zu beleidigen empfinden. Gelegentlich finde ich, dass ein goto löst ein problem, das sauber (wie das Aufbrechen aus einer äußeren Schleife, der innerhalb einer inneren Schleife), aber man sollte überlegen, ob eine andere Lösung macht den code besser lesbar (z.B. setzen der äußeren Schleife in eine eigene Funktion, und verwenden Sie "beenden-Funktion" anstelle von "goto", in der inneren Schleife).
Schrieb ich ein C++ - Programm mit vielleicht 100.000 Zeilen code und ich habe mit goto 30 mal. Inzwischen sind es mehr als 1000 "normale" Schleifen und rund 10 000 ", wenn" Aussagen.
InformationsquelleAutor Qwertie
Funktionen FTW!!!
Okay, ich bin mir nicht sicher, ob dein code wirklich ist VB.Net hier, da hast du noch ein paar wonky Art Dinge (d.h.
Console.Readline
gibt eineString
, nicht eine Zahl, die Sie tun können, Vergleiche auf)... also werden wir einfach vergessen, geben Sie für den moment.Getrennt und
Oder Sie können Spaß haben mit Rekursion und früh-return syntax! 😉
InformationsquelleAutor Jeff Bridgman
break
undcontinue
sind nur mehr bestimmte Versionen von GOTO 🙂Entschuldigungen wenn das war ein Versuch, humor; ich nehme Ihren Kommentar wörtlich: Der ganze Sinn von Konstrukten wie "Pause" und "weiter" ist, dass Sie gut definierte, bekannte-zu-werden-sicher-und-verstanden-Sprünge. In der Erwägung, dass, wenn ein springen festgestellt wird, wird die person Lesen muss manuell überprüfen, dass die coder nicht etwas dummes zu tun. Außerdem, wenn Sie sehen, "springen" Sie nicht wissen, die GRUND für die Niederlassung: was ist das schon? In der Erwägung, dass, wenn Sie sehen, "break" oder "continue", wissen Sie sofort, was es tut, und warum.
InformationsquelleAutor Andrey
Können Sie tun fast alles, was Sie tun können, mit
GOTO
s mit einfachen integrierten Konstrukte wie Entscheidungsstrukturen und Schleifen, undGOTO
Aussagen oft chaotisch, unmöglich, zu verstehen, spaghetti-code. Schleifen und ifs und so eine klare, akzeptierte, verständliche Nutzung.Sehen, da ist in der Regel vorgeschlagen, Dijkstra Go-To Statement Considered Harmful
InformationsquelleAutor froadie
Es wird oft empfohlen, dass wir die Folgen des Dijkstra-Beratung im Go-To Statement considered harmful.
Donald Knuth, antwortete Dijkstra ziemlich solide. Dieses Beispiel hier ist eine moderne version eines seiner Gegenbeispiele. Ich persönlich Schreibe Endlosschleifen mit internen Pausen, wenn ich zu stoßen, diesen einen, aber es gibt ein paar seltene Fälle, wo ich schreiben GOTO-Anweisungen.
Die häufigsten diejenigen, die für mich sind, bricht aus tief verschachtelten Schleifen und diesem Muster:
Ich habe auch zwei Fälle von großen finite-state-machines mit goto-Anweisungen die Bereitstellung der übergänge.
"hier" in "hier das Beispiel" bezieht sich auf das Beispiel in der Frage.
InformationsquelleAutor Joshua
Werfe ich mir, obwohl 'durch das Buch' Wölfe outhere wird downvote.
Haben Sie einen Blick auf : Ist es überhaupt vorteilhaft für die Verwendung von 'goto' in einer Sprache, die unterstützt, dass Schleifen und Funktionen? Wenn ja, warum?
InformationsquelleAutor lauCosma
Ich Stimme mit allen anderen hier: SPRINGEN an sich ist nicht böse, aber missbrauchen es wird sicherlich machen Ihnen das Leben Elend. Es gibt so viele andere Kontrollstrukturen zu wählen, und eine gut geschriebene Programm kann in der Regel behandeln die meisten jeder situation, ohne zu springen. Das sagte, ich bin in der Nähe-completion point eines Programms, das die Regale bis über 15.000 Zeilen, und ich habe eine, und nur eine GOTO-Anweisung (die ich vielleicht einbauen werden wir sehen). Es ist das erste mal, das ich verwendet habe, SPRINGEN in den letzten Dutzend oder so Programme, die ich behandelt haben. Aber in diesem Fall ist es losgeworden, einen compiler Fehler (mit Mir.Close () - zweimal innerhalb der gleichen Sub aber in anderen, Wenn Strukturen; ich konnte mich unterdrückt haben, aber ich einfach warf in einem label und ersetzt Mich.Close () - mit einem GoTo CloseLabel). Wenn ich anfange, in weitere Instanzen, die von Mir verlangen.Close() innerhalb dieser Sub, ich bin wahrscheinlich zu Mir setzen.Close() in einem eigenen Untermenü und rufen Sie einfach, dass der sub aus der Wenn-Strukturen oder andere loops, die zu einem schließen des Programms... Wie gesagt, es gibt alternativen, aber manchmal, und wenn nur sehr selten verwendet, sehr sparsam und strategisch, GoTo kann noch hilfreich sein. Nur Hüte dich von spaghetti-code, das ist ein blinkendes Durcheinander lol
InformationsquelleAutor Michael Tant
Dein code ist in Ordnung. Es ist prägnant und klar. Es ist besser als das aufblasen des Auftrags 50% bis 200% mit zusätzlichen Variablen und verschiedene Verben, die das gleiche tun.
Wenn Sie nur überspringen rückwärts oder vorwärts an den Anfang oder das Ende eines logischen Blocks, dann gehen Sie(zu). Eine "Schleife" oder ein "End while" ist immer noch ein springen, aber das Ziel ist implizit. Der einzige Vorteil ist, dass der compiler daran zu hindern, Sie machen zwei Schleifen, kreuzen sich die Wege, aber man kann es nicht mit ein paar gotos. Bei der Verwendung von goto 's, don' T cross the streams. Das wäre schlecht. -- Dr. Spengler
Meine anderen Hauptärgernis ist das "ein Eingang, ein Ausgang" - Regel. Natürlich kann man auch nur einen Eingang, es sei denn, Sie schreiben in assembler. Aber der "man-exit" - Regel ist dumm. Es führt nur zu einer Reihe von geschachtelten Grenzen überprüft, die Spaziergänge Ihren code aus dem rechten Rand. Es ist viel mehr klar, testen Sie Ihre Parameter an den Anfang der routine und "exit sub", wenn Sie illegal sind. Was macht mehr Sinn?
oder?
Wenn Sie haben sechs bounds-checks und "Zeug" ist 60 Zeilen, Sie können nicht brechen in kleinere bits, dann der zweite Weg verwandelt sich in einen Alptraum für alle, die es aufrecht zu erhalten. Es ist besser zu beenden, was Sie Taten-die überprüfung der Ausnahmen-als zu verzögern, alle exception-handling zu Ende.
Meine $0,02
Die ich in der Regel Folgen für die Ausfahrten ist: "Vermeiden Sie die Verwendung
return
zwischen die erste und die Letzte Anweisung in einer Funktion, die Nebenwirkungen".Ich auch minus 1 würde die Antwort. Dies ist das erste mal habe ich jemals eine Antwort verdient, die Härte von -1. Dies ist definitiv NICHT eine der Handvoll Situationen, in denen ein GOTO ist vertretbar. Am Anfang Programmierer wäre besser dran, wenn Sie gelernt haben, zu verwenden Sie NIE springen, so dass Sie gezwungen waren, zu verstehen, wie man umgestalten von code, so dass es leicht ist zu verstehen. Nur dann, nach zwei oder drei Jahren von Programmieren, sollten Sie prüfen, mit einem goto. HINWEIS: Auf der anderen Seite habe ich 100% Stimmen zu, dass "one exit" ist eine irrsinnige Regel, führt zu unnötigen Komplikationen in der optimierte code.
Nur weil Sie schon von Edsger Dijkstra " GoTo considered harmful Artikel bedeutet nicht, dass jede Verwendung von goto ist böse. Werfen Sie einen Blick auf stackoverflow.com/questions/24451/..., und wir werden darüber reden. Ich habe genug gehört "springen ist eine schlechte Praxis'.
+1 für das Ausdrücken Ihrer Meinung und nicht Lesen wie eine 'Maschine'
InformationsquelleAutor Ron