2011-09-08 4 views
6

J'ai un code très en désordre avec le if - else si les vérifications sont en cours. La quantité de branchements et de branchements imbriqués est assez importante (plus de 20 si - sinon si et aussi imbriqué). Cela rend mon code plus difficile à lire et sera probablement un porc de performance. Mes contrôles d'application pour un grand nombre de conditions qu'il reçoit de l'utilisateur et l'application doit de vérifier tout le temps pour des situations différentes, par exemple:Instructions 'if' - 'else' imbriquées

Si le texte textbox n'est pas 0, passez à la prochaine ...

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

Et puis ici, il vérifie si l'utilisateur a choisi les dates:

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

ici, si les datepickers ne sont pas nulles, il continue avec le code ...

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(); 
       } 
      } 

Ceci est juste une petite partie des vérifications en cours. Certains d'entre eux sont fonctionnels et certains sont pour la validation d'entrée.

Y at-il un moyen de le rendre plus lisible et moins d'un porc de performance?

+0

Peut-être que vous devriez faire Validation en face de la méthode ou de l'événement si vous le faites dedans, comme si (dtp.SelectedDate == null) return; que de procéder à la gestion de l'information. – Burimi

+1

J'ai un sentiment fort SelectedDate est d'un contrôle de calendrier, ceux-ci ne peuvent jamais être nul, vous devez vérifier 'datePickerStart.SelectedDate == DateTime.MinValue' à la place. –

+0

Le code fonctionne bien ce n'est pas mon problème. le problème auquel je me réfère est la lisibilité et la performance de ce complexe si autre branche – Yosi199

Répondre

13

Ce n'est pas celui d'un porc de performance. Un bon article de blog sur la façon de résoudre ces problèmes communs est Flattening Arrow Code.

+0

Cela ressemble à ce dont j'ai besoin je vais bientôt vérifier et poster – Yosi199

2

Une façon est de factoriser en encapsulant complexes conditions de la manière suivante:

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

et l'utilisation de ces propriétés « façade état »

3

Je vois ici un certain mélange dans la validation. Essayez de déplacer un champs des autres, et les valider séparément, quelque chose comme ceci:

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

Dans cette approche vous toujours dire à l'utilisateur ce qu'il a fait de mal, et votre code est beaucoup plus simple.

Plus d'informations de Jeff's blog

+0

le if ((StartInt! = 0) && (EndInt! = 0)) { n'est pas de vérifier si l'utilisateur a inséré. C'est pour vérifier si l'entrée sur 2 zones de texte est 0 ou non. si c'est le cas, alors faites quelque chose, sinon faites autre chose. comme je l'ai dit certaines des instructions if else sont pour des validations d'entrée mais la plupart d'entre elles sont pour des vérifications de condition. – Yosi199

0

L'instruction return pour arrêter l'exécution d'un bloc.

Par exemple,

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

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

Une légère refactoring rend plus facile à lire à mes yeux. J'ai supprimé les parenthèses superflues et consolidé plusieurs instructions IF qui sont vraiment juste ET logique.

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

Vous pouvez définir vos propres prédicats ou fonctions génériques avec des noms significatifs et encapsuler votre logique dans ceux-ci.

Voici un exemple de code pour certains prédicats:

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

Maintenant, vous pouvez facilement écrire dans votre code

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

Pensez à utiliser les délégués génériques, comme Func<> et Delegate<> pour écrire de petits blocs de votre conditions utilisant des expressions lambda - cela économisera l'espace et rendra votre code beaucoup plus lisible par l'homme.

Questions connexes