do{}while(false); -- ein besseres goto?
-
Hallo. Ich bin in einem Projekt öfter auf code dieser Form gestoßen:
do { // some code if ( someCondition ) { // do something break; } if ( someOtherCondition ) { // do something break; } // more code if ( yetAnotherCondition ) { break; } // still more code } while ( false );
Das ist doch bloß goto code, ohne goto hinzuschreiben, oder? Naja, die Sprungmarke spart man sich auch noch.
Was haltet ihr davon? Gibt es irgendwelche Gründe solchen code zu schreiben?
Sagen wir, es liegt eine Situation vor, wo gotos Sinn machen. Ist diese Form besser lesbar, oder hat man dies hier nur obfuskiert, um einer Suche nach goto keine Treffer zu schenken?
-
Ich find's ein winzig kleines Bischen besser als goto. Schreiben würde ich es aber nie.
Und ich weigere mich kategorisch anzuerkennen, dass es Situationen gibt, wo goto tatsächlich die beste Wahl ist (also "Sinn macht")
Stefan.
-
Deutlich schlechter als goto. In die Namen der Sprungmarken kann man nämlich viel mehr Bedeutung legen, als in ein break. Und das schlimmste, was man machen kann, ist zu lügen, und das do da log.
{ // some code if ( someCondition ) { // do something goto datenDochNichtSenden; } if ( someOtherCondition ) { // do something goto datenDochNichtSenden; } ...
-
DStefan schrieb:
Ich find's ein winzig kleines Bischen besser als goto.
Jetzt ist bei mir aber durch und ich nehme Dich nicht mehr ernst.
-
Stilist schrieb:
Ist diese Form besser lesbar, oder hat man dies hier nur obfuskiert...
Ja, das hat man. Zuerst verwirrt es den Leser. Ich würde sowas nie programmieren
-
Stilist schrieb:
Sagen wir, es liegt eine Situation vor, wo gotos Sinn machen.
Daran muß ich nicht glauben. Konkrete Fragen wie ist A oder B besser, kann man zu beantworten versuchen. Aber generelle Aussagen?
Stilist schrieb:
Ist diese Form besser lesbar, oder hat man dies hier nur obfuskiert, um einer Suche nach goto keine Treffer zu schenken?
Kann sein, daß man Software-Metriker veralbern will. Kann sein, daß der Chef bei goto regelrecht ausflippt, statt nachzudenken, ob's tatsächlich ok war. Aber für am wahrscheinlichsten halte ich es, daß der Programmierer lieber an was glaubt, als selber nachzudenken, und er glaubt halt, goto sei Teufelswerk.
-
Vielleicht sollte man noch erwähnen, dass es MISRA Regeln gibt, die besagen:
The goto statement shall not be used.
The continue statement shall not be used.
The break statement shall not be used (except to terminate the cases of a switch statement).
Als Erklärung steht da:These three rules are in the interests of good structured programming.
Und was mir gerade zu "except to terminate the cases of a switch statement" einfällt, wenn man's unbedingt will, kann man's ja komplett ohne break machen:switch (a) { case 0: { ...; } if (false) case 1: { ...; } if (false) case 2: { ...; } if (false) ... }
-
abc.w schrieb:
The goto statement shall not be used.
The continue statement shall not be used.
The break statement shall not be used (except to terminate the cases of a switch statement).
Als Erklärung steht da:These three rules are in the interests of good structured programming.
Das kann nichts taugen, wenn sich Regeln und die Erklärung schon widersprechen
-
abc.w schrieb:
Vielleicht sollte man noch erwähnen, dass es MISRA Regeln gibt
Ja, aber außer in der Automobilindustrie glaubt man nicht an sie. Zu recht, wie ich finde.
-
Ja, aber vielleicht ließe sich mit diesen Regeln der Code des Thread-Erstellers vermeiden...
-
volkard schrieb:
abc.w schrieb:
Vielleicht sollte man noch erwähnen, dass es MISRA Regeln gibt
Ja, aber außer in der Automobilindustrie glaubt man nicht an sie.
*lach*
-
abc.w schrieb:
Ja, aber vielleicht ließe sich mit diesen Regeln der Code des Thread-Erstellers vermeiden...
if...else if...else if...usw. solltens auch tun. MISRA-regeln sind aber trotzdem ziemlicher blödsinn.
-
;fricky schrieb:
abc.w schrieb:
Ja, aber vielleicht ließe sich mit diesen Regeln der Code des Thread-Erstellers vermeiden...
if...else if...else if...usw. solltens auch tun.
Ja, man sollte aber noch eine solche Kette von "if-else if" mit einem "else" abschließen
. Es gibt, glaube ich, eine MISRA Regel dazu... Also ungefähr so:
if (...)
{
...;
}
else if (...)
{
...;
}
else if (...)
{
...;
}
else
{
...;
};fricky schrieb:
MISRA-regeln sind aber trotzdem ziemlicher blödsinn.
Nein.
-
Stilist schrieb:
Hallo. Ich bin in einem Projekt öfter auf code dieser Form gestoßen:
do { // some code if ( someCondition ) { // do something break; } if ( someOtherCondition ) { // do something break; } // more code if ( yetAnotherCondition ) { break; } // still more code } while ( false );
Wer solchen Code schreibt (egal ob mit goto oder break), der hat sowieso keine Ahnung wie man Programme ordentlich strukturiert.
-
abc.w schrieb:
Ja, man sollte aber noch eine solche Kette von "if-else if" mit einem "else" abschließen
. Es gibt, glaube ich, eine MISRA Regel dazu...
kommt drauf an, was es bedeutet oder ob es überhaupt eine rolle spielt, wenn keine der bedingungen zutrifft. irgendwelche regeln, die immer else-zweige vorschreiben (die dann meistens leer sind), finde ich eher kontaproduktiv.
abc.w schrieb:
;fricky schrieb:
MISRA-regeln sind aber trotzdem ziemlicher blödsinn.
Nein.
[/quote]
ok, wenn absolute noobs programmieren, mag MISRA sie vor den schlimmsten fehlern bewahren. aber einen, der schon etwas besser programmieren kann, stört sowas nur.
-
Ich denke, den Noobs bringt es auch nichts. Es sind die Schmuddelkinder, die Schmierfinken, die Frickler und die Forscher, denen Einhalt geboten werden soll, denke ich. Nicht die Tätigkeiten sollen unterbunden werden, sondern die Gruppen, die diesen Tätigkeiten zugeneigt sind, werden vergault.
-
hihi,
MISRA C 2004 seems a step backwards and attempts at compliance with either document are essentially pointless until something is done about improving the wording of the standard and its match with existing experimental data. In its current form, the complexity and noisiness of the rules suggest that only the tool vendors are likely to benefit.
-
volkard schrieb:
DStefan schrieb:
Ich find's ein winzig kleines Bischen besser als goto.
Jetzt ist bei mir aber durch und ich nehme Dich nicht mehr ernst.
Das trifft mich wirklich hart! Ich glaube, ich werde mir einen anderen Nick zulegen.
Andererseits nehme ich natürlich goto-Liebhaber auch nicht ernst.
Stefan.
-
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?
-
;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.
Stefan.