Ist GOTO in PHP böse? [geschlossen]

72

Ich habe kürzlich herausgefunden, dass PHP 5.3 das neue Sprachkonstrukt namens unterstützt GOTO. Jeder weiß was es tut. Es ist jedoch nicht gerade das Traditionelle GOTO, es ist nur ein Sprunglabel. Ich bin interessant zu wissen, ob dies GOTOböse ist und schlechten Code impliziert.

Turm
quelle
2
GOTO ist wie regulärer Ausdruck für das HTML-Parsen. Codinghorror.com/blog/archives/001311.html
Rubens Farias
5
Im College habe ich immer goto-Aussagen verwendet, wenn ich meine Professoren verärgern wollte, muahahaha ... die Programme würden natürlich immer noch perfekt funktionieren, aber ich konnte immer sehen, wie ihre Augen zuckten, wenn sie auf diese kleinen Aussagen
stießen
16
> "Es ist jedoch nicht gerade das Traditionelle GOTO, es ist nur ein Sprunglabel." Wie unterscheidet sich das vom "traditionellen" GOTO?
Anon.
3
Wiederkehrende GOTOFragen zu StackOverflow gelten als schädlich.
Rsenna
5
goto ist überhaupt nicht böse .. aber das ist wirklich böse:eval("foo: goto foo;");
CodeBrauer

Antworten:

153

Sofern Sie nicht in Assembler programmieren, sollte GOTO immer genauso behandelt werden wie die Schwimmweste der Flugzeuge: Es ist gut, sie zur Verfügung zu haben, aber wenn Sie sie verwenden müssen, bedeutet dies, dass Sie in großen Schwierigkeiten sind.

Konamiman
quelle
65
Ich würde eher sagen: "Wenn Sie sie verwenden müssen und Sie sie nicht haben, sind Sie in großen Schwierigkeiten." Das ist eine Stärke für den Einstieg in eine Programmiersprache.
Remo.D
20
@ Remo.D Ja, weil Schwimmwesten bei Flugzeugabstürzen so viele Leben gerettet haben!
Buttle Butkus
13
@ButtleButkus Nicht im Flugzeug stürzt ab , aber sie viele Leben gerettet in Notlandung auf dem Wasser (Meer, Seen, Flüsse).
Remo.D
3
Eigentlich hatte ich ein Szenario, in dem wir buchstäblich gerettet wurden. Wir haben angefangen, eine MVC zu verwenden, und wir haben die MVC für das Abhängigkeitsmanagement verwendet, da sie ein sehr ausgereiftes Klassenladesystem hatte. Nun, plötzlich in Legacy-Dateien, die den traditionellen Header () verwendeten; sterben; Konstrukt begann APC, Segmentierungsfehler zufällig zu werfen. Goto wurde zur Schwimmweste, die diesen Legacy-Code so lange schwebte, bis alles in Controller umgewandelt werden konnte. Es bot auch eine verbesserte Leistung, indem überwältigend tiefe Bedingungen vermieden wurden
Peter
Sehr gut erklärt. Diese Antwort gefällt mir sehr gut. : D
xZero
103

Ich kann nicht glauben, dass niemand dies gepostet hat :)

xkcd - gehe zu

Zugegeben, PHP ist nicht kompiliert ... Vielleicht verfolgt Sie der Raptor bei jedem Besuch Ihrer Website?

Loris
quelle
20
Das lustigste ist, dass sein Comic auf der PHP-Handbuchreferenz für goto steht: es.php.net/manual/en/control-structures.goto.php also ja, der Raptor wird dich jagen, auch in PHP;) auch großartig alt Text: "Neal Stephenson findet es süß, seine Labels 'dengo' zu nennen"
danii
2
Ich würde dir +2 geben, wenn ich könnte (eine für Recht, eine für den Comic)
TheHippo
1
Der Raptor wird Sie bei jedem Besuch Ihrer Website über einen Nicht-Mozilla-Browser
verfolgen
80

Eine schlechte Strukturierung des Codes ist ungeachtet der von Ihnen verwendeten Kontrollstruktur böse.

