Soru Birden çok koşulu olan ifadeyi biçimlendirmenin en iyi yolu


Eğer bir kodun iki veya daha fazla koşula dayanarak yürütülmesi gerekiyorsa, bu ifadeyi biçimlendirmenin en iyi yolu hangisidir?

ilk örnek: -

if(ConditionOne && ConditionTwo && ConditionThree)
{
   Code to execute
}

İkinci örnek: -

if(ConditionOne)
{
   if(ConditionTwo )
   {
     if(ConditionThree)
     {
       Code to execute
     }
   }
}

Her koşulun uzun bir işlev adı veya bir şey olabileceğini akılda tutarak anlamak ve anlamak için en kolay olanı.


76
2017-10-31 10:15


Menşei




Cevaplar:


Seçenek A'yı tercih ederim

bool a, b, c;

if( a && b && c )
{
   //This is neat & readable
}

Özellikle uzun değişkenler / yöntem koşulları varsa, bunları kesebilirsiniz

if( VeryLongConditionMethod(a) &&
    VeryLongConditionMethod(b) &&
    VeryLongConditionMethod(c))
{
   //This is still readable
}

Daha da karmaşıksa, bu durumda, if deyiminin dışında ayrı olarak durum yöntemlerini yapmayı düşünürdüm

bool aa = FirstVeryLongConditionMethod(a) && SecondVeryLongConditionMethod(a);
bool bb = FirstVeryLongConditionMethod(b) && SecondVeryLongConditionMethod(b);
bool cc = FirstVeryLongConditionMethod(c) && SecondVeryLongConditionMethod(c);

if( aa && bb && cc)
{
   //This is again neat & readable
   //although you probably need to sanity check your method names ;)
}

IMHO 'B' seçeneği için tek sebep, eğer ayrı else her koşul için çalışacak işlevler.

Örneğin.

if( a )
{
    if( b )
    {
    }
    else
    {
        //Do Something Else B
    }
}
else
{
   //Do Something Else A
}

112
2017-10-31 10:20



Bunu sevdim. Metodun büyük bir hayranı olmamasına rağmen, yöntemler zaten mevcut olmadıkça ve bir boole değeri döndürmedikçe. - Thomas Owens
Akıl kontrol yöntemi isimleri için +1 - Aidan Miles
İkinci örnekte her şeyi bir sebep olmadan değerlendirmiyor musunuz? - Odys


Diğer cevaplar ilk seçeneğin neden normalde en iyi olduğunu açıklıyor. Ancak, birden fazla koşulunuz varsa, seçenek 1'deki durum denetimlerini yaparken ayrı bir işlev (veya özellik) oluşturmayı düşünün. Bu, en azından iyi yöntem adları kullandığınızda, kodun okunmasını daha kolay hale getirir.

if(MyChecksAreOk()) { Code to execute }

...

private bool MyChecksAreOk()
{ 
    return ConditionOne && ConditionTwo && ConditionThree;
}

Koşullar sadece yerel kapsam değişkenlerine dayanır, yeni işlevi statik hale getirebilir ve ihtiyacınız olan her şeyi iletebilirsiniz. Bir karışım varsa, yerel malzemelere geçin.


27
2017-10-31 10:20



Bunu daha sonradan koşullara eklemek için en etkili ve kolay buldum - pbojinov
+1 mükemmel öneri! - R Thiede
İlk başta +1 bir kaş kaldırdı ama bu gerçekten en iyi cevap imho. bu boole sahip isOkToDoWhatever bir özellik olarak çok mantıklı. - grinch
fonksiyonlar mantığın soyutlanması için iyidir, onları kullanın! - loujaybee
Ama bu sadece başka bir yerde aynı karmaşık durumu taşır ayrıca okunabilir olmalı Yani bununla bire kareye geri döndük. Sadece ilgili değil ifdeyim okunabilirliği, ancak durum okunabilirliği. - Robert Koritnik


İlk örnek daha "okunması kolay".

Aslında, benim görüşüme göre, sadece "mantıksal" eklemek istediğinizde ikinciyi kullanmalısınız, fakat basit bir Koşul için ilk lezzetini kullanın. Durumun uzun sürmesinden endişe ediyorsanız, her zaman bir sonraki sözdizimini kullanabilirsiniz:

if(ConditionOneThatIsTooLongAndProbablyWillUseAlmostOneLine
                 && ConditionTwoThatIsLongAsWell
                 && ConditionThreeThatAlsoIsLong) { 
     //Code to execute 
}

İyi şanslar!


9
2017-10-31 10:23





Şimdiye kadar sorulmuş ve karar, "sözdizimsel" gerekçelerle yapılmalıdır.

Bir koşulda bir dizi koşulu nasıl belirlediğinize dair doğru cevabı söyleyebilirim. gerektiğini "semantiğe" de bağlı olmak. Bu yüzden koşullar “kavramsal olarak” bir araya getirilen şeylere göre ayrılmalı ve gruplandırılmalıdır.

