it-swarm-eu.dev

Nejčitelnější způsob formátování dlouho, pokud podmínky?

Pokud je to možné, je třeba se vyhnout podmínkám dlouhého vinutí if, ale někdy je nakonec všichni napíšeme. I když je to velmi jednoduchá podmínka, související prohlášení jsou někdy prostě velmi hnusná, takže celá podmínka končí velmi zdlouhavou. Jaký je nejčitelnější způsob, jak je formátovat?

if (FoobarBaz::quxQuux(corge, grault) || !garply(waldo) || fred(plugh) !== xyzzy) {
    thud();
}

nebo

if (
    FoobarBaz::quxQuux(corge, grault)
 || !garply(waldo)
 || fred(plugh) !== xyzzy
) {
    thud();
}

nebo

if (FoobarBaz::quxQuux(corge, grault)
    || !garply(waldo)
    || fred(plugh) !== xyzzy) {
    thud();
}

nebo

thudable = FoobarBaz::quxQuux(corge, grault);
thudable ||= !garply(waldo);
thudable ||= fred(plugh) !== xyzzy;

if (thudable) {
    thud();
}

nebo jiné preference?

45
deceze

Často je dlouhá podmínka, pokud je znakem kódu, který potřebuje refaktoring, ale někdy tomu nemůžete zabránit. V těchto případech dávám přednost prvnímu:

if (bar || baz || quux) { ... }

Protože jste schopni říct, co se děje s jedním řádkem. Pokud je to však možné, raději bych něco takového udělal:

function foo() {
  return bar || baz || quux;
}

if (foo()) { ... }
32
user8

Rád držím operátory na konci, aby naznačoval pokračování:

if (the_function_being_called() != RETURNCODE_SUCCESS &&
    the_possibly_useful_recovery_strategy() == RETURNCODE_EPICFAIL &&
    this_user_has_elected_to_recieve_error_reports)
{
    report_error();
}
21
AShelly

Jsem velkým fanouškem smysluplných proměnných jmen:

const bool isInAStrangeCondition =
    FoobarBaz::quxQuux(corge, grault) ||
    !garply(waldo) ||
    fred(plugh) !== xyzzy;

if (isInAStrangeCondition) {
    thud();
}

Nebo refaktor jako funkce, jak je uvedeno výše.

12
LennyProgrammers

Rozdělím Messierovy podvýrazy nebo všechny z nich jako boolovské proměnné. Pak může být vyjasněna logická logika nejvyšší úrovně loga 'if'. V práci, kterou dělám, to není vždy několik věcí ORED nebo ANDed.

bool goodblah = some_mess < whatever;
bool frobnacious = messy_crud != junky_expression;
bool yetanother = long_winded_condition;

if (goodblah || (frobnacious && yetanother))   {
    ...
}

To je zvláště dobré v debuggeru, kde se mohu podívat na všechny bools, než provedu 'if'.

7
DarenW

Mám sklon zarovnat operátory na začátku nových linek, takže si pamatuji, jak kombinuji termíny (jak pro dlouhou logiku, tak pro dlouhou aritmetiku). Takhle:

if (first_attempt(data) == SUCCESS
    || (reusable(data) && second_attempt(data) == SUCCESS)
    || (still_reusable(data) && third_attempt(data) == SUCCESS))
  return SUCCESS;

Funguje to pouze tehdy, pokud odsadím 2 mezery nebo nastavím prostředí, aby více predikovalo víceřádkové predikáty, jinak by bylo obtížné zjistit, kde končí predikát a začíná užitečný kód.

6
Hoa Long Tam

Jsem fanouškem následujícího:

if (really_long_expression && another_really_really_long_expression && 
            another_very_long_expression_OMG_id_it_long){
    bugs();
}

Tímto způsobem to stále vypadá jako výraz if a ne jako rozbitý výraz na kusy if. Odsazení pomáhá ukázat, že se jedná o pokračování předchozího řádku.

Můžete ji také odsadit, dokud se úvodní závorka nedostane na konec předchozího řádku, takže je na konci výrazu if, jak má být.

0
EpsilonVector