do{}while(false); -- ein besseres goto?
-
DStefan schrieb:
Es gibt keinen angemessenen Einsatz von goto.
klar doch. das standardbeispiel: rausspringen aus verschachtelten schleifen, wenn sich im innern herausstellt, dass nichts mehr gemacht werden muss.
DStefan schrieb:
Bin halt extrem goto-geschädigt.
was ist passiert mit dir und 'goto'?
-
;fricky schrieb:
DStefan schrieb:
Es gibt keinen angemessenen Einsatz von goto.
klar doch. das standardbeispiel: rausspringen aus verschachtelten schleifen, wenn sich im innern herausstellt, dass nichts mehr gemacht werden muss.
return gibts sogar in C
-
DrGreenthumb schrieb:
;fricky schrieb:
DStefan schrieb:
Es gibt keinen angemessenen Einsatz von goto.
klar doch. das standardbeispiel: rausspringen aus verschachtelten schleifen, wenn sich im innern herausstellt, dass nichts mehr gemacht werden muss.
return gibts sogar in C
ja und? weisst du denn was return in C macht?
-
DStefan schrieb:
;fricky schrieb:
DStefan schrieb:
Andererseits nehme ich natürlich goto-Liebhaber auch nicht ernst.
und was hältste von leuten, die 'goto' angemessen einsetzen, also z.b. da, wo ein direkter sprung zur vereinfachung des codes führt?
Nichts. Es gibt keinen angemessenen Einsatz von goto.
Sorry. Ich möchte hier keinen Krieg vom Zaun brechen. Bin halt extrem goto-geschädigt.
Du bist offensichtlich leicht geschädigt, ja.
Der "do-while-break" Code ist ist doch wohl offensichtlich 100x schlimmer als jedes "goto". Ganz egal was man von goto hält.
-
;fricky schrieb:
DrGreenthumb schrieb:
;fricky schrieb:
DStefan schrieb:
Es gibt keinen angemessenen Einsatz von goto.
klar doch. das standardbeispiel: rausspringen aus verschachtelten schleifen, wenn sich im innern herausstellt, dass nichts mehr gemacht werden muss.
return gibts sogar in C
ja und? weisst du denn was return in C macht?
ja.
wenn dir der runtime-overhead zu viel ist, ist das eher ein spezialfall.
-
Ich sehe da zwei verschiedene Aussagen.
Es gibt keinen angemessenen Einsatz von goto.
Jup. Für C++ mag das stimmen.
Ich find's ein winzig kleines Bischen besser als goto.
Nee, der Schleifenzombi ist doch zu abartig. Vermutlich kann man in echtem Code aber dafür sorgen, daß man weder goto noch den Zombi hat.
-
volkard schrieb:
Ich sehe da zwei verschiedene Aussagen.
Es gibt keinen angemessenen Einsatz von goto.
Jup. Für C++ mag das stimmen.
in C++ tritt man 'ne exception los und fängt sie dahinter wieder auf, ne? (ich meine jetzt wenn man aus den verschachtelten schleifen raus will).
-
;fricky schrieb:
volkard schrieb:
Ich sehe da zwei verschiedene Aussagen.
Es gibt keinen angemessenen Einsatz von goto.
Jup. Für C++ mag das stimmen.
in C++ tritt man 'ne exception los und fängt sie dahinter wieder auf, ne? (ich meine jetzt wenn man aus den verschachtelten schleifen raus will).
Nein, das ist eher Java-Stil.
In C++ lagert man die Schleifendinge in Funktionen aus und der Abbruch entsteht genau dann, wenn man das Funktionsergebnis kennt, man kann glaich rausreturnen. Auf close(), free() und solche Aufräumsachen braucht man aber nicht zu achten wegen der Destruktoren, daher ist kein Sprung zum Aufräumblock nötig.
-
volkard schrieb:
In C++ lagert man die Schleifendinge in Funktionen aus und der Abbruch entsteht genau dann, wenn man das Funktionsergebnis kennt, man kann glaich rausreturnen.
selbiges könnteste auch in C machen. ich finde es doof extra eine funktion 'avoid_goto()' zu schreiben, die aus dem einzigen grund da ist, um ein goto zu vermeiden.
also sowas:... for(...) { ... while (...) { ... if (ich_habs_jetzt) goto fertig } } fertig: // anderer wichtiger code ...
^^ ist keine bisschen spaghetti-logik sondern der einfachste und übersichtlichste weg.
volkard schrieb:
Auf close(), free() und solche Aufräumsachen braucht man aber nicht zu achten wegen der Destruktoren, daher ist kein Sprung zum Aufräumblock nötig.
richtig, aber anderen code, der danach drankommen soll, hat man ja auch machmal.
-
;fricky schrieb:
volkard schrieb:
In C++ lagert man die Schleifendinge in Funktionen aus und der Abbruch entsteht genau dann, wenn man das Funktionsergebnis kennt, man kann glaich rausreturnen.
selbiges könnteste auch in C machen. ich finde es doof extra eine funktion 'avoid_goto()' zu schreiben, die aus dem einzigen grund da ist, um ein goto zu vermeiden.
also sowas:... for(...) { ... while (...) { ... if (ich_habs_jetzt) goto fertig } } fertig: // anderer wichtiger code ...
^^ ist keine bisschen spaghetti-logik sondern der einfachste und übersichtlichste weg.
volkard schrieb:
Auf close(), free() und solche Aufräumsachen braucht man aber nicht zu achten wegen der Destruktoren, daher ist kein Sprung zum Aufräumblock nötig.
richtig, aber anderen code, der danach drankommen soll, hat man ja auch machmal.
In echten Fällen hat das Schleifenzeugs eine eigene Bedeutung, um Beispiel wird ein Wert gesucht, dann soll sogar die eigene Bedeutung eine eigene Funktion bekommen.
-
;fricky schrieb:
ich finde es doof extra eine funktion 'avoid_goto()' zu schreiben, die aus dem einzigen grund da ist, um ein goto zu vermeiden.
wenn du die funktion nicht avoid_goto nennen würdest sondern danach, was sie macht, hätte sie zusätzlich auch noch den effekt, den code besser zu dokumentieren.
// ups, letzten beitrag nicht gesehen
-
DrGreenthumb schrieb:
;fricky schrieb:
ich finde es doof extra eine funktion 'avoid_goto()' zu schreiben, die aus dem einzigen grund da ist, um ein goto zu vermeiden.
wenn du die funktion nicht avoid_goto nennen würdest sondern danach, was sie macht, hätte sie zusätzlich auch noch den effekt, den code besser zu dokumentieren.
da habt ihr natürlich recht. trotzdem widerstrebts mir, code der sonst eine einheit darstellt zu zerstückeln, nur um ein harmloses 'goto' zu umgehen. wenn die schleifendurchläufe dokumentationswürdig sind, kann man auch so einen kurzen kommentar hinschreiben. bei so'ner extrahierten anti-goto funktion, brauchste womöglich noch 'nen kommentar wie */* don't call it directly, it's fucking useless /
-
;fricky schrieb:
DrGreenthumb schrieb:
;fricky schrieb:
ich finde es doof extra eine funktion 'avoid_goto()' zu schreiben, die aus dem einzigen grund da ist, um ein goto zu vermeiden.
wenn du die funktion nicht avoid_goto nennen würdest sondern danach, was sie macht, hätte sie zusätzlich auch noch den effekt, den code besser zu dokumentieren.
da habt ihr natürlich recht. trotzdem widerstrebts mir, code der sonst eine einheit darstellt zu zerstückeln, nur um ein harmloses 'goto' zu umgehen. wenn die schleifendurchläufe dokumentationswürdig sind, kann man auch so einen kurzen kommentar hinschreiben. bei so'ner extrahierten anti-goto funktion, brauchste womöglich noch 'nen kommentar wie */* don't call it directly, it's fucking useless /
Es tauchen keine Funktionen auf, die so einen Kommentar bräuchten. Die Suche und die Verarbeitung des gefundenen Wertes sind eben NICHT eine Einheit.
-
volkard schrieb:
Es tauchen keine Funktionen auf, die so einen Kommentar bräuchten. Die Suche und die Verarbeitung des gefundenen Wertes sind eben NICHT eine Einheit.
jetzt pauschalisierste aber. was immer in den schleifen passiert, es kann so speziell sein, dass es an anderer stelle absolut nutzlos wäre.
-
volkard schrieb:
;fricky schrieb:
volkard schrieb:
Ich sehe da zwei verschiedene Aussagen.
Es gibt keinen angemessenen Einsatz von goto.
Jup. Für C++ mag das stimmen.
in C++ tritt man 'ne exception los und fängt sie dahinter wieder auf, ne? (ich meine jetzt wenn man aus den verschachtelten schleifen raus will).
Nein, das ist eher Java-Stil.
Na danke für die Zurschaustellung deiner Ahnug du Provi
Würd mich wundern, wenn C und C++ kein break&continue in schleifen kennen?
-
volkard is dumm schrieb:
Würd mich wundern, wenn C und C++ kein break&continue in schleifen kennen?
das bezieht sich aber nur auf die innerste schleife. in Java gibts übrigens ein 'break' mit label um verschachtelungen zu verlassen:
... nested_loops: for(...) { while (...) { if (done) break nested_loops; } } // hier gehts weiter nach dem break ...
-
;fricky schrieb:
volkard schrieb:
Es tauchen keine Funktionen auf, die so einen Kommentar bräuchten. Die Suche und die Verarbeitung des gefundenen Wertes sind eben NICHT eine Einheit.
jetzt pauschalisierste aber. was immer in den schleifen passiert, es kann so speziell sein, dass es an anderer stelle absolut nutzlos wäre.
Beispiel?
-
;fricky schrieb:
volkard schrieb:
Ich sehe da zwei verschiedene Aussagen.
Es gibt keinen angemessenen Einsatz von goto.
Jup. Für C++ mag das stimmen.
in C++ tritt man 'ne exception los und fängt sie dahinter wieder auf, ne? (ich meine jetzt wenn man aus den verschachtelten schleifen raus will).
Man wirft in C++ oft eine Exception, und fängt die *nicht* wieder auf, wo man in C
"goto exit;"
verwenden würde. Oder macht ganz einfach"return;"
wo man in C"goto exit;"
machen würde.Anders gesagt: der Haupt-Einsatzzweck von
"goto"
in C ist IMO das Springen zum "Cleanup-Teil" einer Funktion (Files zumachen, Speicher freigeben etc.). Und genau das kann man in C++ besser lösen, ohne"goto"
.
-
;fricky schrieb:
DStefan schrieb:
Bin halt extrem goto-geschädigt.
was ist passiert mit dir und 'goto'?
Ich bin goto-geschädigt, weil ich vor Jahren in ein Projekt kam, das schon knapp zwei Jahre lief und (teilweise) vor gotos geradezu wimmelte. Das war meist richtig guter Code aber eben fast überall so ne Art "C-Mit-Klassen".
Wir haben das Projekt gepflegt, erweitert und später nach NT portiert. Und in dieser Zeit habe ich ziemlich gründlich gelernt, dass gotos im Original-Code vielleicht gar nichts böses tun. Wenn man aber an dem Code arbeiten muss, bringts einen um.
Nimm einfach nur sowas (ich weiß, das ist sehr primitiv!):
foo() { // ... if(condition) goto done // ... done: // ... }
Jetzt musst du was ändern und der natürlichste Weg wäre:
foo() { // ... if(condition) goto done // ... MyClass myObject; myObject.machwas(); // ... done: // ... }
Das geht nicht, weil das goto am Ctor von myObject vorbei springt.
Letztlich läuft es darauf hinaus, dass man die gesamte Funktion umschreiben muss. Und meine Erfahrung war halt, dass man das verdammt oft und immer wieder musste. Zundem in Funktionen, die nicht so einfach waren wie das Beispiel.
Wir haben uns letztlich allen Ernstes geweigert, Abschätzungen für Änderungen auf der "Müllhalde" abzugeben. Weil wir einfach zu oft daneben gelegen hatten. Ok, ich geb's zu, das war nicht bloß deswegen. Aber es war sehr oft deswegen.
Und nochmal: Der ursprüngliche Code war gar nicht so schlecht. Da waren Leute mit Verstand dran. Aber er war sowas von Änderungs-resistent.....
Ich glaube, volkard und andere haben schon ziemlich gut gezeigt, dass man gotos nicht wirklich braucht. Oder wenigesten fast immer nicht wirklich braucht. Was man braucht, ist gutes C++. Ehrlich: Ich möchte immer in Projekten arbeiten, wo goto verboten ist.
Stefan.
-
Ach ja: Die do-while(false)-Lösung hat zumindeste dieses Problem nicht. Oder irre ich mich?
Stefan.