la vérification des données dans Getter / Setter ou ailleurs?

voix
9

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

Cela pourrait vous surprendre être quand il s'agit d' optimisations et d' accélérer le code, je pense que vous ne devriez pas faire des vérifications dans des accesseurs, mais dans le code où vous mettre à jour vos fichiers ou base de données. Ai-je tort?

Créé 05/08/2008 à 20:51
source utilisateur
Dans d'autres langues...                            


8 réponses

voix
13

Eh bien, l'un des reaons pourquoi les classes contiennent généralement des membres privés avec getters publics / setters est exactement parce qu'ils peuvent vérifier les données.

Si vous avez un numéro que peut être compris entre 1 et 100, je serais certainement mettre quelque chose dans le setter qui valide cela et alors peut-être jeter une exception qui est pris par le code. La raison est simple: Si vous ne le faites pas dans le poseur, vous devez vous rappeler que 1 à 100 limitation chaque fois que vous définissez, ce qui conduit à un code dupliquée ou lorsque vous l'oubliez, elle conduit à un état non valide.

En ce qui concerne la performance, je suis avec Knuth ici:

« Nous devons oublier les petits gains d'efficacité, par exemple environ 97% du temps: l'optimisation prématurée est la racine de tout le mal. »

Créé 05/08/2008 à 20:59
source utilisateur

voix
4

@Terrapin, re:

Si vous ne disposez que d'un groupe de propriétés [simple ensemble du public / get] ... ils pourraient aussi bien être des champs

Les propriétés ont d'autres avantages par rapport aux champs. Ils sont un contrat plus explicite, ils sont sérialisés, ils peuvent être plus tard débogués, ils sont un endroit agréable pour l'extension par héritage. La syntaxe est clunkier une complexité accidentelle - .net 3.5 par exemple permet de surmonter cela.

Une commune (et erronée) la pratique est de commencer avec les champs publics, et les transformer en propriétés plus tard, sur une base « au besoin ». Cela rompt le contrat avec quelqu'un qui consomme votre classe, il est donc préférable de commencer avec des propriétés.

Créé 08/08/2008 à 01:07
source utilisateur

voix
3

Ça dépend.

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

Créé 05/08/2008 à 20:59
source utilisateur

voix
3

Du point de vue d'avoir le code le plus maintenable, je pense que vous devriez faire autant de validation que vous pouvez dans le poseur d'une propriété. De cette façon, vous ne serez pas mise en cache ou traiter autrement des données non valides.

Après tout, c'est ce que les propriétés sont destinés. Si vous ne disposez que d'un groupe de propriétés comme ...

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

... ils pourraient aussi bien être des champs

Créé 05/08/2008 à 20:59
source utilisateur

voix
1

J'essaie de ne jamais laisser mes objets se trouvent dans un état invalide, setters aurait certainement la validation ainsi que toutes les méthodes qui changent d'état. De cette façon, je ne jamais avoir à craindre que l'objet que je traite est invalide. Si vous gardez vos méthodes comme limites de validation, alors vous ne devez jamais vous soucier de cadres de validation et les appels de méthode IsValid () parsemés un peu partout.

Créé 23/09/2008 à 20:44
source utilisateur

voix
1

Je tiens à mettre en œuvre IDataErrorInfo et de mettre ma logique de validation dans son erreur et ce [columnName] propriétés. De cette façon , si vous voulez vérifier par programme s'il y a une erreur , vous pouvez simplement tester l' une de ces propriétés dans le code, ou vous pouvez remettre la validation hors de la liaison de données dans les formulaires Web, Windows Forms ou WPF.

« ValidatesOnDataError » propriété de liaison WPF rend ce particulièrement facile.

Créé 07/08/2008 à 23:24
source utilisateur

voix
1

Vous voudrez peut - être consulter Domaine Driven Design , par Eric Evans. DDD a cette notion d'une spécification:

... VALEUR comme prédicat objets explicites à des fins spécialisées. Une spécification est un prédicat qui détermine si un objet fait ou ne satisfait pas certains critères.

Je pense ne pas est une chose rapide, l'autre est là pour maintenir la logique de validation. Le domaine est le bon endroit pour garder la logique et je pense un objet de spécification ou une méthode de validation sur vos objets de domaine serait un bon endroit.

Créé 05/08/2008 à 21:03
source utilisateur

voix
1

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

Lorsque le compositeur est appelé, un tel service de validation doit être utilisé pour nettoyer l'entrée dans l'objet. De cette façon, vous savez toutes les informations stockées dans un objet est valide en tout temps.

Vous n'avez pas besoin tout type de validation pour le getter, parce que les informations sur l'objet est déjà fait confiance pour être valide.

Ne pas enregistrer votre validation jusqu'à ce qu'une mise à jour de base de données !! Il est préférable de ne pas rapide .

Créé 05/08/2008 à 20:55
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more