2010-11-25 3 views
2

Existe-t-il une méthode meilleure et optimisée pour écrire ce code?Optimisation de cette méthode de validation

public int ValidateEntries() 
    { 
     if (this.CompanyName.Length < 6) 
     { 
      MessageBox.Show("Company name must be of at least six characters.", "Invalid Entry", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      return 1; 
     } 

     if (DateTime.Parse(this.FYStarting) > DateTime.Parse(this.FYEnding)) 
     { 
      MessageBox.Show("Invalid financial year period.", "Invalid Entry", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      return 1; 
     } 
     return 0; //Default error code: 0 : No Error, 1 : Error 
    } 

Je veux présenter bloc try..catch juste au cas où les feux d'erreur. Mais ça va créer un overhead. Je veux également se débarrasser de ces si s.

En troisième lieu, ce qui est plus optimisée: Convert.ToDateTime ou DateTime.Parse?

+1

Optimisé pour quoi? De même, vous ne devriez probablement pas interagir avec l'utilisateur dans une méthode de validation. – recursive

+0

@recursive: Optimisations du compilateur pour la vitesse. Je n'ai pas compris la deuxième partie de votre réponse. – RKh

+0

L'utilisation des valeurs de retour d'entier est ici très unidiomatique. Vous devez utiliser des exceptions ou une valeur de retour 'bool'. –

Répondre

3

validation déclarative est une manière optimale, utilisez le cadre de validation approprié qui fonctionne pour vous (comme ce que vous pouvez trouver dans Entlib)

Vous devez se débarrasser de la solution actuelle et à traiter les problèmes transversaux dans un produit de nettoyage, plus facile et de manière cohérente.

2

Une meilleure approche consiste à diviser les classes de données et l'interface utilisateur. L'utilisation d'interfaces spéciales, telles que IDataErrorInfo et les modèles de validation vous aideront à supporter votre code à l'avenir.

2

try ... catch est relativement bon marché. Cela ne devient cher que si une exception est levée.

Mais je n'aime pas la façon dont vous mélangez l'interface graphique et la logique. Je préfère passer dans une liste d'erreurs (dans le cas le plus simple un List<string> mais peut être plus complexe) et ajouter des erreurs à dans chaque clause de validation. À la fin, vous pouvez vérifier si des erreurs se sont produites avec errorlist.Count et afficher les messages.

Si votre int ne représentera toujours que deux valeurs, il serait préférable d'utiliser bool.

Exemple simplifié:

public class ErrorList:List<string> 
{ 
    public bool HasErrors{get{return Count>0;}} 
} 

public void ValidateEntries(ErrorList errors) 
{ 
    if (this.CompanyName.Length < 6) 
     errors.Add("Company name must be of at least six characters."); 

    if (DateTime.Parse(this.FYStarting) > DateTime.Parse(this.FYEnding)) 
     Errors.Add("Invalid financial year period." 
} 

public void CallingFunction() 
{ 
    var errors=new ErrorList(); 
    ValidateEntries(); 
    if(erros.HasErrors) 
    { 
     ShowMessage(string.Join("\r\n",errors)); 
     return; 
    } 
    DoStuff(); 
} 

En fonction de votre architecture, vous pouvez également créer des fonctions d'aide ou d'utiliser un design plus déclarative. Mais il est difficile de donner des conseils plus concrets sans mieux connaître votre programme. Par exemple dans mon code la validation ne sait même pas ce qu'est un Form et fonctionne sur un ViewModel ou encore des structures de plus bas niveau. Par exemple, ASP.net MVC dispose de mécanismes intégrés pour gérer la validation et les listes d'erreurs. Alors vérifiez ce que votre cadre offre.

+0

Le code ci-dessus est dans une classe différente, mais vrai ce n'est pas un moyen professionnel. Vous voulez dire que je devrais ajouter des codes d'erreur dans une liste et à la fin se référer à la liste si elle est vide ou non? – RKh

+0

En dehors de la méthode de validation, vous devez gérer la liste. La façon dont vous l'avez maintenant, l'utilisateur doit cliquer sur "Ok" pour chaque erreur. Ils seront ennuyés s'il y a plus de 1. – recursive

+0

Oui, c'est juste du code simplifié. En pratique, vous pouvez écrire l'erreur dans une étiquette à côté du champ de saisie. Cela nécessiterait également d'étendre la liste d'erreurs pour prendre des paires fieldname-errormessage. Ou on pourrait concaténer les messages avec un saut de ligne entre deux et l'afficher comme une boîte de message. – CodesInChaos