Сделайте логические переменные для каждого маленького шага:
bool step1 = i + u == b || q >= a;
bool step2 = a != b && p.isGood() && group1;
bool step3 = group2 || k.isSomething() || m > n;
if (step3) { doSomething(); }
Это, конечно, похоже на ответ лакримологии, но с разными именами для каждого шага.
Если вы назовете step1
, step2
и так step3
, чтобы это имело хороший концептуальный смысл, это должно быть наиболее разборчиво. p.isGood()
и k.isSomething()
иногда может быть вызван в ситуациях, когда это не будет в вашем исходном коде, так что это не вариант, если эти функции дороги или если вы выполняете этот код в очень узком цикле.
С другой стороны, вам не нужно беспокоиться о падении производительности, которое может возникнуть при создании новых переменных; хороший компилятор их оптимизирует.
Пример с обнаружением столкновения прямоугольника (который вы, вероятно, не будете использовать из-за вышеупомянутого снижения производительности):
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(); }
Может стать:
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(); }
Кроме того, если вы хотите оставить свой код как есть, я думаю, что это тоже будет нормально. Честно говоря, я думаю, что ваш код вполне читабелен. Очевидно, я не знаю, что именно a b x y i u p k m n
, но что касается структуры, она выглядит хорошо для меня.