2011-09-08 30 views
6

Tengo un código que es muy desordenado con el if - else si comprueba que está haciendo. La cantidad de ramificaciones y ramificaciones anidadas es bastante grande (más de 20 si - else si y anidado también). Está haciendo que mi código sea más difícil de leer y probablemente sea un cerdo de rendimiento. Mis aplicación comprueba una gran cantidad de condiciones que recibe por parte del usuario y por lo que la aplicación debe comprobar todo el tiempo para diferentes situaciones, por ejemplo:Declaraciones anidadas 'if' - 'else'

Si el texto de cuadro de texto no es 0, continúe con el siguiente ...

if ((StartInt != 0) && (EndInt != 0)) 
{ 

Y entonces aquí se comprueba si el usuario ha elegido fechas:

if ((datePickerStart.SelectedDate == null) || (datePickerEnd.SelectedDate == null)) 
{ 
    MessageBox.Show("Please Choose Dates"); 
} 

aquí, si las datepickers no son nulos continúa con el código ...

else if ((datePickerStart.SelectedDate != null) && (datePickerEnd.SelectedDate != null)) 
{ 
    // CONDITIONS FOR SAME STARTING DAY AND ENDING DAY. 
    if (datePickerStart.SelectedDate == datePickerEnd.SelectedDate) 
    { 
     if (index1 == index2) 
     { 
      if (StartInt == EndInt) 
      { 
       if (radioButton1.IsChecked == true) 
       { 
        printTime3(); 
       } 
       else 
       { 
        printTime(); 
       } 
      } 

Esto es solo una pequeña parte de los cheques que se están realizando. Algunos de ellos son funcionales y otros son para validación de entrada.

¿Hay alguna manera de hacerlo más legible y menos de un cerdo de rendimiento?

+0

Tal vez deberías hacer las validaciones frente al Método o Evento si lo estás haciendo dentro, como si (dtp.SelectedDate == null) regresara; que proceder con el manejo de la información. – Burimi

+1

Tengo la fuerte sensación de que SelectedDate pertenece a un control de calendario, estos nunca pueden ser nulos; en su lugar, debe verificar 'datePickerStart.SelectedDate == DateTime.MinValue'. –

+0

El código está funcionando bien, no es mi problema. El problema al que me refiero es la legibilidad y el rendimiento de tal complejo, si no se ramifica – Yosi199

Respuesta

13

No es el de un cerdo de rendimiento. Una gran publicación de blog sobre cómo solucionar esos problemas comunes es Flattening Arrow Code.

+0

Que se parece a lo que necesito Pronto lo revisaré y publicare – Yosi199

2

Una forma es refactorizar encapsulando complejas condiciones de la siguiente manera:

public bool DateRangeSpecified 
{ 
    get 
    { 
    return (datePickerStart.SelectedDate != null) 
      && 
      (datePickerEnd.SelectedDate != null) 
      && StartInt != 0 && EndInt != 0; 
    } 
} 

y luego utilizar estas propiedades "condición" de fachada

3

que veo aquí algo de mezcla en la validación. Trate de mover uno campos de los demás, y validar por separado, algo como esto:

if (StartInt == 0 || EndInt == 0) 
{ 
    MessageBox.Show("Please Choose Ints"); 
    return; 
} 
if (datePickerStart.SelectedDate == null || datePickerEnd.SelectedDate == null) 
{ 
    MessageBox.Show("Please Choose Dates"); 
    return; 
} 

En este enfoque siempre se dirá al usuario lo que hizo mal, y su código es mucho más simple.

Más información de Jeff's blog

+0

el if ((StartInt! = 0) && (EndInt! = 0)) { no es para comprobar si el usuario insertó ints. es para verificar si la entrada en 2 cuadros de texto es 0 o no. si es así, entonces haz algo, o haz otra cosa. como dije algunas de las declaraciones if else son para validaciones de entrada pero la mayoría de ellas son para verificaciones de condición. – Yosi199

0

Utilice la sentencia return para detener la ejecución de un bloque.

Por ejemplo,

void Test() 
{ 
    if (StartInt==0 || EndInt==0) 
    { 
     return; 
    } 

    if (datePickerStart.SelectedDate == null || datePickerEnd.SelectedDate == null) 
    { 
     MessageBox.Show("Please Choose Dates"); 
     return; 
    } 
} 
0

Alguna ligera refactorización hace que sea más fácil de leer a mis ojos. Eliminé corchetes extraños y consolidé varias declaraciones de IF que son realmente lógicas AND.

if (StartInt == 0 || EndInt == 0)  
    return; 
if (datePickerStart.SelectedDate == null || datePickerEnd.SelectedDate == null) 
{ 
    MessageBox.Show("Please Choose Dates"); 
    return;   
} 
if (datePickerStart.SelectedDate != null 
    && datePickerEnd.SelectedDate != null 
    && datePickerStart.SelectedDate == datePickerEnd.SelectedDate 
    && index1 == index2 
    && StartInt == EndInt) 
{ 
    if (radioButton1.IsChecked == true) 
     printTime3(); 
    else 
     printTime(); 
} 
0

Puede definir sus propios predicados o funciones genéricas con nombres significativos y encapsular su lógica en los mismos.

Aquí es un ejemplo de código para algunos predicados:

public Predicate<DateTime> CheckIfThisYear = a => a.Year == DateTime.Now.Year; 
public Func<DateTime, int, bool> CheckIfWithinLastNDays = (a, b) => (DateTime.Now - a).Days < b; 

Ahora se puede escribir fácilmente en su código

if (CheckIfThisYear(offer) && CheckIfWithinLastNDays(paymentdate,30)) ProcessOrder(); 

Considere el uso de los delegados genéricos, como Func<> y Delegate<> para escribir pequeños bloques de su condiciones usando lambda -expresiones- salvará el espacio y hará que su código sea mucho más legible para el ser humano.