Considere este bit de código:
if (x == 1)
{
throw "no good; aborting" ;
}
[... more code ...]
Ahora considere este código:
if (x == 1)
{
throw "no good; aborting" ;
}
else
{
[... more code ...]
}
Los dos casos funcionan exactamente de la misma manera. El primer caso tiene la ventaja de que no tiene que "encapsular" el resto del código en un else
. El segundo tiene la ventaja de seguir la práctica de tener explícitamente un else
para cada if
.
¿Alguien puede proporcionar argumentos sólidos a favor de uno sobre el otro?
coding-style
exceptions
rlandster
fuente
fuente
else
parece falsa. Muy a menudo, simplemente no hay nada que poner en elelse
bloque a menos que se doble hacia atrás.if
necesita unelse
. El último programador que trabajó en nuestra base de código lo siguió rígidamente ( bueno, a veces ... es un poco esquizofrénico ). Como resultado, tenemos muchoselse { /* do nothing */ }
bloques completamente sin sentido ensuciando el código ...Respuestas:
No debe agregar
else
después de lasif
ramas que rompen el flujo de control incondicionalmente , como las que contienen athrow
o areturn
. Esto mejoraría la legibilidad de su programa al eliminar el nivel innecesario de anidamiento introducido por laelse
rama.Lo que se ve más o menos bien con un solo se
throw
vuelve realmente feo cuando se involucran varios lanzamientos seguidos:Este fragmento hace lo mismo, pero se ve mucho mejor:
fuente
else if
.if
prueba busca una sola condición y la trata si la condición es verdadera y, a menos que haya algo alternativo que tenga que suceder si la condición es falsa, noelse if
es necesario. Tenemos un término en mi oficina para el código como el primer fragmento de dasblinkenlight: " máquinas pachinko ".else
.Llamaría a la práctica "explícita de lo contrario" a la que se refiere como un antipatrón, ya que oscurece el hecho de que no hay un código de caso especial como otra cosa para su if.
La legibilidad / mantenibilidad generalmente mejora cuando en su mayoría no tiene más que construcciones de flujo de código necesarias, y las minimiza. Esto significa elses redundantes y los if que agregarán un alcance a una función completa hacen que seguirlo y mantenerlo sea más difícil.
Digamos, por ejemplo, que tiene esta función:
Ahora, el requisito es que durante la configuración también debe especificar el tipo / índice de tipo del oblogon, hay varios ámbitos en los que alguien podría colocar ese código y terminar con un código no válido, es decir
Compare esto con si el código original se escribió con construcciones de flujo de control mínimas necesarias y minimizadas.
Ahora sería mucho más difícil poner accidentalmente algo en el alcance incorrecto o terminar con los ámbitos de hinchazón que causan duplicación en el crecimiento y el mantenimiento a largo plazo de esta función. Además, es obvio cuáles son los posibles flujos a través de esta función, por lo que se mejora la legibilidad.
Lo sé, el ejemplo es un poco artificial, pero he visto muchas veces
Entonces, formalizar esas reglas sobre construcciones de flujo de control creo que puede ayudar a la gente a desarrollar la intuición necesaria para oler algo cuando comienzan a escribir código como ese. Entonces comenzarán a escribir ...
fuente