Eğer iki test gerçekten de aynı madalyonun iki yüzü ise. (x> 0) && (x <= 100) ise, aynı satırda bir araya getirin. Başka bir durum kavramsal olarak daha uzaksa, örn. user.hasPermission (Admin ()) daha sonra kendi satırına koy

Örneğin.

if user.hasPermission(Admin()) {
   if (x >= 0) && (x < 100) {
      // do something
   }
}

7
2017-10-31 11:07





İkincisi klasik bir örneğidir. Ok anti- desen Öyleyse bundan kaçarım.

Koşullarınız çok uzunsa bunları metotlara / özelliklere aktarın.


4
2017-10-31 10:46





Birincisi daha kolay çünkü eğer soldan sağa okursanız şunu elde edersiniz: "Eğer bir şey VE bir şey daha sonra bir şey SONRA", bir cümle anlamak kolay. İkinci örnek, "eğer bir şey daha sonra bir şey olursa, eğer bir şey olursa, hantal" diye yazıyor.

Ayrıca, kendi cümlenizde bazı OR'leri kullanmak isteyip istemediğinizi düşünün - bunu ikinci tarzda nasıl yaparsınız?


3
2017-10-31 10:16





    if (   ( single conditional expression A )
        && ( single conditional expression B )
        && ( single conditional expression C )
       )
    {
       opAllABC();
    }
    else
    {
       opNoneABC();
    }

Formatting a multiple conditional expressions in an if-else statement this way:
1) allows for enhanced readability:
    a) all binary logical operations {&&, ||} in the expression shown
       first
    b) both conditional operands of each binary operation are obvious
       because they align vertically
    c) nested logical expressions operations are made obvious using
       indentation, just like nesting statements inside clause
2) requires explicit parenthesis (not rely on operator precedence rules)
    a) this avoids a common static analysis errors
3) allows for easier debugging
    a) disable individual single conditional tests with just a //
    b) set a break point just before or after any individual test
    c) e.g. ...

    // disable any single conditional test with just a pre-pended '//'
    // set a break point before any individual test
    // syntax '(1 &&' and '(0 ||' usually never creates any real code
    if (   1
        && ( single conditional expression A )
        && ( single conditional expression B )
        && (   0
            || ( single conditional expression C )
            || ( single conditional expression D )
           )
       )
    {
       ... ;
    }

    else
    {
       ... ;
    }

3
2018-04-19 22:01





inanıyorum switch...case Programlama dili destekliyorsa, bu durumda derli toplu kod yazmanın en iyi yoludur.

switch (//variable or Boolean) {
  case //Condition A:
  case //Condition B:
  case //Condition C:
    //Code to execute;
}

2
2017-12-03 07:38



Güzel olabilir ama "kısa devre" / tembel değerlendirmenin "avantajını" kaldırır. - TheLibrarianCz


Perl'de bunu yapabilirsin:

{
  ( VeryLongCondition_1 ) or last;
  ( VeryLongCondition_2 ) or last;
  ( VeryLongCondition_3 ) or last;
  ( VeryLongCondition_4 ) or last;
  ( VeryLongCondition_5 ) or last;
  ( VeryLongCondition_6 ) or last;

  # Guarded code goes here
}

Koşullardan herhangi biri başarısız olursa, bloktan sonra devam eder. Bloktan sonra etrafta tutmak istediğiniz herhangi bir değişken tanımlarsanız, bunları bloktan önce tanımlamanız gerekir.


0
2017-10-31 23:14



Bu Perlish'e benziyor - "NE yapar?" sense;) Ama buna alıştığınızda, aslında okunabilir. - Piskvor


Durum gerçekten karmaşık olduğunda aşağıdaki stili kullanıyorum (PHP gerçek yaşam örneği):

if( $format_bool &&
    (
        ( isset( $column_info['native_type'] )
            && stripos( $column_info['native_type'], 'bool' ) !== false
        )
        || ( isset( $column_info['driver:decl_type'] )
            && stripos( $column_info['driver:decl_type'], 'bool' ) !== false
        )
        || ( isset( $column_info['pdo_type'] )
            && $column_info['pdo_type'] == PDO::PARAM_BOOL
        )
    )
)

Birden çok seviyenin yerleştirilmesinden daha güzel ve okunabilir olduğuna inanıyorum. if(). Ve bunun gibi bazı durumlarda karmaşık koşulu parçalara ayıramazsınız, çünkü aksi halde aynı ifadeleri tekrarlamak zorunda kalırsınız. if() {...} birçok kez engellemek.

Ayrıca, kod içine bazı "hava" eklenmesi her zaman iyi bir fikir olduğuna inanıyorum. Okunabilirliği büyük ölçüde artırır.


-1
2018-02-21 10:57





Sanırım C sadece yazamazsın:

if ( variable = (1 || 2 || 3) ) {
    do stuff;
}

Ya da kullanmak daha iyidir switch Beyan?


-4
2018-03-19 08:01