Twórz zmienne boolowskie dla każdego małego kroku:
bool step1 = i + u == b || q >= a;
bool step2 = a != b && p.isGood() && group1;
bool step3 = group2 || k.isSomething() || m > n;
if (step3) { doSomething(); }
Jest to oczywiście podobne do odpowiedzi Lacrymology, z wyjątkiem różnych nazw dla każdego kroku.
Jeśli nazwa step1
, step2
i step3
w taki sposób, że tworzą dobry koncepcyjne sens, powinno to być zdecydowanie najbardziej czytelne. p.isGood()
i k.isSomething()
czasami może zostać wywołany w sytuacjach, w których nie byłoby go w oryginalnym kodzie, więc nie byłaby to opcja, jeśli te funkcje są drogie lub jeśli uruchamiasz ten kod w bardzo ciasnej pętli.
Z drugiej strony nie musisz się martwić spadkiem wydajności, jaki może ponieść tworzenie nowych zmiennych; dobry kompilator zoptymalizuje je.
Przykład z wykrywaniem kolizji prostokąta (którego prawdopodobnie nie użyłbyś ze względu na wspomniane wcześniej pogorszenie wydajności):
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(); }
Może stać się:
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(); }
Ponadto, jeśli chcesz zostawić swój kod bez zmian, myślę, że byłoby to również w porządku. Myślę, że twój kod jest dość czytelny. Oczywiście nie wiem, czym dokładnie a b x y i u p k m n
są, ale jeśli chodzi o strukturę, wygląda mi to dobrze.