2009-09-09 3 views
2

Si un objet peut persister entre plusieurs exécutions (que ce soit une base de données utilisant ORM, un module comme le module shelve de Python), faut-il placer les attributs de cet objet dans la classe qui le représente ou à l'extérieur?Les objets persistants doivent-ils valider les données lors de l'ensemble?

Ou plutôt; l'objet persistant doit-il être et attendez-vous à ce que ses valeurs soient bienveillantes, ou intelligent et de valider les données qui lui sont assignées? Je ne parle pas de validation de type ou de validation d'entrée utilisateur, mais de choses qui affectent l'objet persistant tels que des liens/références à d'autres objets existent, assurant que les nombres sont non signés, que les dates ne sont pas hors de portée, etc.

Répondre

0

Ma politique est que, pour qu'un code global soit robuste, chaque objet A doit vérifier autant que possible, le plus tôt possible. Mais le « autant que possible » a besoin d'explication:

  • La cohérence interne de chaque champ B en A (type, gamme dans le type, etc.) doit être vérifié par le type de champ B lui-même. Si c'est un champ primitif, ou une classe réutilisée, ce n'est pas possible, donc l'objet A devrait le vérifier.
  • La cohérence des domaines connexes (si ce champ B est nul, alors C doit également être) est de la responsabilité typique de l'objet A.
  • La cohérence d'un champ B avec d'autres codes qui sont externes à A est une autre question. C'est ici que l'approche "pojo" (en Java, mais applicable à n'importe quelle langue) entre en jeu.

L'approche POJO dit que toutes les responsabilités/préoccupations que nous avons dans les logiciels modernes (persistence & validation ne sont que deux d'entre eux), fin modèle de domaine par être désordonné et difficile à comprendre. Le problème est que ces objets de domaine sont essentiels à la compréhension de l'ensemble de l'application, à la communication avec les experts du domaine, etc.Chaque fois que vous devez lire un code d'objet de domaine, vous devez gérer la complexité de toutes ces préoccupations, alors que vous n'en avez aucun ...

Ainsi, dans l'approche POJO, les objets de votre domaine ne doivent pas porter code lié à l'une de ces préoccupations (qui porte généralement une interface à mettre en œuvre, ou une superclasse à avoir). Toutes les préoccupations sauf le domaine un sont hors de l'objet (mais certaines informations simples peuvent encore être fournies, en java généralement via Annotations, pour paramétrer le code externe générique qui gère un problème).

De plus, les objets de domaine se rapportent uniquement à d'autres objets de domaine, et non à certaines classes de structure liées à une préoccupation (telle que la validation ou la persistance). Ainsi, le modèle de domaine, avec toutes les classes, peut être placé dans un «paquet» séparé (projet ou autre), sans dépendance aux codes techniques ou liés aux préoccupations. Cela rend beaucoup plus facile de comprendre le cœur d'une application complexe, sans toute cette complexité de ces aspects secondaires.

1

L'objet doit valider l'entrée de données. Sinon, chaque partie de l'application qui affecte des données doit appliquer le même ensemble de tests, et chaque partie de l'application qui récupère les données persistantes devra gérer la possibilité qu'un autre module n'ait pas effectué ses vérifications correctement.

Incidemment, je ne pense pas que ce soit un objetg orienté. Cela s'applique à toute construction de persistance de données qui prend des entrées. Fondamentalement, vous parlez des conditions préalables de conception par contrat.

2

La validation est une partie de l'encapsulation - un objet est responsable de son état interne, et la validation est partie de son état interne. C'est comme demander "est-ce que je devrais laisser un objet faire une fonction et définir ses propres variables ou devrais-je user getters pour les obtenir tous, faire le travail dans une fonction externe et ensuite les setters pour les rétablir?" Bien sûr, vous devez utiliser une bibliothèque pour effectuer la plus grande partie de la validation. Vous ne voulez pas implémenter la fonction "vérifier les valeurs non signées" dans chaque modèle. Vous devez donc l'implémenter à un endroit et laisser chaque modèle l'utiliser. son propre code comme en forme.

Questions connexes