Geht das irgendwie eleganter?

28/09/2015 - 15:24 von Helmut Zeisel | Report spam
Ich habe eine Code, der im Wesentlichen folgende Struktur hat:

Condition1 c1;
if(c1.fail())
{
return;
}
Condition2 c2(c1);
if(c2.fail())
{
return;
}
...
ConditionN cN(c1,c2,...);
if(cN.fail())
{
return;
}
do_something(c1,c2,...,cN);
return;

Im Prinzip schaut das wie Exceptions aus, nur ist es so, dass in den meisten Durchlàufen eine der Bindgungen c1,c2,...cN fehlschlàgt und doSomething() nur in weniger als z.B. 1% der Fàlle ausgeführt wird.

Meine Frage: làsst sich das irgendwie schoener schreiben, ohne dass ich die vielen

if(cX.fail())
{
return;
}

stàndig wiederholen muss?

Die beste Loesung, die ich bisher gefunden habe, besteht darin, Default Konstruktoren fuer die ConditionX einzufuehren, die noetigen cX in fail() als Parameter zu uebergeben und die Kurzschlussauswertung fuer boolsche Ausdruecke zu verwenden:

Condition1 c1;
Condition2 c2;
...
ConditionN cN;

if(c1.fail()
|| c2.fail(c1)
|| c3.fail(c1,c2)
...
|| cN.fail(c1,c2,...)
{
return;
}
do_something(c1,c2,...,cN);
return;

Ich bin damit aber noch immer nicht voellig zufrieden, weil ich erstens viele cX unnoetig anlege, obwohl sie moeglicherweise gar nicht benoetigt werden, und zweitens das "fail" jetzt zwei Aufgaben vermischt, nàmlich die Daten aufzubereiten und dann den Fehlerstatus zurueckzugegeben.

Hat wer eine bessere Idee?

Helmut

PS: Irgendwie erinnert mich das ein wenig an "Alternate Returns", die in manchen uralten FORTRAN Programmen zur Fehlerbehandlung eingesetzt werden/wurden.
 

Lesen sie die antworten

#1 Stefan Reuther
28/09/2015 - 17:27 | Warnen spam
Am 28.09.2015 um 15:24 schrieb Helmut Zeisel:
Ich habe eine Code, der im Wesentlichen folgende Struktur hat:

Condition1 c1;
if(c1.fail())
{
return;
}
Condition2 c2(c1);
if(c2.fail())
{
return;
}


[...]
Meine Frage: làsst sich das irgendwie schoener schreiben, ohne dass ich die vielen



Was passiert denn mit dem 'c1' im Konstruktor von 'c2'?

Mein erster Gedanke wàre ja, 'c2' auf 'c1.fail()' prüfen zu lassen, so
dass am Ende nur noch
Condition c1;
Condition c2(c2);
...
Condition cN(c1, c2, ...);
if (cN.fail()) { return; }
übrigbleibt.

Wenn die Konstruktoren in den Innereien ihrer Parameter rumgraben, ist
das natürlich keine (schöne) Option.


Stefan

Ähnliche fragen