Pregunta La mejor forma de formatear la declaración if con múltiples condiciones


Si desea que se ejecute algún código basado en dos o más condiciones, ¿cuál es la mejor forma de formatear ese enunciado if?

primer ejemplo: -

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

Segundo ejemplo:

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

que es más fácil de entender y leer teniendo en cuenta que cada condición puede ser un nombre de función larga o algo así.


75
2017-10-31 10:15


origen


Respuestas:


Prefiero la Opción A

bool a, b, c;

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

Si tiene condiciones de variables / método particularmente largas, puede simplemente romperlas

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

Si son aún más complicados, entonces consideraría hacer los métodos de condición por separado fuera de la declaración if

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

En mi humilde opinión, la única razón para la opción 'B' sería si tiene else funciones para ejecutar para cada condición.

p.ej.

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

112
2017-10-31 10:20



Otras respuestas explican por qué la primera opción es normalmente la mejor. Pero si tiene varias condiciones, considere crear una función (o propiedad) por separado haciendo las verificaciones de condición en la opción 1. Esto hace que el código sea mucho más fácil de leer, al menos cuando usa buenos nombres de métodos.

if(MyChecksAreOk()) { Code to execute }

...

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

Las condiciones solo dependen de variables de alcance local, puede hacer que la nueva función sea estática y pasar todo lo que necesite. Si hay una mezcla, pase el material local.


27
2017-10-31 10:20



El primer ejemplo es más "fácil de leer".

En realidad, en mi opinión, solo debes usar el segundo cuando tengas que agregar alguna "lógica de lo demás", pero para un Condicional simple, usa el primer sabor. Si está preocupado por el largo de la condición, siempre puede usar la siguiente sintaxis:

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

¡Buena suerte!


9
2017-10-31 10:23



Se formuló la pregunta y, hasta ahora, se ha respondido como si la decisión se tomara únicamente por motivos "sintácticos".

Diría que es la respuesta correcta de cómo diseñar una serie de condiciones dentro de un if, debería depender también de la "semántica". Por lo tanto, las condiciones se deben dividir y agrupar según lo que vaya de la mano "conceptualmente".

Si dos pruebas son realmente dos caras de la misma moneda, por ej. if (x> 0) && (x <= 100) luego colócalos juntos en la misma línea. Si otra condición es conceptualmente mucho más distante, por ejemplo. user.hasPermission (Admin ()) luego póngalo en su propia línea

P.ej.

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

7
2017-10-31 11:07



El segundo es un ejemplo clásico de Flecha antipatrón Así que lo evitaría ...

Si sus condiciones son demasiado largas, extráigalas en métodos / propiedades.


4
2017-10-31 10:46



El primero es más fácil, porque si lo lees de izquierda a derecha obtienes: "Si algo Y algo así, Y algo así, ENTONCES", que es una oración fácil de entender. El segundo ejemplo dice "Si algo ENTONCES si algo falla ENTONCES si algo más ENTONCES", que es torpe.

Además, considere si desea usar algunas RUP en su cláusula. ¿Cómo lo haría en el segundo estilo?


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



Creo switch...case La declaración es la mejor manera de escribir código de orden bajo esta circunstancia, si el lenguaje de programación lo admite.

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

2
2017-12-03 07:38



En Perl puedes hacer esto:

{
  ( 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
}

Si alguna de las condiciones falla, continuará, después del bloqueo. Si está definiendo las variables que desea mantener después del bloque, deberá definirlas antes del bloque.


0
2017-10-31 23:14



Cuando la condición es realmente compleja, uso el siguiente estilo (ejemplo de la vida real de PHP):

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
        )
    )
)

Creo que es más agradable y fácil de leer que anidar varios niveles de if(). Y en algunos casos como este, simplemente no puedes dividir la condición compleja en pedazos porque de lo contrario tendrías que repetir las mismas declaraciones en if() {...} bloquear muchas veces

También creo que agregar algo de "aire" al código siempre es una buena idea. Mejora la legibilidad en gran medida.


-1
2018-02-21 10:57