Créez des variables booléennes pour chaque petite étape:
bool step1 = i + u == b || q >= a;
bool step2 = a != b && p.isGood() && group1;
bool step3 = group2 || k.isSomething() || m > n;
if (step3) { doSomething(); }
Ceci est bien sûr similaire à la réponse de Lacrymologie, sauf avec des noms différents pour chaque étape.
Si vous nommez step1
, step2
et step3
d'une manière qui a un bon sens conceptuel, cela devrait être de loin le plus lisible. p.isGood()
et k.isSomething()
peut parfois être invoqué dans des situations où il ne serait pas dans votre code d'origine, donc ce ne serait pas une option si ces fonctions sont coûteuses ou si vous exécutez ce code dans une boucle très serrée.
D'un autre côté, vous n'avez pas à vous soucier des performances que la création de nouvelles variables pourrait entraîner; un bon compilateur les optimisera.
Un exemple avec la détection de collision rectangle (que vous n'utiliseriez probablement pas en raison de la performance susmentionnée):
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(); }
Pourrait devenir:
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(); }
De plus, si vous voulez laisser votre code tel quel, je pense que ce serait tout aussi bien. Je pense honnêtement que votre code est assez lisible. Évidemment, je ne sais pas exactement ce que a b x y i u p k m n
sont, mais en ce qui concerne la structure, cela me semble bien.