Parece que veo esto con bastante frecuencia en mi código y en otros. No hay nada en eso que parezca terriblemente mal, pero me molesta ya que parece que se puede hacer mejor. Supongo que una declaración de caso, podría tener un poco más de sentido, pero a menudo variable es un tipo que no funciona bien o en absoluto con declaraciones de caso (dependiendo del idioma)
If variable == A
if (Flag == true)
doFooA()
else
doFooA2
else if variable == B
if (Flag == true)
doFooB()
else
doFooB2
else if variable == C
if (Flag == true)
doFooC()
else
doFooC2
Parece que hay varias formas de "factorizar" esto, como 2 conjuntos de if-elses, donde un conjunto se maneja cuando Flag == verdadero.
¿Hay una "buena manera" de factorizar esto, o tal vez cuando ocurre este algoritmo if-else, generalmente significa que está haciendo algo mal?
code-quality
TruthOf42
fuente
fuente
if (Flag == true)
lugar de soloIf (Flag)
? Si crees queIf (Flag == true)
es mejor, ¿por qué noif ((Flag == true) == true)
?Respuestas:
Se podría manejar con polimorfismo.
Siempre que tenga un montón de verificaciones if / else sobre el tipo de algo, puede considerar centralizar la verificación if / else en un método de fábrica, luego llamar a doFoo () polimórficamente. Pero esto podría ser excesivo para una solución única.
Tal vez podría crear un mapa de clave / valor donde la clave es var / flag, y el valor es la función misma.
fuente
Múltiples ifs anidados aumentan la complejidad ciclomática del código. Hasta hace poco, tener múltiples puntos de salida en una función se consideraba un código estructurado incorrecto, pero ahora, siempre que el código sea simple y breve , puede hacerlo, haciendo que el código sea trivial para leer:
fuente
Otra opción es combinar if y switch. Esto no es superior a su técnica anidada, pero puede reducir el número de pruebas duplicadas (si el interruptor se optimiza a una tabla de salto).
fuente
Bueno, siempre hay esto ...
Pero, francamente, creo que el código original no es tan malo en primer lugar.
fuente
Usa polimorfismo y una
rule
matrizO como se
mike30
sugiere: si las condiciones de la regla pueden formar fácilmente una clave, entonces un hashmap es la mejor manera de hacerlo.fuente