Ist goto noch evil...
-
...oder darf man es wieder verwenden?
Ernst gemeinte Frage.
-
Warum sollte es es nicht mehr sein? In der Regel werden einst akzeptierte Techniken als obsolet gewertet, der umgekehrte Fall ist äußerst selten zu sehen. Hast du konkrete Indizien, dass wieder vermehrt ein Einsatz von goto zu verzeichnen ist?
-
ToGoOrNotToGo schrieb:
...oder darf man es wieder verwenden?
Das klassische Goto gilt weiterhin in wohl allen Hochsprachen als verpöhnt, auch wenn einige Sprachen den Einsatz sinnvoll einschränken.
Man sollte aber beachten das Goto != Goto ist, inzwischen hat Goto in einigen Sprachen bereits eine etwas andere Bedeutung. In C# gibt es z.B. zwei mögliche Einsatzgebiete von goto, erstere (im switch zum anspringen eines weiteren case-Blockes) ist durchaus "gangbar", letztere (eher klassischer Stil) wird aber weiterhin als unschön angesehen (und ist so auch bei der Erklärung aufgeführt).
-
Oder hast du vielleicht neue einleuchtende Gründe, warum goto die zu bevorzugende Lösung eines Problems sein sollte?
-
goto ist und bleibt Evil. - Alle fälle in denen ein goto sinnvoll zu verwenden wäre, kann man mit Schleifen abdecken.
Wir wollen doch in Sachen Programmstruktur nicht zurück ins 19. Jahrhundert.
-
Trollen ist immer noch evil.
edit: Aber wie man sieht, beißen sie wie verrückt, also was soll man machen?
-
Naja vielleicht hat er ja neue, revolutionäre Anwendungsfälle
-
Ein m.E. akzeptabler Anwendungsfall von goto ist rausspringen aus verschachtelten Schleifen. Alternativen wie Abbruchvariablen o.ä. finde ich uneleganter. Habe ich aber trotzem nie gebraucht. Üblicherweise sollte man in solchen Fällen den Schleifenrumpf oder die Schleife in eigene Funktionen auslagern, dort kann man mit return rausspringen.
-
inflames2k schrieb:
goto ist und bleibt Evil. - Alle fälle in denen ein goto sinnvoll zu verwenden wäre, kann man mit Schleifen abdecken.
Goto mit Schleifen-Konstrukten zu ersetzen ist aber noch mehr evil als goto selbst.
Konstrukte ala
while (run) { for (...) { // ... if (...) { run = false; break; } // ... } }
gehören mit zum Schlimmsten was man so machen kann.
Destruktoren (RAII statt
goto cleanup
) und Hilfsfunktionen (return
stattgoto exit_all_loops
) sind dagegen IMO vollkommen OK bzw. sogar guter Stil.
-
hustbaer schrieb:
Konstrukte ala
while (run) { for (...) { // ... if (...) { run = false; break; } // ... } }
Witzigerweise gibt es in Fortran mit die eleganteste Lösung für das Problem, benannte Schleifen aus denen man mit Anweisung und Namen herausspringen kann.
Das sieht da so aus
outer_loop: do i=0,N inner_loop: do j=0,N if ... then exit inner_loop end if if ... then exit outer_loop end if end do end do
Insofern ist der Bedarf an goto in Fortran eher gering. Mir ist kürzlich in C nur beim Initialisieren und der Fehlerbehandlung der Bedarf an gotos aufgetreten.
-
Am Ende wird alles immer zu einem goto.
jne label, jmp label,...
Seufz.
-
Fortran mit die eleganteste Lösung für das Problem
Es gibt andere Sprachen mit anderen Loesungen. Elegant finde ich es trotzdem nicht.
-
in der OOP braucht man genaugenommen weder goto noch Schleifen, sobald man einen Datentyp "Intervall" hat und einen passenden Iterator.
-
~john schrieb:
Witzigerweise gibt es in Fortran mit die eleganteste Lösung für das Problem, benannte Schleifen aus denen man mit Anweisung und Namen herausspringen kann.
Das sieht da so aus
outer_loop: do i=0,N inner_loop: do j=0,N if ... then exit inner_loop end if if ... then exit outer_loop end if end do end do
Insofern ist der Bedarf an goto in Fortran eher gering. Mir ist kürzlich in C nur beim Initialisieren und der Fehlerbehandlung der Bedarf an gotos aufgetreten.
Das gibt es in Ada auch. In C oder C++ kann man sich das mit dem "Named-Loop-Idiom" nachbauen. Damit bekommt man etwas, dass dem sehr nahe kommt. Allerdings auch wieder mit goto (wie auch sonst).
-
!rr!rr_. schrieb:
in der OOP braucht man genaugenommen weder goto noch Schleifen, sobald man einen Datentyp "Intervall" hat und einen passenden Iterator.
Solange es keine Endlos-Intervalle gibt in denen man endlos Code ausführen kann, ist das etwas kurz gedacht.
-
!rr!rr_. schrieb:
in der OOP braucht man genaugenommen weder goto noch Schleifen, sobald man einen Datentyp "Intervall" hat und einen passenden Iterator.
In der funktionalen Programmierung braucht man weder goto noch Schleifen sobald man die Programmiersprache benutzt
~john schrieb:
Witzigerweise gibt es in Fortran mit die eleganteste Lösung für das Problem, benannte Schleifen aus denen man mit Anweisung und Namen herausspringen kann.
Viel eleganter als ein
goto
mit sinnvoll benannten Sprungmarken finde ich das nicht unbedingt.Ich war allerdings schon ein paar Mal davor, ein
goto
einzusetzen, schlussendlich löste ich es dann doch anders. Aber ich würde sicher nicht kategorisch aufgoto
verzichten, wenn es den Code vereinfacht.
-
Ich würde es auch nicht aus Prinzip vermeiden, aber wenn man mal ehrlich ist passiert es aber extrem selten, dass ein goto wirklich mehr Sinn macht als etwas anderes. Spontan fällt mir jetzt keine Situation ein, die man nicht auch anders besser lösen könnte.
-
Hier nochmal ganz bewusst der imo schöne Code mit goto:
for(std::size_t n = 0; n < 100; ++n) for(std::size_t m = 0; m < 100; ++m) for(std::size_t l = 0; l < 100; ++l) if(cube[n][m][l] == "Bananenweizen") goto rausHierRufzeichen; else // mach irgendwas rausHierRufzeichen:
SCHÖN!
-
Bananenweizen sollte eh eine exception werfen.
-
Bashar schrieb:
Trollen ist immer noch evil.
edit: Aber wie man sieht, beißen sie wie verrückt, also was soll man machen?
Goto fischen?