Faça variáveis booleanas para cada pequena etapa:
bool step1 = i + u == b || q >= a;
bool step2 = a != b && p.isGood() && group1;
bool step3 = group2 || k.isSomething() || m > n;
if (step3) { doSomething(); }
Naturalmente, isso é semelhante à resposta da lacrologia, exceto com nomes diferentes para cada etapa.
Se você citar step1
, step2
e step3
de maneiras que façam um bom senso conceitual, isso deve ser de longe o mais legível. p.isGood()
e k.isSomething()
às vezes pode ser invocado em situações em que não estaria no seu código original; portanto, isso não seria uma opção se essas funções fossem caras ou se você estiver executando esse código em um loop muito restrito.
Por outro lado, você não precisa se preocupar com o impacto no desempenho que pode resultar na criação de novas variáveis; um bom compilador os otimizará.
Um exemplo com detecção de colisão de retângulo (que você provavelmente não usaria devido ao desempenho acima mencionado):
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(); }
Pode se tornar:
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(); }
Além disso, se você quiser deixar seu código como está, acho que também seria ótimo. Sinceramente, acho que seu código é bastante legível. Obviamente, não sei exatamente o que a b x y i u p k m n
são, mas, no que diz respeito à estrutura, parece bom para mim.