Koşullar uzunsa biçimlendirmenin en kolay yolu? [kapalı]


43

ifMümkünse uzun sarım koşullarından kaçınılmalıdır, ancak bazen hepimiz bunları yazarız. Çok basit bir durum olsa bile, ilgili ifadeler bazen çok endişe vericidir, bu nedenle tüm koşul çok uzundur. Bunları formatlamanın en kolay 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?

Yanıtlar:


30

Çoğunlukla, eğer koşul yeniden düzenlemeye ihtiyaç duyan kodun işareti ise, fakat bazen bundan kaçınamazsınız. Bu gibi durumlarda, ilkini tercih ederim:

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

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

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

if (foo()) { ... }

3
dikey ve yana doğru kaydırmak kötü eski günlerde olduğu gibi neredeyse bir sınırlama değildir ...
Bill

2
ve insanların burada neyin test edildiğini anlamalarını sağlamak için işleve anlamlı (işletme) bir ad verin.
Matthieu M.

19

Devam edenleri 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();
}

1
Sanırım bunu sevdim. Ben de öncelik sırasını anlayabilmem için çok parantez kullanıyorum.
Jasarien

5
Mantıksal operatörleri satırın başlangıcına yerleştirmeyi tercih ederim, böylece bir satırı okuduğumda şartlı bir parçası olduğunu ve kolayca görebileceğimi görüyorum.

11

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();
}

Veya yukarıda belirtildiği gibi bir fonksiyon olarak refaktör.


7

Messier alt ifadelerini veya hepsini bool değişkenleri olarak ayırırım. Sonra 'if' ifadesinin üst düzey boolik mantığı açıklığa kavuşturulabilir. Yaptığım işlerde, her zaman ORed veya ANDed gibi birkaç şey olmaz.

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

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

Bu, özellikle 'if' komutunu çalıştırmadan önce tüm bölümlere bakabileceğim bir hata ayıklayıcıda iyidir.


Bunu da sevdim, ancak bir avantajını kaybediyorsunuz: Artık pahalı karşılaştırmaları kısa devre yapmak mümkün değil.

... Ve her gün ton değişkenleri adlandırmada çok iyi olmanız gerekir ...
cronvel

6

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

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

Bu, yalnızca 2 boşlukla girintili olursam veya ortamımı çok satırlı tahminleri girintiye ayarladıysam çalışır, aksi halde yüklemenin bittiği ve kullanışlı kodun nerede başladığını söylemek zor olabilir.


0

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, yine de bir if ifadesi gibi görünür, ifadede ise parçalara ayrılmaz. Girinti, önceki satırın bir devamı olduğunu göstermeye yardımcı olur.

Açma braketi önceki satırın sonuna gelinceye kadar girintili yapabilirsiniz, böylece olması gerektiği gibi if ifadesinin sonunda olur.


1
Bugs () yönteminizi gerçekten beğendim: D
Joe Phillips
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.