4

merci pour votre attention et votre temps.un problème de base dans la mise en œuvre des validations à travers les propriétés? Veuillez me guider

Je veux mettre en œuvre des validations dans le settter de propriétés. Voici un problème où votre aide d'expert est requise s'il vous plaît.

J'ai une idée de comment je vais faire des validations avant de définir la valeur. mais ne pas savoir quoi faire si la valeur transmise n'est pas correcte. Juste ne pas définir n'est pas une solution acceptable que je veux retourner un message approprié à l'utilisateur (dans une étiquette sous forme web). Mon code d'exemple est:

private int id; 
public int Id 
{ 
    get 
    { return id; } 

    set 
    { 
     bool result = IsNumber(value); 
     if (result==false) 
     { 
      // What to do if passed data is not valid ? how to give a appropriate message to user that what is wrong ? 
     } 

     id = value; 
    } 
} 

Une pensée était d'utiliser le retour mais ce n'est pas autorisé.

L'erreur de lancement ne semble pas bonne, car nous évitons généralement les erreurs personnalisées.

S'il vous plaît guider et m'aider.

grâce à l'anticipation

haansi

+1

"résultat == false", pourquoi auriez-vous besoin de plus de comparer deux bools puis décider de l'action? Pourquoi pas simplement "if (! Result)", le nom de la variable doit aussi exprimer le contexte et la signification de la valeur de sa détention. –

+0

Vous ne savez pas exactement ce que fait votre méthode IsNumber, mais comme il s'agit d'un ensemble de probabilités de propriété int, c'est toujours vrai. –

+0

merci @Amby & @Rob van Groenewoud, J'utilise juste ce code comme exemple. Pouvez-vous s'il vous plaît des conseils sur mon problème que comment envoyer une indication à l'interface utilisateur si la valeur n'est pas valide? merci amis – haansi

Répondre

1

Vous pouvez envisager de lancer une exception appropriée à partir de l'éditeur de propriétés. De cette façon, il sera clair pour l'appelant ce qui n'a pas fonctionné, en particulier en supposant que vous ayez des règles métier concernant la définition des propriétés. Bien sûr, vous vous attendez à ce que l'appelant fasse des validations, s'il y a toujours un problème, lancer une exception ne semble pas si mal.

"Il est valide et acceptable de lever des exceptions d'un accesseur de propriété." Property design guidelines

Best practices: throwing exceptions from properties

What exception to throw from a property setter?

0
  1. Si le chèque est seulement numéro (type) alors votre propriété peut très bien gérer la sécurité de type. Par exemple. L'utilisateur ne sera pas en mesure d'attribuer une chaîne à une propriété acceptant int.

  2. Je suggérerais que si Property implique certains calculs, alors on devrait envisager d'utiliser une méthode à la place. Dans ce cas, vous aurez l'option d'obtenir du texte en retour.

  3. Une autre option consiste à stocker tous ces contrôles de validation dans une collection d'instances (à l'intérieur du même objet). Comme.

    private Liste _faileValdations;

// code plus

set 
    { 
    if (!IsNumber(value)) 
    { 
    _faileValdations.Add("Invalid value for xxx. Expected... got.."); 
    } 
    else{ 
     id = value; 
    } 
    } 

Et puis, votre interface graphique peut lire la collection FailedValidations à la fin, et l'afficher d'une manière formatée dans une étiquette.

Modifier: une option de plus ci-dessous.

  1. Désolé j'ai oublié de mentionner à ce sujet avant.

Vous pouvez également utiliser une approche basée sur les événements. Vous pouvez exposer un événement comme "ValidationFailed", et tous les objets de l'interface graphique peuvent s'abonner à cet événement. L'objet déclenchera cet événement au cas où une validation échouerait dans les setters.

set { 
    if (!IsNumber(value)) 
    { 
    RaiseValidationFailed("some message"); 
    } 
    else{ 
     id = value; 
    } 
    } 

événement « RaiseValidationFailed » peut recueillir le message, l'envelopper dans certains args d'événements et de déclenchement « ValidationFailed » avec le message. L'interface graphique peut alors réagir à cela. {Je peux vous fournir un code complet pour cela si son pas clair}

+0

Merci beaucoup Amby, La validation inclut à la fois (le type et les calculs). Je veux l'implémenter à partir de setter car il est automatiquement appelé à chaque fois qu'un objet est rempli mais que la méthode devra appeler.L'utilisation d'une liste contenant tous les messages de validation peut être la dernière solution, car cela rendra la tâche un peu complexe. des conseils s'il vous plaît merci pour vos conseils et un temps précieux. – haansi

+1

@haansi, Pas très sûr de ce que vous entendez par "comme il est automatiquement appelé chaque fois qu'un objet est rempli". Tant que c'est votre objet, vous pouvez décider comment l'utilisateur va interagir avec votre objet. Si vous n'exposez que des méthodes pour définir des valeurs, le client n'aura aucune option pour l'éviter. –

1

Je pense que vous feriez mieux de changer à un autre exemple parce que:

public int Id 
{ 
    get { ... } 
    set 
    { 
     if (!IsNumer(value)) // changes to if (value>5) 
     { 
      //the code here will never be executed 
      id = value; 
     } 
    } 
} 
+1

Cela semble être dangereux. Une propriété ne peut pas prendre une décision sans déclencher une alerte, ce type de code est très difficile à déboguer. –

+1

@Amby vous avez absolument raison. Je soulève cette réponse à votre question. En fait, je ne pense pas que vérifier la valeur lors de l'attribution est une bonne idée. Toutes les validations doivent être mises au même endroit. –

0

Je dirais que vous devriez revoir votre approche de validation . L'approche que vous suggérez signifie qu'à chaque fois qu'une propriété change, un message sera généré.

Comment ces messages seront-ils collectés, stockés et présentés? Surtout si vous décidez d'utiliser vos cours sur un site web?

Et si vous voulez valider votre classe à un autre moment? Et si vous souhaitez utiliser les mêmes règles dans la validation côté client?

Je peux comprendre l'attrait d'attraper une valeur invalide le plus tôt possible, mais il est beaucoup plus facile de valider une classe entière dans un appel comme une méthode Validate(). De cette façon, vous avez un contrôle total sur le moment où la logique de validation est exécutée.

Je vous recommande de lire les deux principales approches de validation de la propriété:

Data Anotations

Fluent Validation for >NET 3.0 and above

Fluent Validation for .NET 2.0

Les annotations de données et FluentValidation sont faciles à utiliser et ils sont capable de générer une validation côté client bien testée sur des formulaires Web et de gagner des formulaires.

Dans les annotations de données, la validation est ajoutée aux propriétés à l'aide d'attributs. Si vous préférez conserver vos classes de données en tant qu'objets de transfert de données propres, la validation Fluent implique la création de règles facilement lisibles dans les classes Validator.