Haga variables booleanas para cada pequeño paso:
bool step1 = i + u == b || q >= a;
bool step2 = a != b && p.isGood() && group1;
bool step3 = group2 || k.isSomething() || m > n;
if (step3) { doSomething(); }
Por supuesto, esto es similar a la respuesta de Lacrymology, excepto con diferentes nombres para cada paso.
Si nombra step1
, step2
y step3
de manera que tenga un buen sentido conceptual, este debería ser, con mucho, el más legible. p.isGood()
y a k.isSomething()
veces puede invocarse en situaciones en las que no estaría en su código original, por lo que esta no sería una opción si esas funciones son caras o si está ejecutando este código en un ciclo muy cerrado.
Por otro lado, no necesita preocuparse por el impacto en el rendimiento en el que podría incurrir la creación de nuevas variables; un buen compilador los optimizará.
Un ejemplo con la detección de colisión rectangular (que probablemente no usaría debido al impacto de rendimiento mencionado anteriormente):
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(); }
Podría convertirse:
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(); }
Además, si quieres dejar tu código como está, creo que eso también estaría totalmente bien. Sinceramente, creo que su código es bastante legible. Obviamente no sé qué a b x y i u p k m n
son exactamente , pero en lo que respecta a la estructura, me parece bien.