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.
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 cadaif
bloque. En estos casos, o en los casos donde el control dejará el método (excepciones), no hay ninguna diferencia entre hacer múltiplesif
declaraciones y haciendoif-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 unreturn
en cadaif
bloque. Entonces, para seguir siendo eficiente, también tendría que cambiar a unif-elseif-else
idioma. Tener que serif-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!).return
, por lo que el método de ejecución se detiene después de una condición de éxito.Lo que sobre el caso donde
b1 == b2
? (Y sia == b1
ya == b2
?)Cuando eso sucede, generalmente hablando, los dos siguientes fragmentos de código podría tener un comportamiento diferente:
y:
Si quieres definir claramente la funcionalidad de los diferentes casos, el uso
if-else
oswitch-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.
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:
¿Quieres que escriba millones de instrucciones if para cada posible valor de x en este caso? Duda 🙂
Saludos!
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 untry-catch
laelse-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.Con
return
instrucciones en cadaif
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:El otro es como sigue:
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.Sin
return
instrucciones en cadaif
rama.Sin
return
instrucciones en cadaif
rama, el código sería funcionalmente idénticos sólo si las siguientes afirmaciones son verdaderas:a
en cualquiera de losif
ramas.==
es una relación de equivalencia (en el sentido matemático) y ninguno de losb1
través deb11
están en la misma clase de equivalencia.==
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.==
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.==
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.
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):
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.
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
También tenga en cuenta que si la primera condición es VERDADERA, la segunda NO será revisado, pero si uso
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.
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.
if
yelse if
es diferente a dos periodos consecutivos deif
declaraciones. En la primera, cuando la CPU toma la primeraif
rama de laelse if
no será activada. En los dos consecutivosif
declaraciones, incluso si la primeraif
es revisado y adoptado, el siguienteif
también será comprobar y tomar si la condición es verdadera.Creo que estos fragmentos de código son equivalentes, por la sencilla razón de que tiene muchas
return
declaraciones. Si había una solareturn
declaraciones, usted estaría usandoelse
construcciones que aquí son innecesarios.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.
Tienen el potencial de hacer cosas diferentes.
Si
a
es igual ab1
yb2
, introduce dosif
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.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.