Frage Die beste Möglichkeit zum Formatieren von if-Anweisungen mit mehreren Bedingungen


Wenn Sie einen Code ausführen möchten, der auf zwei oder mehr Bedingungen basiert, was die beste Art ist, diese if-Anweisung zu formatieren?

erstes Beispiel: -

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

Zweites Beispiel: -

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

Das ist am leichtesten zu verstehen und zu lesen, wenn man bedenkt, dass jede Bedingung ein langer Funktionsname oder etwas sein kann.


75
2017-10-31 10:15


Ursprung


Antworten:


Ich bevorzuge Option A

bool a, b, c;

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

Wenn Sie besonders lange Variablen / Methodenbedingungen haben, können Sie sie einfach in eine Linie bringen

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

Wenn sie noch komplizierter sind, würde ich die Konditionsmethoden außerhalb der if-Anweisung separat betrachten

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 Der einzige Grund für die Option "B" wäre, wenn Sie getrennt haben else Funktionen, die für jede Bedingung ausgeführt werden.

z.B.

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

112
2017-10-31 10:20



Andere Antworten erklären, warum die erste Option normalerweise die beste ist. Wenn Sie jedoch mehrere Bedingungen haben, sollten Sie in Erwägung ziehen, eine separate Funktion (oder Eigenschaft) zu erstellen, die die Bedingungsprüfungen in Option 1 durchführt. Dadurch wird der Code wesentlich lesbarer, zumindest wenn Sie gute Methodennamen verwenden.

if(MyChecksAreOk()) { Code to execute }

...

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

Wenn sich die Bedingungen nur auf lokale Bereichsvariablen beziehen, können Sie die neue Funktion statisch machen und alles, was Sie benötigen, übergeben. Wenn es eine Mischung gibt, gib die lokalen Sachen weiter.


27
2017-10-31 10:20



Das erste Beispiel ist "leichter zu lesen".

Meiner Meinung nach sollten Sie die zweite nur verwenden, wenn Sie etwas "andere Logik" hinzufügen müssen, aber für eine einfache Bedingung verwenden Sie die erste Variante. Wenn Sie sich Sorgen um die Länge der Bedingung machen, können Sie immer die nächste Syntax verwenden:

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

Viel Glück!


9
2017-10-31 10:23



Die Frage wurde gestellt und bisher beantwortet, als ob die Entscheidung rein "syntaktisch" getroffen werden sollte.

Ich würde sagen, dass die richtige Antwort, wie Sie eine Reihe von Bedingungen in einem If, sollen auch von "Semantik" abhängen. Also sollten die Bedingungen aufgeteilt und gruppiert werden, je nachdem, welche Dinge "konzeptionell" zusammengehören.

Wenn zwei Tests wirklich zwei Seiten derselben Münze sind, z. Wenn (x> 0) && (x <= 100), dann füge sie in der gleichen Zeile zusammen. Wenn eine andere Bedingung konzeptionell weit entfernter ist, z. user.hasPermission (Admin ()) dann auf eine eigene Zeile setzen

Z.B.

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

7
2017-10-31 11:07



Der zweite ist ein klassisches Beispiel für die Pfeil Anti-Muster Also ich würde es vermeiden ...

Wenn Ihre Bedingungen zu lang sind, extrahieren Sie sie in Methoden / Eigenschaften.


4
2017-10-31 10:46



Die erste ist einfacher, denn wenn Sie sie von links nach rechts lesen, erhalten Sie: "Wenn etwas und etwas UND dann irgendwas DANN", was ein leicht verständlicher Satz ist. Das zweite Beispiel lautet "Wenn etwas DANN, wenn etwas DANN, wenn etwas anderes DANN", das ist tollpatschig.

Überlegen Sie auch, ob Sie einige ORs in Ihrer Klausel verwenden möchten - wie würden Sie das im zweiten Stil tun?


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



Ich glaube switch...case Anweisung ist der beste Weg, unter diesen Umständen sauberen Code zu schreiben, wenn die Programmiersprache dies unterstützt.

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

2
2017-12-03 07:38