Question

Je me demande si c'est une bonne idée de faire vérifications dans getters et passeurs, ou ailleurs dans le code.

Cela pourrait vous surprendre lorsqu'il s'agit de optimisations et excès de vitesse le code, je pense que vous ne devriez pas faire de vérifications dans les getters et les setters, mais dans le code où vous vous trouvez mise à jour vos fichiers ou votre base de données.Ai-je tort?

Était-ce utile?

La solution

Eh bien, l'une des raisons pour lesquelles les classes contiennent généralement des membres privés avec des getters/setters publics est précisément parce qu'elles peuvent vérifier les données.

Si vous avez un nombre pouvant être compris entre 1 et 100, je mettrais certainement quelque chose dans le setter qui le valide, puis je lancerais peut-être une exception qui est interceptée par le code.La raison est simple :Si vous ne le faites pas dans le setter, vous devez vous rappeler cette limitation de 1 à 100 à chaque fois que vous la définissez, ce qui conduit à un code dupliqué ou lorsque vous l'oubliez, cela conduit à un état invalide.

Quant aux performances, je suis avec Knuth ici :

"Nous devrions oublier les petites efficacités, disons environ 97 % du temps :L'optimisation prématurée est la racine de tout Mal."

Autres conseils

@Terrapin, concernant :

Si tout ce que vous avez, c'est un tas de propriétés de [set public / get] simples ...ils pourraient aussi bien être des champs

Les propriétés présentent d'autres avantages par rapport aux champs.Il s'agit d'un contrat plus explicite, ils sont sérialisés, ils peuvent être débogués plus tard, ils constituent un bon endroit pour l'extension par héritage.La syntaxe plus maladroite est une complexité accidentelle – .net 3.5 par exemple surmonte ce problème.

Une pratique courante (et imparfaite) consiste à commencer par des champs publics, puis à les transformer en propriétés plus tard, « selon les besoins ».Cela rompt votre contrat avec toute personne qui consomme votre cours, il est donc préférable de commencer par les propriétés.

Ça dépend.

Généralement, le code devrait échouer rapidement.Si la valeur peut être définie par plusieurs points dans le code et que vous validez uniquement après avoir récupéré la valeur, le bug semble être dans le code qui effectue la mise à jour.Si les setters valident l'entrée, vous savez quel code tente de définir des valeurs non valides.

Du point de vue d'avoir le code le plus maintenable, je pense que vous devriez faire autant de validation que possible dans le setter d'une propriété.De cette façon, vous ne mettrez pas en cache ou ne traiterez pas de données invalides.

Après tout, c’est à cela que servent les propriétés.Si tout ce que vous avez, c'est un tas de propriétés comme...

public string Name
{
    get
    {
        return _name;
    }
    set
    {
        _name = value;
    }
}

...ça pourrait tout aussi bien être des champs

Tu pourrais vouloir vérifier Conception basée sur le domaine, par Eric Evans.DDD a cette notion de spécification :

...valeur explicite de type prédicat OBJETS à des fins spécialisées.A LA SPÉCIFICATION est un prédicat qui détermine si un objet fait ou fait ne répondent pas à certains critères.

Je pense qu'échouer rapidement est une chose, l'autre est de savoir où conserver la logique de validation.Le domaine est le bon endroit pour conserver la logique et je pense qu'un objet de spécification ou une méthode de validation sur vos objets de domaine serait un bon endroit.

La validation doit être capturée séparément des getters ou setters dans une méthode de validation.De cette façon, si la validation doit être réutilisée sur plusieurs composants, elle est disponible.

Lorsque le setter est appelé, un tel service de validation doit être utilisé pour nettoyer les entrées dans l'objet.De cette façon, vous savez que toutes les informations stockées dans un objet sont valides à tout moment.

Vous n'avez besoin d'aucune sorte de validation pour le getter, car les informations sur l'objet sont déjà considérées comme valides.

Ne sauvegardez pas votre validation jusqu'à une mise à jour de la base de données !!Il vaut mieux échouer rapidement.

J'aime mettre en œuvre IDataErrorInfo et mettez ma logique de validation dans ses propriétés Error et this[columnName].De cette façon, si vous souhaitez vérifier par programme s'il y a une erreur, vous pouvez simplement tester l'une ou l'autre de ces propriétés dans le code, ou vous pouvez confier la validation à la liaison de données dans Web Forms, Windows Forms ou WPF.

La propriété de liaison « ValidatesOnDataError » de WPF rend cela particulièrement simple.

J'essaie de ne jamais laisser mes objets entrer dans un état invalide, donc les setters auraient certainement une validation ainsi que toutes les méthodes qui changent d'état.De cette façon, je n’ai jamais à craindre que l’objet avec lequel je travaille ne soit invalide.Si vous conservez vos méthodes comme limites de validation, vous n'aurez jamais à vous soucier des cadres de validation et des appels de méthode IsValid() disséminés partout.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top