Dans DDD, la logique d'application de validation ou la logique de domaine est-elle?

26

Supposons que nous modélisons un formulaire en utilisant DDD; le formulaire peut être associé à un certain type de règles commerciales - vous devrez peut-être spécifier un revenu si vous n'êtes pas étudiant, et vous devez répertorier vos enfants si vous indiquez que vous êtes marié. Et si vous avez spécifié un pays, il doit avoir un pays valide.

Ce type de validation existe-t-il dans le domaine ou la couche d'application? Quelques autres questions que je considérais:

  • Certains frameworks, tels que Laravel, fournissent des règles de validation qui peuvent valider l'entrée avant qu'une requête n'atteigne le contrôleur. Est-ce qu'il casse DDD si la validation est effectuée à ce niveau?

  • Pour des cas comme déterminer si le pays est valide, je vais généralement interroger une table de base de données de tous les pays du monde. Cependant, dans DDD, cela est susceptible (d'après ma compréhension) de se faire sur la couche domaine. La couche de domaine est-elle autorisée à accéder à la base de données ou dois-je utiliser une recherche non SQL pour déterminer un pays valide?

  • Est-il nécessaire de valider l'entrée à la fois au niveau de l'application et de la couche domaine?

Extrakun
la source
6
Votre question suppose qu'il y a toujours un endroit correct pour tout mettre. Il n'y en a pas.
Robert Harvey
1
Ce que dit @RobertHarvey. La validation doit toujours être sur le modèle, quelle que soit la validation par "l'application" (le modèle ne fait-il pas partie de l'application?). Toute validation dans «l'application» ne doit être qu'une répétition de la validation du modèle - pour améliorer la réactivité de l'interface utilisateur, ou doit être liée uniquement à la logique «d'application» (comme dans: «sur ce formulaire, vous ne pouvez entrer que. .. ", mais je supposais une validation d'entité). Ne faites jamais confiance à la couche "application" pour la validation du domaine, ce n'est peut-être pas votre client qui envoie les informations ...
Marjan Venema

Réponses:

29

Ce type de validation existe-t-il dans le domaine ou la couche d'application?

Application. Le terme de recherche magique que vous recherchez est la couche anti-corruption

En règle générale, le message reçu par votre application aura une certaine saveur de DTO. Votre couche anti-corruption créera généralement des types de valeur que le domaine reconnaîtra. La commande réelle envoyée au modèle de domaine sera exprimée en termes de types de valeurs validées.

Exemple: une commande DepositMoney comprendrait probablement un montant et un type de devise. La représentation DTO exprimerait probablement le montant sous forme d'entier et le code de devise sous forme de chaîne. La couche anti-corruption convertirait le DTO en un type de valeur de dépôt, qui comprendrait un montant validé (qui doit être non négatif) et un CurrencyCode validé (qui doit être l'un des codes pris en charge dans le domaine).

Après avoir analysé avec succès la commande en types que le modèle de domaine comprend, la commande est exécutée dans le domaine, qui peut toujours rejeter la commande au motif qu'elle violerait l'invariant métier (le compte n'existe pas encore, le compte est bloqué, ce compte particulier n'est pas autorisé à utiliser cette devise? etc.).

En d'autres termes, la validation métier va se produire dans le modèle de domaine, une fois que la couche anti-corruption aura validé les entrées.

L'implémentation des règles de validation vivra normalement soit dans le constructeur du type de valeur, soit dans la méthode d'usine utilisée pour construire le type de valeur. Fondamentalement, vous limitez la construction des objets de manière à garantir leur validité, en isolant la logique en un seul endroit et en l'invoquant aux limites du processus.

VoiceOfUnreason
la source
Pourquoi l'application est-elle la réponse? Selon votre texte, la validation formelle peut être effectuée à la fois dans le domaine ou dans l'application et la validation commerciale dans le domaine uniquement.
inf3rno
@ inf3rno parce que les questions spécifiquement posées sur la validation d'un formulaire, qui n'est pas lié au domaine
horaire
1
Cette réponse n'a aucun sens. La couche anti-corruption de DDD est un code supplémentaire que vous écrivez afin de traduire vers / depuis un modèle de domaine externe (d'un autre système) et le modèle de domaine de votre application basée sur DDD. S'il n'y a pas un tel système externe, il n'y a pas de couche Anti-Corruption. En outre, la validation des règles métier appartient au modèle de domaine (et à la couche domaine), pas à la couche application. Quant aux DTO, il s'agit d'un composant technique (dans la couche Application) qui peut ou non exister dans une application DDD. La conversion entre les DTO et les entités / ValueObjects n'a rien à voir avec les couches anti-corruption.
Rogério
5

Votre modèle de domaine problématique inclut les règles métier de votre domaine. Les règles métier sont des contraintes sur les éléments du modèle. Cela signifie qu'un ascenseur ne bouge pas avec la porte ouverte, que les denrées périssables ne sont pas chargées dans un conteneur non réfrigéré et qu'une commande annulée n'est pas expédiée.

Cela ne signifie pas que lorsque votre domaine interagit avec des humains (via des écrans, des formulaires, etc.), il n'y a pas besoin de validation ou d'assistance. Rendez-vous compte que c'est facultatif.

Sachez qu'il existe deux types de règles métier: - les règles de propriété qui contraignent les attributs d'un objet et les règles de collaboration qui limitent l'ajout et la suppression de collaborations entre les objets.

Les règles métier sont différentes des règles logiques, qui sont liées à votre langage de programmation et vérifient que les valeurs ont été fournies et ne sont pas nulles, etc.

Remarque: il n'y a pas de concept dans DDD de "modélisation" de votre formulaire.

aryeh
la source
0

Un état spécifique rendrait-il invalide l'entité modèle? Si oui, le modèle doit empêcher l'entité d'atteindre cet état. Cela signifie que le modèle doit savoir se valider.

Mais il y a un léger problème: la validation du modèle arrive souvent trop tard. Souvent, nous voulons effectuer la validation tôt, afin que l'utilisateur n'ait pas à attendre trop longtemps. C'est pourquoi la validation est souvent placée dans la logique d'application.

Quant au contexte de validation: Il n'y a aucun problème d'entité pouvant demander des données supplémentaires. Mais il ne devrait pas se soucier d'où viennent ces données. Peu importe qu'il provienne de SQL, de fichier ou qu'il soit simplement codé en dur. C'est pourquoi les référentiels existent. Le domaine définit le type de requête dont il a besoin et permet à quelqu'un d'autre de s'occuper de l'implémentation.

Euphorique
la source
-2

La couche de domaine doit contenir toute la logique de validation. La présentation, les couches anti-corruption ou autres couches dépendantes devraient refléter cela.

Barry Faassen
la source