Ich persönlich bevorzuge ein goto, das den Programmfluss klar macht, um "Variablen zu steuern" und "if" zu verschachteln, was indirekt nur den gleichen Zweig im Code verursacht.

Schreiben Sie einfach die beiden Versionen (mit und ohne GOTO) und sehen Sie, welche leichter zu verstehen ist. Dann ist die Wahl einfach.

Remo.D
quelle
6
+1 für die ersten beiden Absätze. Warum ist dies nicht die akzeptierte Antwort? :-)
MattBianco
2
Nun ... es ist vernünftig, aber wir alle wissen, dass wir tief im Inneren auf diese Seite gekommen sind, weil wir uns schuldig gefühlt haben, über die Verwendung nachgedacht zu haben goto x;. Es ist nie jemandes idealer Workflow, nur lebenserhaltende Maßnahmen, von denen wir wissen, dass wir sie nie neu schreiben werden. Stattdessen werden wir leider dem nächsten armen Kerl überlassen, mit dem wir uns befassen müssen.
Alastair
2
+1 Ich benutze es, um zum Ende des Inline-Codes zu springen und hässliche verschachtelte if () zu vermeiden. Es kann auch unnötige Codeausführung vermeiden - z. B. Code, den Sie vor einem if-elseif-elseif-else-Block ausgeführt haben, bei dem er nach dem zweiten elseif "gerettet" werden könnte.
Anthony Scaife
Wenn es in Ihrer Version von PHP nicht verfügbar ist, dann eine "Pause"; mitten in einem do {...}, während (0) für Sie geeignet sein kann. Früher habe ich das gemacht (natürlich mit Dokumentation).
Anthony Scaife
1
Dies ist so ein alter Beitrag - aber ich muss hier zustimmen ... Es ist eine Kontrollstruktur wie jede andere und wenn Sie ein Shit-Codierer sind, werden Sie Shit-Kontrollstrukturen mit oder ohne goto schreiben. Ich habe gesehen, dass Code mit Steuervariablen eingebettet und 5/6 Ebenen tief verschachtelt ist, wenn ($ somePass): Wenn wirklich jeder Durchgang nur prüft, ob er das hat, was er braucht, und woanders hingehen möchte, um die Arbeit zu beenden. Geh GOTO du gutes kleines Ding du!
Trent
23

Ich denke, dies ist der wichtigste Teil der PHP-Handbuchseite und fehlt hier:

Dies ist kein uneingeschränkter Goto . Die Zielbezeichnung muss sich in derselben Datei und demselben Kontext befinden. Dies bedeutet, dass Sie weder aus einer Funktion oder Methode herausspringen noch in eine springen können . Sie können auch nicht in eine Schleifen- oder Schalterstruktur springen. Sie können aus diesen herausspringen, und eine übliche Verwendung besteht darin, ein Goto anstelle einer mehrstufigen Pause zu verwenden.

IMHO unterscheidet es sich sehr von den alten Gotos im BASIC-Stil .

schmunk
quelle
Danke - ich habe es in BASIC geliebt. Vermeiden Sie es in PHP - aber ich finde es einfacher zu verwalten, wenn es auf die Funktion oder Datei beschränkt ist. Echtes PHP-Handbuch erklärt es nicht sehr gut.
Luke
Dies ist ein ziemlich cooles Beispiel für gotoin PHP btw github.com/schmunk42/retry/blob/master/src/retry.php - Credits gehen an igorw
schmunk
... use a goto in place of a multi-level break.ist eine interessante Aussage, wenn man bedenkt, dass PHP tatsächlich eine mehrstufige Pause hat. break 2;wird zum Beispiel aus zwei Schleifen ausbrechen. Lass das hier für jeden, der mitkommt; Eine mehrstufige Pause könnte alles sein, was Sie brauchen.
Yay295
18

Ich bin (derzeit) in der Minderheit, aber ich glaube, dass die Einschränkungen, die dem goto-Konstrukt von PHP auferlegt wurden, ein sehr nützliches Werkzeug darstellen:

http://adamjonrichardson.com/2012/02/06/long-live-the-goto-statement/

