Crea variabili booleane per ogni piccolo passo:
bool step1 = i + u == b || q >= a;
bool step2 = a != b && p.isGood() && group1;
bool step3 = group2 || k.isSomething() || m > n;
if (step3) { doSomething(); }
Ovviamente è simile alla risposta di Lacrymology, tranne che con nomi diversi per ogni passo.
Se chiami step1
, step2
e step3
in modi che hanno un buon senso concettuale, questo dovrebbe essere di gran lunga il più leggibile. p.isGood()
e k.isSomething()
a volte possono essere invocati in situazioni in cui non sarebbe nel codice originale, quindi questa non sarebbe un'opzione se quelle funzioni sono costose o se stai eseguendo questo codice in un ciclo molto stretto .
D'altra parte, non ti devi preoccupare del colpo di performance che potrebbe causare la creazione di nuove variabili; un buon compilatore li ottimizzerà.
Un esempio di rilevamento delle collisioni rettangolari (che probabilmente non utilizzeresti a causa del risultato prestazionale di cui sopra):
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(); }
Potrebbe diventare:
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(); }
Inoltre, se vuoi lasciare il tuo codice così com'è, penso che andrebbe benissimo anche a me. Sinceramente penso che il tuo codice sia abbastanza leggibile. Ovviamente non so quali siano esattamente a b x y i u p k m n
, ma per quanto riguarda la struttura, mi sembra bello.