2010-04-07 21 views
12

Tengo estas declaraciones largas a las que me referiré como x, y etc. aquí. estructura Mis declaraciones condicionales es la siguiente:if-else structure

if(x || y || z || q){ 
    if(x) 
     do someth 
    else if (y) 
     do something 

    if(z) 
     do something 
    else if(q) 
     do something 
} 
else 
    do smthing 

¿Hay una mejor manera, más corta de escribir esta cosa? Gracias

Respuesta

1

Esto me parece bastante claro (y claro está bien).

Lo que puedes hacer es primero evaluar x, y, z y almacenarlos como variables para que no tengas que hacer eso dos veces.

+3

@Thirler Hmm, que se anule el propósito de cortocircuito evaluación. Creo que, en promedio, suponiendo igual probabilidad y complejidad de tiempo de x, y, z y q esto sería un aumento de rendimiento. Pero, ¿y si la probabilidad de z es del 50% y requiere poco procesamiento, mientras que la probabilidad de q es del 1% y toma el 95% de la potencia de procesamiento? Vea cómo la micro-optimización puede causarle problemas sin las métricas adecuadas? –

+0

Sí, necesitamos utilizar como máximo una variable para hacer eso, marque – Halo

+0

@Tim Necesita condiciones extremadamente largas (o código que se ejecuta millones de veces) para que esto sea una pérdida de rendimiento.Ciertamente no estoy optimizando (la pregunta no habla de eso), sugiero mejorar el mantenimiento. Si el rendimiento es importante, deberá amortiguar el resultado del cálculo de forma transparente (ocultarlo detrás de una función que almacena el resultado). Tenga en cuenta que el ejemplo dado ejecuta algunas condiciones dos veces. Pero una buena regla es no optimizar en absoluto hasta que vea que le lleva mucho tiempo ejecutarla. – Thirler

1

Quizás esto sea un poco más fácil de leer. Pero ahora realizarás un control extra. Si no es misión de código crítico entonces tal vez usted puede utilizar lo siguiente:

if (x) 
    do something; 
else if (y) 
    do something; 

if (z) 
    do something; 
else if(q) 
    do something; 

if !(x || y || z || q) 
    do something completely different. 
+2

Su última declaración no es la misma que en la pregunta, creo que necesita 'if! (X || y || z || q)' – Thirler

+0

y usar else es mejor, supongo, para leer. Ya sabes, asegurándonos de que no dejamos agujeros – Halo

+0

No veo cómo esto 'realiza un control extra'. Usted tiene el mismo número de declaraciones if después de todo :) –

4

no veo un gran problema con la forma de escribir ahora. Recomiendo el uso de llaves, incluso para una sola declaración if-blocks. Esto te ayudará a evitar errores en caso de que tengas que agregar más líneas de código más tarde (y quizás olvides agregar las llaves). Me parece más legible también. El código se vería así entonces:

if (x || y || z || q) { 
    if (x) { 
     do something 
    } else if (y) { 
     do something 
    } 

    if (z) { 
     do something 
    } else if (q) { 
     do something 
    } 
} else { 
    do something 
} 
+0

+1 para el uso de llaves. Ojalá Java, C++ y otros idiomas hicieran lo que hace "Go" y los hiciera obligatorios ... ciertamente haría que el código fuera mucho más legible. –

+0

sí y siempre uso llaves, de hecho, el anterior es solo un prototipo o algo así. – Halo

0

no estoy recomendando la siguiente, de hecho, creo que lo que tienes está bien, pero:

s = true; 
if (x) { 
    do something; 
    s = false; 
} else if (y) { 
    do something; 
    s = false; 
} 
if (z) { 
    do something; 
    s = false; 
} else if (q) { 
    do something; 
    s = false; 
} 

if (s) { 
    so something; 
} 
4

Otra variante que evita el múltiplo las verificaciones y las expresiones lógicas complejas de errorprone pueden ser:

boolean conditionhandled = false; 
if (x) { 
    do something 
    conditionhandled = true; 
} else if (y) { 
    do something 
    conditionhandled = true; 
} 

if (z) { 
    do something 
    conditionhandled = true; 
} else if (q) { 
    do something 
    conditionhandled = true; 
} 

if (!conditionhandled) { 
    do something 
} 
+1

gracias, creo que tenemos que inicializar el estado manejado como falso – Halo

+0

¡Vaya! Gracias, arreglé esto. –

0

¿Puede hacer algunas suposiciones sobre x, y, z, q? e.G. solo uno de ellos puede ser cierto. Lo que podría verlo como un Estado

enum State { 
X{ 
    void doSomething(){ 
    doItTheXWay(); 
    } 
}, 
Y{ 
    void doSomething(){ 
    doItTheYWay(); 
    } 
}, 
Z{ 
    void doSomething(){ 
    doItTheZWay(); 
    } 
}, 
Q{ 
    void doSomething(){ 
    doItTheQWay(); 
    } 
}; 
    void doSomething(){ 

    } 
} 

y en su código en el que utiliza las sentencias if

podría asignar un estado y simplemente hacer lo correcto

State state = getAState(); 
state.doSomething(); 

En caso de que no me gusta enums Estado podría ser una interfaz y X a Q podría estar implementando clases. Los beneficios en este caso se basan en el uso múltiple del mismo constructo if else. Dicen algunos codelines más tarde comenzarían con

if(x) 
    do_the_next_thing_with_X(); 
... 

o usted podría ampliar su enumeración con otra función y hacer una sola llamada

state.doTheNextThing();