optimization - Des vérifications de données dans Getter / Setter ou ailleurs?

Translate

Je me demande si c'est une bonne idée de fairevérificationsdansgettersetposeurs, ou ailleurs dans le code.

Cela pourrait vous surprendre quand il s'agit deoptimisationsetexcès de vitessedans le code, je pense que vous ne devriez pas faire de vérifications dans les getters et les setters, mais dans le code où vousmise à jourvos fichiers ou votre base de données. Ai-je tort?

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

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 qui peut être compris entre 1 et 100, je mettrais certainement quelque chose dans le setter qui valide cela et puis peut-être lancer 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 souvenir de 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.

En ce qui concerne les performances, je suis avec Knuth ici:

"Nous devrions oublier les petites efficiences, disons environ 97% du temps: l'optimisation prématurée est la racine de tout mal."

La source
Translate

@Terrapin, re:

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

Les propriétés ont d'autres avantages par rapport aux champs. C'est un contrat plus explicite, ils sont sérialisés, ils peuvent être débogués plus tard, c'est un bon endroit pour l'extension par héritage. La syntaxe plus maladroite est une complexité accidentelle - .net 3.5 par exemple surmonte cela.

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

La source
Translate

Ça dépend.

En règle générale, le code doit échouer rapidement. Si la valeur peut être définie par plusieurs points dans le code et que vous ne validez que sur après avoir récupéré la valeur, le bogue 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.

La source
Translate

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

... autant de champs

La source
Translate

Vous voudrez peut-être vérifierConception pilotée par le domaine, par Eric Evans. DDD a cette notion de spécification:

... OBJETS DE VALEUR de type prédicat explicite à des fins spécialisées. Une SPÉCIFICATION est un prédicat qui détermine si un objet satisfait ou non à certains critères.

Je pense qu'échouer rapidement est une chose, l'autre est où garder la logique de validation. Le domaine est le bon endroit pour garder 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 source
Translate

La validation doit être capturée séparément des getters ou des 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 l'entrée 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à approuvées pour être valides.

N'enregistrez pas votre validation avant une mise à jour de la base de données !! Il vaut mieuxéchouer rapidement.

La source
Translate

J'aime mettre en œuvreIDataErrorInfoet 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 existe une erreur, vous pouvez simplement tester l'une de ces propriétés dans le code, ou vous pouvez transférer 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 facile.

La source
Translate

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

La source