Ich gehe tatsächlich ein Beispiel für Pfeilcode (tief verschachtelte Bedingungen) durch und überarbeite ihn unter Verwendung von Standardpraktiken (Schutzklauseln, Gruppierungsbedingungen, Herausziehen von Funktionen) in einer Version und einer goto-basierten Version in der anderen Version, und ich bevorzuge tatsächlich die goto-basiertes Refactoring.

AdamJonR
quelle
10

Sind Waffen böse? Beide können zum Guten oder zum Bösen eingesetzt werden. Ich würde sagen, es war einfacher, guten Code ohne goto zu schreiben als mit.

David Waters
quelle
22
Waffen töten keine Menschen. Magische Raketen tun es.
Alex Budovski
1
In Kanada haben wir weniger Waffen und weniger Waffengewalt. Ich empfehle daher, keine goto-Aussagen zu haben.
AntoineMoPa
3
@antoineMoPa Verwenden Sie goto also nicht in Kanada.
Userfuser
1
offensichtlich sind die goto tugendhaft. Wir brauchen nur lizenzierte Leute, die einen Goto-Sicherheitskurs durchlaufen haben
Garet Claborn
@antoineMoPa Auf die Gefahr hin, dass ich von SO ausgeschlossen werde, ist dieser Kommentar so, als würde man sagen, dass die Republik Kongo weniger Todesfälle durch Autos hat, weil sie weniger Autos haben. Automobile sowie goto-Anweisungen haben sich in bestimmten Situationen als nützlich erwiesen. Vielleicht können wir also eine "Gehe zu Lizenz" benötigen?
UncaAlby
7

Jede Sprachfunktion, die Code in einer bestimmten Situation besser lesbar machen kann, ist eine gute Sache. GOTO ist eine solche Sprachfunktion, auch wenn diese Situationen selten sind. Wenn wir eine Syntax verbieten würden, die es armen Programmierern ermöglicht, schlechten, nicht wartbaren Code zu schreiben, wären unsere Jobs sehr viel schwieriger.

Mark Rendle
quelle
Schlechte Programmierer können schlechte Programme schreiben, egal was passiert. Wenn wir eine Syntax verbieten würden, die es schlechten Programmierern erlaubt, schlechte Programme zu schreiben, wäre nichts mehr übrig, in das man etwas schreiben könnte.
UncaAlby
5

Als Softwareentwickler arbeite ich hauptsächlich an "Mainframes" und "großen Unternehmensservern" ... Und unsere tägliche Sprache (ich meine die in 95% unseres Basiscodes) ist Cobol, das häufig GOTOs verwendet.

Diese Verwendung bedeutet nicht, dass der Code schlecht ist. Es bedeutet nur, dass dieses Tool (GOTO) zum Zeitpunkt der Erstellung der Programme das richtige war.

Um Kaitsulis Frage zu beantworten, denke ich, dass es ein nützliches Werkzeug beim Schreiben von PHP-Skripten sein kann. Andererseits wurden inzwischen fast ein Jahrzehnt lang viele Skripte ohne sie erstellt. Darüber hinaus widerspricht es der Entwicklung von PHP mit objektorientierteren Funktionen.

IMHO, es ist weder gut noch schlecht, dass der Code produziert wird: Gute Programme werden immer noch gut und "Horror-Programme" werden schlechter ... Die einzige Frage ist: "Warum 10 Jahre nach dem Nachweis, dass es nicht notwendig war, GOTOs hinzuzufügen? ".

Arno
quelle
das ist
bezaubernd
4

GOTO ist normalerweise böse, weil Sie damit unstrukturierten Code erstellen können. Mit den üblichen Schleifen können Sie gut strukturierten Code erstellen, der einfach zu befolgen ist, da er strukturiert ist.

Wenn Sie nicht strukturierten Code haben, der von hier nach dort springt, haben Sie gerade das Böse gefunden, das aus der GOTO-Anweisung stammt. Fast immer ist es besser, es zu vermeiden. Vielleicht gibt es einmal alle 100.000 Zeilen einen Ort, an dem ein GOTO-Satz VIEL vereinfacht. Der Code ist also nicht böse, aber wenn Sie sich nicht sicher sind, sollten Sie das GOTO vermeiden.

Hoffe das hilft.

