Siempre estoy en el hábito de uso de if, else-if instrucción en lugar de varias sentencias if.

Ejemplo:

int val = -1;
if (a == b1) {
   return c1;
} else if (a == b2) {
   return c2;
} ...
...
} else {
   return c11;
}

¿Cómo se compara a ejemplo 2:

if (a == b1) {
   return c1;
}
if (a == b2) {
   return c2;
}
....

if (a == b11) {
   return c11;
}

Sé funcionalidad sabios que son el mismo. Pero es la mejor práctica para hacer si otra cosa-si, o no? Es criado por uno de mis amigos cuando me señaló que él podría estructura de la base de código de forma diferente para hacer más limpio. Ya es un hábito para mí por mucho tiempo, pero nunca me he preguntado por qué.

  • Idioma que te refieres? Java o C++?
  • es de java para mí, pero he estado usando c++ y Java para largo…
  • Es una diferencia importante, porque puede implementar operator== en C++ para hacer desagradable (lado effecty) cosas (que tiene también una influencia en la optimización …). AFAICR esto no funciona en Java.
InformationsquelleAutor Lily | 2012-02-07

13 Comentarios

  1. 59

    if-elseif-else declaraciones dejar de hacer comparaciones tan pronto como se encuentra uno que es cierto. if-if-if hace cada comparación. El primero es más eficiente.

    Edición: Se ha señalado en el comentario que hacer un return dentro de cada if bloque. En estos casos, o en los casos donde el control dejará el método (excepciones), no hay ninguna diferencia entre hacer múltiples if declaraciones y haciendo if-elseif-else declaraciones.

    Sin embargo, es recomendable usar if-elseif-else de todos modos. Supongamos que cambiar su código para que usted no hace un return en cada if bloque. Entonces, para seguir siendo eficiente, también tendría que cambiar a un if-elseif-else idioma. Tener que ser if-elseif-else desde el principio te ahorra ediciones en el futuro, y es más claro para la gente de la lectura de su código (testigo de la mala interpretación que les acabo haciendo un descremada de su código!).

    • El puesto implica que cada condicional hace un return, por lo que el método de ejecución se detiene después de una condición de éxito.
    • No en el ejemplo que se muestra, sin embargo.
    • Ah, eso es cierto.
    • Esperar. ¿De dónde viene el ejemplo no está de acuerdo con mi reclamación?
    • Creo que él estaba respondiendo a mi post, no a tu comentario. Eso es lo que me llevó, como ambos estaban señalando el original del defecto en mi post.
  2. 10

    Lo que sobre el caso donde b1 == b2? (Y si a == b1 y a == b2?)

    Cuando eso sucede, generalmente hablando, los dos siguientes fragmentos de código podría tener un comportamiento diferente:

    if (a == b1) {
       /* do stuff here, and break out of the test */
    } 
    else if (a == b2) {
       /* this block is never reached */
    } 

    y:

    if (a == b1) {
       /* do stuff here */
    }
    if (a == b2) {
       /* do this stuff, as well */
    }

    Si quieres definir claramente la funcionalidad de los diferentes casos, el uso if-else o switch-case para hacer una prueba.

    Si quieres funcionalidad diferente para varios casos, a continuación, utilizar múltiples if bloques como pruebas por separado.

    No es una cuestión de «mejores prácticas» tanto como la definición de si usted tiene una prueba o pruebas múltiples.

  3. 7

    NO son funcionalmente equivalentes.

    La única manera de hacerlo sería funcionalmente equivalente es si usted hizo un «si» declaración para cada posible valor de a (es decir: cada posiblemente int valor, tal como se define en los límites.h en C; la utilización de INT_MIN y INT_MAX, o su equivalente en Java).

    La instrucción else permite cubrir cada posible valor restante sin tener que escribir millones de declaraciones «if».

    También, es una mejor práctica de codificación a utilizar if…else if…else, justo como en un switch/case, su compilador nag con una advertencia si usted no proporciona un «defecto» declaración de caso. De este modo se evita con vistas a valores no válidos en su programa. por ejemplo:

    double square_root(double x) {
        if(x > 0.0f) {
            return sqrt(x);
        } else if(x == 0.0f) {
            return x;
        } else {
            printf("INVALID VALUE: x must be greater than zero");
            return 0.0f;
        }
    }

    ¿Quieres que escriba millones de instrucciones if para cada posible valor de x en este caso? Duda 🙂

    Saludos!

    • +1 por señalar que no son funcionalmente equivalentes.
    • Si tenemos un retorno en cada caso codeblock son equivalentes. El valor no válido parte sólo no está en un bloque else, pero en su lugar normal de código después de la última si. Perfectamente funcionalmente equivalente. Incluso sin la instrucción return, podemos obtener el equivalente funcionalmente código aparte del hecho de que hagamos una comprobación adicional para cada uno de los si (a pesar de un buen compilador podría quitar eso)
  4. 1

    Tiendo a pensar que el uso de else if es más fácil, más robusto en la cara de cambios en el código. Si alguien se ajuste el control de flujo de la función y reemplaza el regreso con un efecto secundario o una llamada a una función con un try-catch la else-if produciría un error de disco duro si todas las condiciones son realmente exclusivo. En realidad, depende mucho en el código exacto que está trabajando para hacer un juicio general y deberá considerar los posibles trade-offs con brevedad.

  5. 1

    Con return instrucciones en cada if rama.

    En su código, usted tiene return declaraciones en cada una de las si las condiciones. Cuando se tiene una situación como esta, hay dos formas de escribir esto. La primera es cómo usted ha escrito que en el Ejemplo 1:

    if (a == b1) {
       return c1;
    } else if (a == b2) {
       return c2;
    } else {
       return c11;
    }

    El otro es como sigue:

    if (a == b1) {
       return c1;
    }
    if (a == b2) {
       return c2;
    }
    return c11; //no if or else around this return statement

    Estas dos maneras de escribir el código son idénticos.

    La forma en la que escribió su código en el ejemplo 2 no compilar en C++ o Java (y sería un comportamiento indefinido en C), ya que el compilador no sabe que usted ha cubierto todos los valores posibles de a por lo que piensa que hay una ruta de código a través de la función que puede llegar a la final de la función sin devolver un valor de retorno.

    if (a == b1) {
       return c1;
    }
    if (a == b2) {
       return c2;
    }
    ...
    if (a == b11) {
       return c11;
    }
    //what if you set a to some value c12?

    Sin return instrucciones en cada if rama.

    Sin return instrucciones en cada if rama, el código sería funcionalmente idénticos sólo si las siguientes afirmaciones son verdaderas:

    1. No mutar el valor de a en cualquiera de los if ramas.
    2. == es una relación de equivalencia (en el sentido matemático) y ninguno de los b1 través de b11 están en la misma clase de equivalencia.
    3. == no tiene ningún tipo de efectos secundarios.

    Para aclarar más sobre el punto #2 (y también el punto #3):

    • == siempre es una relación de equivalencia en C o Java y nunca tiene efectos secundarios.
    • En los idiomas que se pueden anular la == operador, tales como C++, Ruby, o Scala, el reemplazado == operador no puede ser una relación de equivalencia, y puede tener efectos secundarios. Desde luego, esperamos que quien anula el == operador estaba cuerdo lo suficiente como para escribir una relación de equivalencia que no tiene efectos secundarios, pero no hay ninguna garantía.
    • En JavaScript y algunos otros lenguajes de programación con suelta de conversión de tipo de reglas, hay casos incorporado en el lenguaje donde == no es transitiva, o no simétrica. (En Javascript, === es una relación de equivalencia.)

    En términos de rendimiento, ejemplo #1 es la garantía de que no realice ninguna de las comparaciones después de uno que coincida con. Es posible que el compilador para optimizar #2 para saltar el extra comparaciones, pero es poco probable. En el siguiente ejemplo, es probable que no se puede, y si las cadenas son largos, las comparaciones no son baratas.

    if (strcmp(str, "b1") == 0) {
      ...
    }
    if (strcmp(str, "b2") == 0) {
      ...
    }
    if (strcmp(str, "b3") == 0) {
      ...
    }
  6. 1

    Prefiero if/else estructuras, porque es mucho más fácil evaluar todos los estados posibles del problema en cada variación, junto con los interruptores. Es más robusto puedo encontrar y más rápido para depurar especialmente cuando se realizan múltiples Booleano de las evaluaciones en un débil escrita, medio ambiente, tales como PHP, ejemplo de por qué elseif es mala (exagerado para la demostración):

    if(a && (c == d))
    {
    } elseif ( b && (!d || a))
    {
    } elseif ( d == a && ( b^2 > c))
    {
    } else {
    }

    Este problema tiene más de 4^2=16 booleano los estados, que es simplemente para demostrar a los débiles tipificación de los efectos que hace las cosas aún peor. No es tan difícil imaginar un tres variable de estado, tres variables problema implicado en un if ab elseif bc tipo de camino.

    Dejar de optimización del compilador.

  7. 1

    Esto depende totalmente de la condición que se está probando. En su ejemplo, no hará ninguna diferencia, finalmente, pero como mejor práctica, si desea que UNA de las condiciones para ser finalmente ejecutado, entonces es mejor usar el if else

    if (x > 1) {
        System.out.println("Hello!");
    }else if (x < 1) {
        System.out.println("Bye!");
    }

    También tenga en cuenta que si la primera condición es VERDADERA, la segunda NO será revisado, pero si uso

    if (x > 1) {
        System.out.println("Hello!");
    }
    if (x < 1) {
        System.out.println("Bye!");
    }

    La segunda condición se comprueba incluso si la primera condición es VERDADERA. Esto podría ser resuelto por el optimizador finalmente pero como yo sé que se comporta de esa manera. El primero es el que está destinado a ser escrito y se comporta como esta, así que siempre es la mejor opción para mí, a menos que la lógica exige lo contrario.

  8. 1

    En la mayoría de los casos, el uso de if-elseif-else y switch declaraciones sobre si-si-si las declaraciones es más eficiente (ya que lo hace más fácil para que el compilador cree saltar/tablas de búsqueda) y la mejor práctica, ya que hace el código más legible, más el compilador se asegura de incluir un caso por defecto en el interruptor. Esta respuesta, junto con este tabla la comparación de los tres diferentes declaraciones fue sintetizado mediante otras exposiciones de respuesta en esta página, así como aquellos de similar MANERA pregunta.

  9. 0

    if y else if es diferente a dos periodos consecutivos de if declaraciones. En la primera, cuando la CPU toma la primera if rama de la else if no será activada. En los dos consecutivos if declaraciones, incluso si la primera if es revisado y adoptado, el siguiente if también será comprobar y tomar si la condición es verdadera.

  10. 0

    Creo que estos fragmentos de código son equivalentes, por la sencilla razón de que tiene muchas return declaraciones. Si había una sola return declaraciones, usted estaría usando else construcciones que aquí son innecesarios.

  11. 0

    Su comparación se basa en el hecho de que el cuerpo de las sentencias de control de retorno del método. De lo contrario, la funcionalidad sería diferente.

    En este caso, realizar la misma funcionalidad. La segunda es mucho más fácil de leer y entender, en mi opinión, y sería mi elección como la que uso.

  12. 0

    Tienen el potencial de hacer cosas diferentes.

    Si a es igual a b1 y b2, introduce dos if bloques. En el primer ejemplo, sólo puedes entrar en uno. Me imagino que el primer ejemplo es el más rápido ya que el compilador probablemente tiene que comprobar cada condición secuencialmente, según ciertas reglas de comparación puede aplicar al objeto. Puede ser capaz de optimizar ellos… pero si solo quieres uno para ser introducido, el primer método es el más obvio, menos probabilidades de llevar a desarrollador de error o un código ineficaz, por lo que sin duda recomiendo que.

  13. 0

    CanSpice la respuesta es correcta. Una consideración adicional para el rendimiento es saber de qué condicional se produce más a menudo. Por ejemplo, si a==b1 se produce sólo el 1% del tiempo, entonces usted obtener un mejor rendimiento de comprobar que el otro caso primero.

    Gir Ama los Tacos de respuesta también es buena. La mejor práctica es asegurarse de que tienen todos los casos cubiertos.

Dejar respuesta

Please enter your comment!
Please enter your name here