2010-03-11 6 views
1

Je crée des interfaces et des classes abstraites qui représentent un cadre de messagerie pour les messages courts texte comme SMS, email, twitter, xml, etc. et je me demandais où je devrais mettre le code de validation du message. Le fait est que j'écris seulement les superclasses et les interfaces, donc je ne mets pas l'implémentation réelle dedans, je vais juste mettre les hooks dedans qui permettent aux autres de valider le contenu des messages. La façon dont je le vois, je pouvais le faire de plusieurs façons:Où dois-je mettre le code de validation?

  • dans l'abstrait superclasse « Message », ont une méthode abstraite « isValid ». Une variante de ceci serait d'avoir isValid appelé lorsque le constructeur Message est appelé, en lançant une MalformedMessageException si le message est mal formaté.

  • Dans la couche de transport, immédiatement avant l'envoi, validez le message. J'aurais une méthode send (Message) qui appelle une méthode isValid (Message) immédiatement avant son envoi.

  • avoir un validateur de message singleton avec une méthode statique isValid (Message) appelée à un moment donné.

Je suis sûr qu'il y a d'autres options qui me manquent. Actuellement, je penche vers le premier, mais il ne me semble pas juste d'avoir du code de validation dans ce qui devrait être un objet de domaine.

Répondre

0

Le message est une chose. Un conteneur de données.

La validation est une séparée chose. La validation est distincte du message, car la validation dépend des données non-Message. La validation inclut un ou plusieurs algorithmes qui déterminent si un message valide peut être généré à partir de certaines données.

Vous souhaitez que les messages soient générés uniquement lorsqu'ils sont valides. Vous voulez que toutes les méthodes d'un message exigent et dépendent de la validité. Cela vous donne une responsabilité facile à comprendre. Par conséquent, un message ne doit contenir aucune logique de validation. Par conséquent, un message ne doit pas contenir de logique de validation. Cette logique vit juste en dehors des limites d'un message valide. Cela fait partie d'un MessageFactory ou d'un MessageValiadtor qui détermine si une flaque de données peut être utilisée pour créer un message valide. Vous avez deux choses: MessageValidator (ou MessageFactory) et Message. Il n'y a pas isValid dans un message. Cela doit être valide ou cela n'existerait pas. MessageValidator génère des messages à partir des données source. Si elle ne peut pas construire un message peut peut jeter une exception. Il devrait également accumuler la liste des erreurs qu'il trouve afin qu'il puisse être interrogé pour déterminer quels étaient les différents problèmes. Considérons les mutations possibles: Sous-classes de variantes multiples du message. Le validateur peut identifier une sous-classe spécifique. Aucune modification d'application n'est requise pour implémenter cela. Validateurs multiples pour des situations spéciales, des exceptions, des extensions, etc. C'est juste une sous-classe de MessageValidator avec la même interface que tous les valideurs et émet une instance de Message (ou de l'une de ses sous-classes).

Étant donné que les règles de validation sont distinctes d'un message valide, le Validateur peut également fournir différentes valeurs par défaut ou données dérivées.

+0

Donc, dites-vous que je devrais compter sur les implémenteurs de ce framework pour valider les messages avant qu'ils ne les créent? Ou dites-vous que je devrais utiliser une variation sur le premier choix, en tirant le code de validation, peut-être dans l'objet MessagingService lui-même? – DLaw

+0

Validez avant de créer. Toujours. Les objets de message doivent être valides. on ne peut pas leur demander s'ils sont valides. Le ne devrait pas exister s'ils sont invalides. –

+0

Votre édition a beaucoup de sens pour moi. Merci! – DLaw

Questions connexes