EDIT: Nun, um hier meine eigene Meinung hinzuzufügen, gibt es andere Anweisungen, mit denen Sie unstrukturierten Code erstellen können und die nicht als böse angesehen werden, wenn ich denke, dass sie es sein sollten.

Zum Beispiel ist eine Rückgabe in der Mitte einer Funktion ein GOTO zum Ende, daher vermeide ich sie und verwende nur eine Rückgabe in jeder Funktion direkt am Ende.

Andere Sprachen wie Vb.Net (vielleicht auch andere) erlauben Exit For, Exit While, Pausen und solche Dinge, die auch den Code unstrukturieren und ich denke, sollten vermieden werden.

Ignacio Soler Garcia
quelle
9
Ich habe Angst, goto zu verwenden, weil jeder, der meinen Code liest, das Vertrauen in mich völlig verlieren könnte
Carson Myers
Ich habe seit fast 20 Jahren kein goto mehr benutzt (außer in der Montage). Nicht einmal als ich (DEC) Fortran schrieb.
Alnitak
1
Mein Auto lässt mich mit 90 die Hauptstraße hinunter fahren. Das macht es nicht böse. Wenn ich mit 90 fahren würde, wäre es das auch. Mit 90 die Hauptstraße entlang zu fahren wäre böse, wenn man nicht die Möglichkeit dazu hätte.
Nick Rice
Wenn Sie mit Ihrem Auto mit 90 fahren können, ohne dass Sie mit 90 fahren müssen, ist Ihr Auto böse, da es Ihnen einige Fähigkeiten bietet, die Sie nur verletzen können.
Ignacio Soler Garcia
@IgnacioSolerGarcia, Wenn das höchste Tempolimit in meiner Region 70 ist und jeder 70 fährt und ich beschleunigen muss, um einen Unfall zu vermeiden, hoffe ich aufrichtig, dass mein Auto bei 70 nicht die Nase vorn hat. Es ist also immer noch eine Frage, wie es ist benutzt. Waffen, schnelle Autos und GOTOs ...
TecBrat
2

Manchmal (ich meine in 0,01% der Fälle) ist es nützlich, wenn Sie ein langes Skript haben und einige Blöcke testen möchten. aber behalte es niemals in deinem endgültigen Skript

Yafrani
quelle
1

Ich habe GOTO verwendet, als ich ein Skript für die Arbeit im CLI-Modus geschrieben habe. Es rettet mein Leben.

EThaizone Jo
quelle
Ich benutze goto in diesem Mikro-Framework, das ich geschrieben habe. CLIP Framework für cli. Es ist richtig, dass goto nicht für mehrere Dateien verwendet werden kann, aber Sie können es für eine Datei verwenden und dies als Klasse oder Funktion zur Steuerung des Programmierflusses verwenden. Ich hoffe, dies kann den Menschen helfen, alternativ zu denken. PHP ist mehr als eine Webprogrammierung.
EThaizone Jo
Ich habe noch nie ein GOTO oder sogar ein Continue verwendet, außer in einer beschissenen Windows Bat-Datei, um Funktionen aufzurufen. Erklären Sie bitte, warum Sie es gebraucht haben.
Mike Q
@MikeQ Manchmal muss ich Daemon-Software schreiben, um einen Hintergrundjob zu erledigen. Es muss Eingaben aus vielen Quellen überwachen und Aufgaben ausführen, die ich ihm zuweise. Für den Daemon-Prozess schreiben viele Leute mit, while(true)damit es für immer funktioniert, bis Sie es töten, aber dies ist nur eine schmutzige Art, es zu tun.
EThaizone Jo
Jemand könnte denken, dass GOTO den Anmeldefluss unterbricht, weil dieser Befehl nur die Sequenz in Ihrem Code überspringen kann, aber ich denke, dass dieses Problem, das vom Entwickler verursacht wird, in der Sprache nicht fehlschlägt. Selbst wenn Sie eine bessere Sprache haben, können Sie sie mit einfach zum Absturz bringen while(). Wenn Sie GOTO nicht verwenden, bedeutet dies nicht, dass es aus der Sprache entfernt werden sollte.
EThaizone Jo