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 GOTO
böse ist und schlechten Code impliziert.
72
GOTO
, es ist nur ein Sprunglabel." Wie unterscheidet sich das vom "traditionellen"GOTO
?GOTO
Fragen zu StackOverflow gelten als schädlich.eval("foo: goto foo;");
Antworten:
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.
quelle
Ich kann nicht glauben, dass niemand dies gepostet hat :)
Zugegeben, PHP ist nicht kompiliert ... Vielleicht verfolgt Sie der Raptor bei jedem Besuch Ihrer Website?
quelle
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.
quelle
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.Ich denke, dies ist der wichtigste Teil der PHP-Handbuchseite und fehlt hier:
IMHO unterscheidet es sich sehr von den alten Gotos im BASIC-Stil .
quelle
goto
in PHP btw github.com/schmunk42/retry/blob/master/src/retry.php - Credits gehen an igorw... 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.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.
quelle
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.
quelle
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.
quelle
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? ".
quelle
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.
quelle
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
quelle
Ich habe GOTO verwendet, als ich ein Skript für die Arbeit im CLI-Modus geschrieben habe. Es rettet mein Leben.
quelle
while(true)
damit es für immer funktioniert, bis Sie es töten, aber dies ist nur eine schmutzige Art, es zu tun.while()
. Wenn Sie GOTO nicht verwenden, bedeutet dies nicht, dass es aus der Sprache entfernt werden sollte.