Abgesehen von einigen Smart/Hacky Verwendungen von verschiedenen Schlüsselwörtern, um das gleiche Verhalten zu erhalten, oder Hinzufügen mehr oder weniger komplexe zusätzliche Vorlagen oder Makros, um unless()
Schlüsselwort zu bekommen oder irgendwie zu injizieren !
Operator, würde ich bleiben nur die grundlegenden Dinge.
Dies ist einer der Orte, die ich würde (wahrscheinlich) injizieren extra „unnötig“ Klammern:
void someFunction()
{
// some other code
{ State s = loadSomething(); if(!s) return s; }
// some other code
}
jedoch in genau diesem Fall würde ich es erweitern das return
Schlüsselwort zu betonen, was leicht übersehen werden kann, wenn es zu einem Einzeiler gequetscht wird. Also, es sei denn, die Einzeiler viele Male wiederholt wird und es sei denn, es ist klar, & offensichtlich, dass es einen return
innen, würde ich wahrscheinlich schreiben:
void someFunction()
{
// some other code
{
State s = loadSomething();
if(!s)
return s;
}
// some other code
}
Es könnte so aussehen, den Umfang der s
erhebend, aber es tatsächlich entspricht der Deklaration State s
in if()
. Alles dank der zusätzlichen Klammern, die die Sichtbarkeit von lokalen s
explizit einschränken.
Allerdings "hassen" manche Leute, { .. }
nicht mit einem Schlüsselwort/class/function/etc gekoppelt zu sehen, oder halten es sogar für unlesbar, weil "vorgeschlagen wurde, dass ein if/while/etc-Schlüsselwort versehentlich gelöscht wurde".
Eine weitere Idee kam zu mir, nachdem Sie das sich wiederholende Beispiel hinzugefügt haben. Sie könnten einen Trick bekannt aus Skriptsprachen versucht, wo &&
und ||
einen nicht-Bool Werte zurückgeben können:
State s = loadFoobar(&loadPointer, &results);
s = s || loadBaz(&loadPointer, &results);
s = s || loadBuz(&loadPointer, &results);
if(!s) return s;
aber es gibt ein Problem: Im Gegensatz zu Skriptsprachen, in C++ solche Überlastungen von &&
und ||
lose their short-circuit semantics der macht diesen Versuch sinnlos.
jedoch als dyp wies auf die offensichtliche Sache aus, sobald der s
Umfang erhöht, jetzt einfach if
wieder eingeführt werden kann.
{
State s;
if(!(s = loadFoobar(&loadPointer, &results))) return s;
if(!(s = loadBaz(&loadPointer, &results))) return s;
if(!(s = loadBuz(&loadPointer, &results))) return s;
}
I suppo se diesen Staat einen Bool Operator hat, rechts: die Sichtbarkeit kann mit extra
{}
begrenzt wieder werden? – Brahim@ Brahim richtig, das ist wahr –
und Sie wollen nicht den Geltungsbereich von 's' außerhalb des' if' Blocks erhöhen, richtig? – CoryKramer