Warum kein goto?



  • Stelfer schrieb:

    dafür gibts ja 'longjmp' 😉

    das benutzt du bestimmt oft 😉

    nö, fast nie. ich hab's bisher nur 1-mal gebraucht.
    in oo-sprachen wie java und c# z.b. heisst das äquivalent dazu übrigens 'throw'.
    ist also harmlos (falsch anwenden und spaghetti-code erzeugen kann man aber trotzdem damit)
    🙂



  • Marc++us schrieb:

    Ein Großteil dieser Literatur und auch der Begriff des Spaghetti-Codes stammt aus der Zeit, als man mit Goto in vielen Programmiersprachen und in Assembler noch "überall" hinspringen konnte... also praktisch in jede Programmzeile rein. Das ist natürlich der helle Wahnsinn ab einer gewissen Programmgröße.

    Das Goto von C ist dagegen relativ harmlos, da man nicht aus Funktionen herausspringen kann, und auch nicht beliebig in Schleifen rumspringen kann.

    Da man beliebig große Funktionen schreiben kann, kann das nicht wirklich der Punkt sein. Dijkstra argumentiert auch überhaupt nicht in die Richtung.

    Goto ist in C sogar so beliebt, daß man extra die Abkürzungen "break" und "continue" eingeführt hat, ebenso darf man das "return" ja an beliebige Stelle einer Funktion setzen - das sind alles Gotos mit anderem Namen (quasi mit festem Label).

    Der Unterschied -- das feste Label -- ist aber entscheidend! Wenn du so willst ist jegliches Kontrollflußkonstrukt abgesehen von der einfachen Sequenz ein verstecktes Goto, aber so eine Sicht ginge vollkommen am Thema vorbei. Die Sprunganweisung an sich ist nicht das Problem. Das Problem ist, dass das Sprungziel nahezu beliebig sein kann, so dass sich bei mehreren gotos irgendwann der bekannte Spaghetticode zeigt. Mit break, continue und return ist sowas nicht möglich.

    Man muss nur eins bedenken, wenn man solche alten Artikel liest: Damals gab es noch keine strukturierte Programmierung. Wenn Dijkstra sagt "goto ist böse", dann meint er damit den Einsatz von goto im großen Stil, nicht ein einzelnes kleines goto in irgendeiner Mini-Funktion, das bei manchen sofort zum Herzstillstand führt.

    Pock schrieb:

    Goto sollte lediglich nicht für die Emulation schon vorhandener, besser geeigneter Sprachelemente verwendet werden. Man iteriert halt beispielsweise nicht mit goto. Wenn die Alternative zu goto schlechter zu verstehen, zu warten oder erheblich mehr Arbeit ist, dann ist goto das RichtigeTM.

    Das stimmt zwar, aber trifft den Nagel noch nicht auf den Kopf. Wenn du mit goto nur ohnehin vorhandene Konstrukte nachbaust, wird dein Code zwar etwas schwerer lesbar, aber im Grunde bleibt dein Kontrollfluß überschaubar. Gefährlich wird es, wenn die Sprungpfade nicht mehr den sauberen Mustern folgen und ineinander verschlungen sind.



  • Bashar_ schrieb:

    Gefährlich wird es, wenn die Sprungpfade nicht mehr den sauberen Mustern folgen und ineinander verschlungen sind.

    das kannst du auch ohne 'goto' haben: http://catb.org/jargon/html/D/Duffs-device.html



  • Bashar_ schrieb:

    Gefährlich wird es, wenn die Sprungpfade nicht mehr den sauberen Mustern folgen und ineinander verschlungen sind.

    Wird denn so etwas in der Realität von halbwegs brauchbaren Programmierern gemacht, wenn bessere Lösungen auf der Hand liegen? Ich habe schon Code von wirklich miesen Programmierern gesehen, aber mehr als ein goto pro 20K LOC war selbst bei denen nicht zu finden - ich lese allerdings auch eher selten Hobbyistencode.

    @ten: Optimierung ist mMn wieder eine ganz andere Sache. Wenn ich eine kritische Stelle meines fertigen Programms mit ein paar unsauberen Tricks signifikant beschleunigen kann, dann ist mir jedes Mittel recht.



  • pock schrieb:

    Wird denn so etwas in der Realität von halbwegs brauchbaren Programmierern gemacht, wenn bessere Lösungen auf der Hand liegen? Ich habe schon Code von wirklich miesen Programmierern gesehen, aber mehr als ein goto pro 20K LOC war selbst bei denen nicht zu finden - ich lese allerdings auch eher selten Hobbyistencode.

    Nein, sorry, ich meinte das aus der historischen Perspektive. Sei es irgendwelcher Code aus den 60ern oder Basic-Kram aus den 80ern. Heute wird man ja für jedes goto schon gesteinigt, wer würde es da wagen ... 😉

    @ten: Duff's Device ist doch nicht verschlungen ...



  • Stelfer schrieb:

    wer benutzt von euch 'longjmp' 😉 ?

    Kann man manchmal für die Fehlerbehandlung gut gebrauchen.



  • Puh, ihr macht mir wieder Mut. Ich hab das Prob ständig mit einem uneinsichtigen Chef, der schon etliche Fusspuren an der Decke hinterlassen hat, nur weil er wieder mal mein bei mir beliebtes goto panic; gefunden hat.
    Ich mach sowas ganz gerne, wenn ich mehrere Resourcen nutzen muss, die logisch gesehen zu einer Funktion gehören, aber unterwegs was schief gehen kann. Natürlich könnt ich sowas auch mit brutal verschachtelten Funktionen machen, das nimmt mir aber die Logik aus dem Programm. Da ist mir doch ein einfaches goto schon lieber, das einfach zu ner Stelle springt, wo Resourcen wieder freigegeben werden. Ich denk auch, dass das weniger fehleranfällig ist.



  • Hihi
    Mach doch einfach ein #define throw goto 🤡



  • die meisten sind schon ohne gotos nicht in der lage vernünftig strukturierte und schön designte programme zu schreiben, wenn man denen noch gotos in die hand gibt, dann gibts nur noch verwirrten scheiß.



  • Ein Vorschlag für goto-Befürworter und die, die ab und zu mal ein goto verwenden: vielleicht wäre es besser, mal in Assembler ein Paar Programme zu schreiben, da gibt es genug "goto's" in Form von irgendwelchen Sprungbefehlen usw., ja, man ist da praktisch gezwungen, "goto's" zu verwenden... Ich denke, man lernt danach die zu Grunde liegende Philosophie der höheren Programmiersprachen zu schätzen und wird beim besten Willen kein goto mehr verwenden 😉


Anmelden zum Antworten