Haz 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 nombres diferentes para cada paso.
Si nombras step1
, step2
y step3
de manera que tenga un buen sentido conceptual, esto debería ser el más legible. p.isGood()
y k.isSomething()
a veces pueden invocarse en situaciones en las que no estaría en su código original, por lo que no sería una opción si esas funciones son caras o si está ejecutando este código en un bucle muy ajustado .
Por otra parte, no tiene que preocuparse por el impacto en el rendimiento en el que incurra la creación de nuevas variables; un buen compilador los optimizará.
Un ejemplo con detección de colisión de rectángulo (que probablemente no usaría debido al acierto 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 en:
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 desea dejar su código como está, creo que eso también sería totalmente correcto. Sinceramente, creo que su código es bastante legible. Obviamente, no sé qué es exactamente a b x y i u p k m n
, pero en lo que respecta a la estructura, me parece bien.