Wann ist es OK, um die Verwendung der GoTo-Anweisung in VB.Net?
Habe ich Prozess, Bedürfnisse zu schaffen, eine Reihe von Datensätzen in der Datenbank und alles rückgängig zu machen, wenn etwas schief geht. Was ich tun will, ist dies:
Public Structure Result
Public Success as Boolean
Public Message as String
End Structure
Private _Repository as IEntityRepository
Public Function SaveOrganization( _
ByVal organization As rv_o_Organization) As Result
Dim result = Result.Empty
_Repository.Connection.Open()
_Repository.Transaction = _Repository.Connection.BeginTransaction()
''//Performs validation then saves it to the database
''//using the current transaction
result = SaveMasterOrganization(organization.MasterOrganization)
If (Not result.Success) Then
GoTo somethingBadHappenedButNotAnException
End If
''//Performs validation then saves it to the database
''//using the current transaction
result = SaveOrganziation(dbOrg, organization)
If (Not result.Success) Then GoTo somethingBadHappenedButNotAnException
somethingBadHappenedButNotAnException:
_Repository.Transaction.Commit()
_Repository.Connection.Close()
Return result
End Sub
Ist dies ein ok Verwendung der GoTo-Anweisung, oder einfach nur wirklich schlechtes design? Gibt es eine elegantere Lösung? Hoffentlich ist dieses Beispiel in der Lage ist, den Punkt über
wenn Sie einen Apostroph am Ende Ihrer Kommentare (damit Sie als strings behandelt) dann werden Sie rot hervorgehoben werden und der code wird leichter zu Lesen sein 🙂
Ich glaube nicht, dass Sie Gaben eine besonders nützliche Verwendung der GOTO-Anweisung. Ich halte mit GOTOs für diese triviale Ablaufsteuerung schlechte Praxis, wie Sie sein sollte-mit einer Methode, zu binden und schließen Sie die Repo.
dann haben Sie zu befürchten, Apostrophe sich in den Kommentaren und Sie werden hervorgehoben, wie string-Literale eher als Kommentare. Viel einfacher zu verwenden, eine zusätzliche '// an der front: dann wird es behandelt wie ein Kommentar und es kümmert sich nicht darum, einen zusätzlichen Apostroph.
Ich glaube nicht, dass Sie Gaben eine besonders nützliche Verwendung der GOTO-Anweisung. Ich halte mit GOTOs für diese triviale Ablaufsteuerung schlechte Praxis, wie Sie sein sollte-mit einer Methode, zu binden und schließen Sie die Repo.
dann haben Sie zu befürchten, Apostrophe sich in den Kommentaren und Sie werden hervorgehoben, wie string-Literale eher als Kommentare. Viel einfacher zu verwenden, eine zusätzliche '// an der front: dann wird es behandelt wie ein Kommentar und es kümmert sich nicht darum, einen zusätzlichen Apostroph.
InformationsquelleAutor Micah | 2009-02-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie Fragen haben, tun Sie es nicht.
Für Ihre spezifischen code, man könnte es so machen:
Gimmee eine minute: ich war die Formatierung der code ist lesbar 😉
Ich würde mit dieser Aussage Zustimmen.
danke!!! I ' TS war einer dieser Tage!!
Einig über die Notwendigkeit für try/finally oder using. Ein Schritt zu einer Zeit.
InformationsquelleAutor Joel Coehoorn
Wirklich schlechtes design. Ja.
InformationsquelleAutor Jason Punyon
Goto hat einen so schlechten Ruf, dass andere Entwickler sofort denken schlecht von deinem code. Sogar, wenn Sie nachweisen können, dass die Verwendung von goto war das beste design Wahl - Sie müssen erklären und nochmals wer sieht dein code.
Wegen Ihres eigenen Ruf, nur tun Sie es nicht.
InformationsquelleAutor Jon B
Möglicherweise gibt es einige extreme Grenzfälle, wo es anwendbar ist, aber fast eindeutig, Nein, verwenden Sie es nicht.
In diesem speziellen Fall, sollten Sie mit Hilfe der Using-Anweisung zu behandeln, dies in einer besseren Art und Weise. In der Regel erstellen Sie eine Klasse, die IDisposable implementieren würden (oder verwenden Sie eine, die schon funktioniert) und dann handle-Bereinigung in der Dispose-Methode. In diesem Fall würde das schließen der Verbindung zur Datenbank (anscheinend, es ist wieder eröffnet aus deinem design).
Also, ich würde vorschlagen, mit der TransactionScope-Klasse auch hier können Sie verwenden, um den Umfang Ihrer Transaktion, und dann Begehen Sie, sowie auto-Abbruch in das Gesicht von Ausnahmen.
InformationsquelleAutor casperOne
Das einzige mal, sollten Sie eine "goto", wenn es keine andere alternative gibt.
Der einzige Weg, um herauszufinden, ob es gibt keine anderen alternativen ist, Sie alle versuchen.
In Ihrem speziellen Beispiel, sollten Sie Verwendung von try...finally-statt, wie hier (sorry, ich kenne nur C#)
... das ist der springende Punkt. Wenn etwas schlechtes passiert, die Sie nicht ausführen wollen, mehr Zeug.
Früh beendet werden just fine. Viele Male Sie können den code viel einfacher zu verstehen.
InformationsquelleAutor Orion Edwards
Ich würde sagen, extrem sparsam. Immer, wenn ich gehabt haben, denken über die Verwendung einer GOTO-Anweisung versuche ich und Umgestaltung des Codes. Die einzige Ausnahme, die ich denken kann war in vb mit der Anweisung On Error Goto.
InformationsquelleAutor kemiller2002
Es ist nichts falsch mit goto, aber das ist nicht sehr ideal nutzen. Ich denke, Sie sind zu fein einen Punkt auf die definition einer Ausnahme.
Nur werfen eine benutzerdefinierte Ausnahme und stellen Sie Ihre rollback-code in es. Ich würde davon ausgehen, Sie würde auch wollen, rollback-jedenfalls, wenn eine ECHTE Ausnahme aufgetreten, so bekommen Sie das doppelte Pflicht, aus der es auch.
InformationsquelleAutor JohnFx
Gotos sind einfach eine Implementierung detail. Ein try/catch ist, ist wie ein goto (inter-stack-goto!) Eine while-Schleife (oder jedes Konstrukt) geschrieben werden kann mit gotos, wenn Sie wollen. Pause und frühen return-Anweisungen sind die Dünn verkleidete gotos von Ihnen allen-Sie sind krass(und einige Leute mögen Sie wegen der ähnlichkeit)
Also technisch gibt es nichts wirklich FALSCH mit Ihnen, aber Sie machen für schwieriger code. Wenn Sie die looping-Strukturen, Sie sind gebunden an den Bereich Ihrer Zahnspange. Es gibt keine Fragen, wo Sie eigentlich Los, mit der Suche oder criss-crossing.
Obendrein, Sie haben einen WIRKLICH SCHLECHTEN Ruf. Wenn Sie sich entscheiden, einen zu verwenden, selbst in der besten der möglichen Fälle, die Sie haben zu verteidigen Sie Ihre Entscheidung gegen alle, die jemals liest der code-und viele von jenen Menschen, die Sie verteidigen werden gegen haben nicht die Möglichkeit, um das Urteil selbst nennen, so bist du aufm schlechten code um.
One-Lösung für Ihren Fall sein könnte, auf die Tatsache, dass eine vorzeitige Rückgabe ist die gleiche wie goto (ps. Schlimmsten psuedocode immer):
Ich denke, dieses Muster funktioniert in VB, aber ich habe nicht verwendet es seit VB 3 (um die Zeit von MS gekauft) also, wenn Transaktionen sind irgendwie gebunden an die ausführende Methode, Kontext oder etwas, dann ich weiß nicht. Ich weiß, MS neigt dazu, binden Sie die Datenbank sehr eng an die Struktur des Codes oder andere würde ich noch nicht einmal die Möglichkeit in Betracht ziehen das nicht funktioniert...
InformationsquelleAutor Bill K
Ich benutze goto ' s die ganze Zeit in bestimmten Orten, zum Beispiel direkt über einem Try Catch für den Fall, dass Sie den Benutzer auffordern, "Wiederholen?, "Abbrechen", wenn wiederholen dann Springen StartMyTask: und erhöhen Sie den Aktuellen Versuchen der Maximalen Wiederholungen, je nach Szenario.
Sind Sie auch praktisch in for each-Schleifen.
Ich würde nicht an Ihrer Stelle Ersatz für die Funktionen und machen wirklich riesigen Blöcke der lange code, nur in kleinen Orten, wo Sie wirklich helfen kann, meist zu überspringen Dinge.
Then Continue For
statt?InformationsquelleAutor Kanaida
Jedesmal, wenn ich gesehen habe ein goto verwendet, einfache Umgestaltung haben könnte umzugehen. Ich würde empfehlen, nie verwenden, es sei denn Sie "wissen", dass Sie haben, um es
InformationsquelleAutor Allen Rice
Ich bin versucht zu sagen nie, aber ich nehme an, es gibt immer einen Fall, wo es möglicherweise die beste Lösung. Allerdings habe ich programmiert, die letzten 20 Jahre oder so, ohne die Verwendung eines Goto-Anweisung und können nicht vorhersehen, braucht man in absehbarer Zeit.
Was ist dieses g...o...t...o von dem alle reden?
Nie programmiert in Fortran, eh?
Es ist wie ein GOSUB-ohne die hin-und Rückfahrt. =)
InformationsquelleAutor tvanfosson
Warum nicht wickeln Sie jeden Funktionsaufruf in einem try-catch-block und wenn das geschehen ist, wenn eine Ihrer Ausnahmen geworfen werden, können Sie fangen Sie es, und schließen Sie die Verbindung. Auf diese Weise vermeiden Sie die GOTO-Anweisung zusammen.
Kurz gesagt, die GOTO-Anweisung ist NICHT eine gute Sache, außer in ungewöhnlichen Situationen, und auch dann ist es normalerweise eine Sache von refactoring zu vermeiden. Vergessen Sie nicht, es ist ein überbleibsel aus frühen Sprachen, in diesem Fall BASIC.
InformationsquelleAutor hmcclungiii
Ich würde sagen, die Anwendung sehr sparsam, da es in der Regel im Zusammenhang mit der Einführung von spagetti-code. Versuchen Sie es mit Methoden anstelle von Etiketten.
Einen guten Fall denke ich, dass für die Verwendung von GOTO ist das erstellen eines Durchflusses durch auswählen, die verfügbar ist in C# aber nicht VB.
InformationsquelleAutor Llyle
Die go to-Anweisung hat eine Tendenz, die den Programm-Ablauf schwer zu verstehen. Ich kann mich nicht erinnern, mit ihm während der letzten zehn Jahre, außer in visual basic 6 in Kombination mit "on error".
Ihre Nutzung der gehen ist akzeptabel, so weit ich bin besorgt, weil der Programm-Ablauf ist sehr klar. Ich glaube nicht, dass die Verwendung von try ... catch verbessern würde die Dinge wesentlich, denn Sie werfen müssen die Ausnahmen auf die stellen, wo die go-tos sind jetzt.
Die Formatierung ist allerdings nicht sehr Ansprechend:-)
Ich würde den Namen ändern, der der go-to-label für etwas anderes, denn dieser Ort wird auch erreicht, wenn alles erfolgreich ist. clean_up: wäre nett.
InformationsquelleAutor Renze de Waal
Äh, es war eine anständige Verwendung für Sie in VBscript/ASP für die Behandlung von Fehlern. Wir verwendeten Sie, um zurückzukehren, Fehlerbehandlung zurück zu ASP sobald wir fertig waren mit on error resume next.
in .net? Himmel, Nein!
InformationsquelleAutor
Jeder sagt, vermeiden Sie es aber, warum.
Die GOTO-syntax ist eine jump-Anweisung in der Montage - sehr effizient.
Haupt-Grund zu vermeiden, ist es die Lesbarkeit des Codes. Sie müssen finden Sie die GOTO-Labels in den code, das ist schwer zu Augapfel.
Einige Leute denken, dass es möglicherweise zu Speicherverlusten, aber ich habe gesehen, dass Experten sagen, dass dies nicht wahr ist .NET.
InformationsquelleAutor max