Excusez mon ignorance, je suis relativement novice en matière de DDD, alors soyez indulgent.
Je travaille sur un grand système de gestion de données basé sur la configuration. Le système est construit en spécifiant des éléments de configuration (comme des règles de gestion, des processus et des validations) dans une syntaxe externe. Disons simplement que cette syntaxe était un conglomérat d'un DSL basé sur Groovy et de Drools.
J'aime les idées de simplicité qu'offre DDD, notamment la séparation des préoccupations d'infrastructure des concepts fondamentaux du domaine.
Cependant, j'ai du mal à appliquer certains des concepts de la DDD en raison de la nature configurable du système. Le comportement (processus), la validation et les règles de gestion sont définis en dehors du système. Ainsi, les entités du domaine n'ont intrinsèquement pas de comportement propre. Elles sont plutôt délicates pour le "validateur", le "moteur de règles" ou le "moteur de flux de travail".
Je vais clarifier avec un exemple. Disons que mon système gère les employés d'une entreprise. Sans trop réfléchir, vous imaginez que j'ai une entité "employé" et une entité "entreprise" dans mon domaine.
En suivant DDD, j'essaie de modéliser un scénario dans lequel un employé est promu. On pourrait voir apparaître une nouvelle méthode sur l'employé appelée promote (Employee.promote). Nous pourrions avoir une règle de gestion, indiquant qu'un employé ne peut pas être promu deux fois dans la même année (oui, tout ceci est inventé). Je pourrais donc avoir quelque chose comme :
public void promote( EmployeeLevel newLevel ) {
if ( hasBeenPromotedThisYear( this ) {
throw new InvalidPromotionException
Eh bien, dans l'application avec laquelle je travaille, cette règle de gestion serait externalisée vers un moteur de règles. En suivant DDD, je pourrais faire quelque chose comme :
if( promotionRules.isEligibleForPromotion(this)
Pour externaliser mes règles. Cependant, le système est beaucoup plus générique que cela. L'opération "promotion" elle-même est définie comme un "processus" par une configuration externe. Ainsi, au moment de la compilation, je ne saurais même pas si j'ai une opération de "promotion" disponible pour cet employé. Mon objet "employé" devient donc très dépouillé du point de vue du code, déléguant toutes les fonctionnalités à la configuration. Cela pourrait ressembler à quelque chose comme :
public class Employee {
public void execute( Process process )
Ou alternativement
public class EmployeeProcess {
public void process( Employee employee )
Ma question est la suivante : DDD a-t-il vraiment un sens dans cette application ? Devrais-je plutôt modéliser la collaboration des processus, les validations, les règles métier (moteur de règles) dans un sens autre que DDD ?
J'aime l'architecture en oignon, et je peux utiliser UI -> App Services -> Core -> Infrastructure pour garder une bonne séparation des préoccupations. Mais le noyau pourrait être constitué des collaborateurs mentionnés ci-dessus, par opposition à de véritables "concepts de domaine".
Une partie de moi pense que, dans ce cas, les "concepts de domaine" SONT les validateurs, les processeurs, les règles de gestion, car ils constituent le langage omniprésent dont nous parlons lorsque nous discutons de notre système. Dans ce cas, j'aurais des entités sans comportement réel (pour la plupart), et des concepts de domaine en termes de processeurs, de validateurs, de moteurs de règles qui réalisent le comportement dans le système.
J'ajoute un peu plus d'informations. Compte tenu de ma question ci-dessus, je travaillais à une solution qui ressemblerait à ceci :
org.example.app
org.example.domain - Employé - Entreprise - Niveau de l'employé
org.example.domain.shared - Processus - BusinessRule - Validateur
org.example.infrastructure
J'espère que ce petit bout de phrase apporte un peu de clarté.
Ainsi, les concepts Process, BusinessRule et Validator se trouveraient à l'intérieur du domaine, mais supporteraient le modèle de domaine en termes de ce que fait le système.