Warum kein goto?
-
Jede Literatur zu C die ich gelesen habe lehnt goto-Anweisungen rein kategorisch ab.
Ja...Spaghetti-Code und bla bla bla leuchtet auch irgendwie ein.
Trotzdem finde ich es recht nützlich um aus Schleifen mit Switch-Anweisung oder verschachtelten Schleifen rauszukommen, wo ein einfaches break nicht mehr hilft.
Nur wenn man jetzt jemand so ein Code zeigt heißt es dann: Bähhh...so ein schlechter Stil - warum benutzt du goto?
Hat das irgendwelche Performance-Gründe oder ist das einfach ein Vorurteil?
Ich finde es einfacher zu benutzen und auch übersichtlicher als extra eine Variable zu verwenden, die dann gesetzt und überprüft werden muss um aus einer verschachtelten Schleife vorzeitig rauszukommen.
-
Simonek schrieb:
Trotzdem finde ich es recht nützlich um aus Schleifen mit Switch-Anweisung oder verschachtelten Schleifen rauszukommen, wo ein einfaches break nicht mehr hilft.
Ist es auch.
Nur wenn man jetzt jemand so ein Code zeigt heißt es dann: Bähhh...so ein schlechter Stil - warum benutzt du goto?
Hat das irgendwelche Performance-Gründe oder ist das einfach ein Vorurteil?
In dem Fall einfach nur Vorurteil.
-
Vielleicht sind die Schleifen auch schlechter Stil, wenn sie so kompliziert sind, das ein break nicht mehr reicht
goto komplett zu verteufeln ist aber sicher sinnlos. Gerade in C braucht man es ja öfters, wenn man sich um irgend eine Ressource Freigabe kümmern muss (ach, wie sehr wünscht man sich doch Conditions)
-
Lesestoff dazu: "Go To Statement Considered Harmful" von Edsger Dijkstra und "Structured Programming with go to Statements" von Don Knuth.
http://www.acm.org/classics/oct95/
http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf
-
Nicht zu vergessen noch "GOTO Considered Harmful Considered Harmful?" (habe ich leider nicht frei zugänglich im Netz gefunden) und Dijkstras Antwort: On a somewhat disappointing correspondence, http://www.cs.utexas.edu/users/EWD/transcriptions/EWD10xx/EWD1009.html.
Der konnte so richtig schön flamen.
-
Simonek schrieb:
Jede Literatur zu C die ich gelesen habe lehnt goto-Anweisungen rein kategorisch ab.
Ja...Spaghetti-Code und bla bla bla leuchtet auch irgendwie ein.
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.
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). Offensichtlich ist also im kleinen lokalen Rahmen Goto ein gutes Hilfsmittel, und wird oft genutzt.
Viele der Dokumente zum Goto sind 20-40 Jahre alt und beantworten eher die Frage, warum ein "globales Goto" gefährlich ist und sind historisch zu betrachten, sie erklären teilweise ja sehr gut, warum unsere heutigen Programmiersprachen bzgl Goto so aussehen, wie sie aussehen.
-
Simonek schrieb:
Jede Literatur zu C die ich gelesen habe lehnt goto-Anweisungen rein kategorisch ab.
Schlechte Literatur
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.
Alles andere ist nur ideologisches, überzogenes Gerede von Leuten, die es einfach nicht verstanden haben.
-
Hallo,
ich persönlich habe mir aus beruflichen Gründen angewöhnt, kein goto zu verwenden. Und nur eine return-Anweisung in Funktionen... und maximal 3-4 Einrückungen in Funktionen... und... und...
Normal kann man jeden Code mit goto in einen ohne umwandeln, ohne die Lesbarkeit, Verständlichkeit, Wartbarkeit usw. zu beeinflussen, höchstwahrscheinlich sogar noch verbessern. Vielleicht gibt es eins/zwei künstliche Beispiele, wo es nicht geht, aber das sei dahingestellt.
Als Student kann man sich hier und da ohne nachzudenken ein goto erlauben, später kann es aber sein, dass man den Code nach gewissen Anforderungen schreiben muss, und da wird ein goto mit Sicherheit nicht erlaubt sein...
-
Marc++us schrieb:
Das Goto von C ist dagegen relativ harmlos, da man nicht aus Funktionen herausspringen kann...
dafür gibts ja 'longjmp'
-
ten schrieb:
Marc++us schrieb:
Das Goto von C ist dagegen relativ harmlos, da man nicht aus Funktionen herausspringen kann...
dafür gibts ja 'longjmp'
das benutzt du bestimmt oft
solange man goto nicht oft in einem programmcode benutzt ist es voll ok und meiner meinung nach auch teilweise übersichtlicher, mal so nebenbei, wer benutzt von euch 'longjmp'
?
-
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