Створіть булеві змінні для кожного невеликого кроку:
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є, але що стосується структури, мені це добре виглядає.