Machen Sie für jeden kleinen Schritt boolesche Variablen:
bool step1 = i + u == b || q >= a;
bool step2 = a != b && p.isGood() && group1;
bool step3 = group2 || k.isSomething() || m > n;
if (step3) { doSomething(); }
Dies ist natürlich der Antwort von Lacrymology ähnlich, außer dass für jeden Schritt andere Namen verwendet werden.
Wenn Sie benennen step1
, step2
und step3
in einer Weise , die guten konzeptionellen Sinn machen, soll dies mit Abstand der meisten lesbar. p.isGood()
und k.isSomething()
kann manchmal in Situationen aufgerufen werden, in denen es nicht in Ihrem ursprünglichen Code wäre, so wäre dies keine Option, wenn diese Funktionen teuer sind oder wenn Sie diesen Code in einer sehr engen Schleife ausführen.
Auf der anderen Seite brauchen Sie sich keine Sorgen über die Leistung zu machen, die durch das Erstellen neuer Variablen entstehen könnte. Ein guter Compiler wird sie optimieren.
Ein Beispiel mit Rechteckkollisionserkennung (die Sie aufgrund des oben genannten Leistungseinbruchs wahrscheinlich nicht verwenden würden):
if((a.x + a.width >= b.x || b.x + b.width >= a.x)
&& (a.y + a.height >= b.y || b.y + b.width >= a.y)
)
{ collision(); }
Könnte werden:
bool horizMatch = a.x + a.width >= b.x || b.x + b.width >= a.x;
bool vertMatch = a.y + a.height >= b.y || b.y + b.width >= a.y;
if(horizMatch && vertMatch) { collision(); }
Auch wenn Sie Ihren Code so lassen möchten, wie er ist, wäre das meiner Meinung nach auch völlig in Ordnung. Ich denke ehrlich, dass Ihr Code gut lesbar ist. Offensichtlich weiß ich nicht genau, was genau a b x y i u p k m n
ist, aber was die Struktur angeht, sieht es für mich gut aus.