Crea variabili booleane per ogni piccolo passaggio:
bool step1 = i + u == b || q >= a;
bool step2 = a != b && p.isGood() && group1;
bool step3 = group2 || k.isSomething() || m > n;
if (step3) { doSomething(); }
Questo è ovviamente simile alla risposta di Lacrymology, tranne che con nomi diversi per ogni passaggio.
Se nominate step1, step2e step3in modi che hanno un buon senso concettuale, questo dovrebbe essere di gran lunga il più leggibile. p.isGood()e a k.isSomething()volte può essere invocato in situazioni in cui non sarebbe nel tuo 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 è necessario preoccuparsi dell'hit di prestazioni che potrebbe comportare la creazione di nuove variabili; un buon compilatore li ottimizzerà.
Un esempio con il rilevamento delle collisioni rettangolari (che probabilmente non useresti a causa del summenzionato hit delle prestazioni):
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 anche bene. Sinceramente penso che il tuo codice sia abbastanza leggibile. Ovviamente non so cosa a b x y i u p k m nsiano esattamente , ma per quanto riguarda la struttura, mi sembra buono.