it-swarm.dev

Koşulları uzun biçimlendirmek için en okunabilir yolu?

Mümkünse uzun sargı if koşullarından kaçınılmalıdır, ancak bazen hepimiz bunları yazıyoruz. Çok basit bir durum olsa bile, söz konusu ifadeler bazen sadece çok gariptir, bu nedenle tüm koşul çok uzun olur. Bunları biçimlendirmenin en okunabilir yolu nedir?

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

veya

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

veya

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

veya

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

if (thudable) {
    thud();
}

ya da başka bir tercih?

45
deceze

Genellikle, uzun bir koşul, yeniden düzenleme gerektiren kodun işaretidir, ancak bazen bundan kaçınamazsınız. Bu durumlarda, ilkini tercih ederim:

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

Çünkü bir satırda neler olduğunu anlayabilirsiniz. Ancak, mümkün olduğunda böyle bir şey yapmayı tercih ederim:

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

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

Devam etmeyi belirtmek için operatörleri sonunda tutmayı seviyorum:

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

Anlamlı değişken isimlerinin büyük bir hayranıyım:

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

if (isInAStrangeCondition) {
    thud();
}

Ya da yukarıda belirtildiği gibi bir işlev olarak refactor.

12
LennyProgrammers

Messier alt ifadelerini veya hepsini bool değişkenleri olarak ayırıyorum. Daha sonra 'if' ifadesinin üst düzey boole mantığı açıklığa kavuşturulabilir. Yaptığım işte, her zaman ORed veya ANDed gibi birkaç şey değil.

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

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

Bu, özellikle 'if' i çalıştırmadan önce tüm bools'a bakabileceğim bir hata ayıklayıcıda iyidir.

7
DarenW

Operatörleri yeni satırların başında hizalama eğilimindeyim, bu yüzden terimleri nasıl birleştirdiğimi hatırlıyorum (hem uzun mantık hem de uzun aritmetik için). Bunun gibi:

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

Bu sadece 2 boşlukla girintilendiğimde veya ortamımı çok satırlı tahminleri daha fazla girintiye ayarlayacak şekilde ayarladıysam işe yarar ya da yüklemin bittiği ve faydalı kodun nerede başladığını söylemek zor olurdu.

6
Hoa Long Tam

Ben aşağıdakilerin hayranıyım:

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

Bu şekilde hala if ifadesine benziyor, eğer ifade ise parçalara ayrılmış değil. Girinti, bir önceki çizginin devamı olduğunu göstermeye yardımcı olur.

Ayrıca, açılış köşeli parantez bir önceki satırın sonuna kadar girintili olabilir, böylece if ifadesinin olması gerektiği gibi biter.

0
EpsilonVector