27 votes

Une classe doit-elle se valider elle-même ou créer une autre classe pour la valider ?

Disons que j'ai une classe comme :

class NavigationData
{
  float roll;
  float pitch;
  double latitude;
  double longitude;
}

et si je veux créer une méthode :

const bool validate() const;

qui vérifie si les 4 champs contiennent des valeurs valides.

Est-ce que validate() doit faire partie de la classe NavigationData, ou est-ce que je dois créer quelque chose comme un NavigationDataValidator, qui contient une méthode validate(const NavigationData&).

Je ne donne qu'un exemple simple, ma classe réelle est évidemment beaucoup plus compliquée que cela. Je suis à la recherche de bons principes OO.

En d'autres termes, si l'on considère une méthode, comment savoir si elle doit appartenir à la classe ou à une classe distincte ?

29voto

John Feminella Points 116878

En règle générale, il incombe à une classe de s'assurer qu'elle maintient un état interne logiquement cohérent et valide. Par exemple, Person peut avoir un constructeur qui requiert à la fois un prénom et un nom de famille si les opérations sur les Person n'ont pas de sens sans ces données.

Cependant, "logiquement cohérent et valide" est différent de "fait sens dans le domaine" Ainsi il incombe parfois à une classe externe de veiller à ce que les règles du domaine soient respectées . Par exemple, PersonValidator peut exiger que Person a un numéro de téléphone aux États-Unis. Mais Person ne devrait pas nécessairement avoir besoin de savoir si une PhoneNumber est aux États-Unis.

En règle générale, si des règles d'état ou de domaine externes à la classe sont nécessaires en plus des données qui appartiennent déjà à la classe, il convient d'envisager une validation externe. Vous pouvez également centraliser la validation dans une classe externe si l'état des instances de la classe peut provenir de sources multiples (base de données, formulaire web, fichier, etc.).

8voto

cherouvim Points 18550

La bonne réponse est la suivante : cela dépend .

L'endroit naturel où placer cette logique d'objet est l'objet lui-même. Cependant, les règles de validation peuvent parfois dépendre d'un moteur de règles ou d'une sorte de "cadre" plus large qui valide les choses. Une autre situation dans laquelle il n'est pas souhaitable d'effectuer la validation à l'intérieur de l'objet est celle où la validation relève d'un autre niveau ou d'une autre couche de l'application, par exemple la couche de visualisation.

3voto

Votre classe doit être conçue de telle manière et fournir des méthodes telles que validate() soit toujours vrai :

  • après tout constructeur public invoqué
  • avant et après l'invocation d'une méthode publique
  • (en C++) avant que le destructeur ne soit invoqué

Ces méthodes validate() sont appelées invariants de classe et constituent un élément important de la politique de l'Union européenne en matière d'éducation et de formation. Conception par contrat .

1voto

ongle Points 4567

Je dirais que cela dépend. Si les données de la classe sont validables isolément, je mettrais la méthode dans la classe, mais si la validation nécessite un contexte, je créerais une classe de validateur basée sur une interface.

1voto

Johnco Points 1389

Cela dépend...

Parfois, les validations ne font pas partie de la classe elle-même, mais de la logique d'entreprise, et les ajouter à la classe empêcherait la réutilisation, et par conséquent, l'utilisation d'une classe de validation est une bonne chose. Dans le cas contraire, la classe devrait être capable de se valider elle-même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X