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