Contextes et domaines DDD délimités?

16

J'ai travaillé dans une application relativement complexe avec 10 tables de base de données (agrégats, entités / objets de valeur) et en appliquant DDD. À ce stade, il semble être essentiellement DDD-Lite, ce qui signifie qu'il existe des services d'application / de domaine, le modèle de domaine (entités, objets de valeur) et des référentiels.

J'ai pris un livre sur l' implémentation de DDD et la première chose qu'il mentionne est DDD-Lite et les contextes délimités et les événements de domaine manquants comme premières erreurs qui sont habituelles lors du démarrage de DDD.

Actuellement, j'ai essayé d'organiser le modèle de domaine par relations d'agrégation et d'utiliser des espaces de noms pour le démontrer.

Je n'arrive pas à voir les avantages / inconvénients liés à la séparation du projet de modèle de domaine dans des contextes délimités distincts (pour l'instant). Peut-être que cela deviendra apparent plus tard, mais j'aimerais avoir des commentaires de la vie réelle sur les contextes délimités (et éventuellement des sous-domaines, etc. s'ils y sont liés).

lko
la source
Il me semble que la seule chose qui définit des contextes délimités séparés est la nécessité de différencier la linguistique et les différences opérationnelles associées, c'est-à-dire que cela s'appelle un produit dans un domaine et un produit dans un autre domaine, mais ils sont différents, nous avons donc besoin de deux produits et ils peuvent tous les deux '' t être dans le même modèle (même nom, etc.). Alors pourquoi ne changeons-nous pas simplement les noms pour représenter leur sémantique subtilement différente? Ils nous pourraient avoir un modèle pour les gouverner tous. Les sous-domaines sont naturels mais je ne vois pas de contextes bornés pour le moment. Je pense à haute voix ici ...
Ashley Aitken
Je suppose que vous avez déjà compris pourquoi il est rentable de diviser votre domaine sur des contextes. Donc, ce qui pourrait être utile maintenant, c'est la bonne façon de les identifier, de définir les limites du contexte. Voici comment je le fais: medium.com/@wrong.about/…
Zapadlo

Réponses:

20

Prenons une entreprise qui a plusieurs départements différents:

  • Développement de logiciels
  • HEURE
  • Comptabilité

Pouvez-vous proposer un modèle utilisateur qui peut représenter de manière expressive tous ces domaines d'activité? Pensez à quoi pourrait ressembler l'entité Utilisateur dans chacune. Il est peut-être divisé en trois entités différentes:

  • Développeur
  • Employé
  • Bénéficiaire

L'effort pour instancier un utilisateur dans chaque contexte est considérablement différent. C'est peut-être quelque chose comme ça:

  • nouvel employé (ssn, nom, joindate, date de naissance, sexe)
  • nouveau développeur (employé, poste de travail, informations d'identification)
  • nouveau bénéficiaire (employé, rôle)

excusez l'exemple, il est difficile d'illustrer avec précision sans un modèle de domaine approprié pour référencer

Si vous utilisiez une implémentation naïve et utilisiez une seule entité utilisateur, cela finirait par être un modèle de données anémique plein de getters et de setters, car vous ne pourriez pas représenter complètement l'utilisateur partout.

Il y a des limites claires dans l'entreprise, il est donc utile de les modéliser de cette façon. Un utilisateur se connectant par rapport à un utilisateur dans un système de paie par rapport à un utilisateur jouant à un jeu sont tous très différents, même s'ils font partie du même grand système.

Penser autrement - vous pouvez maintenant créer votre code de gestion de développeur pour être très léger et indépendant du reste de votre système. Il peut utiliser des types plus précis avec moins de bagages. C'est l'étape de la construction de sous-systèmes plus petits qui peuvent éventuellement être extraits dans sa propre application.

Adrian Schneider
la source
Merci pour l'exemple qui aide à illustrer les différents besoins des 3 BC.
lko
Pas la façon dont j'ai l'habitude de voir ces concepts: normalement, un Employeen'est pas un User, il a un User. Il Users'agit simplement d'une entité par laquelle une personne peut se connecter et accéder à une ou plusieurs applications au sein de l'organisation. Et un Employeen'a pas toujours un User. De plus, vous n'obtenez généralement pas de demande simple pour différents services; En règle générale, chaque département a ses propres applications, chacune contenant ses propres modèles de domaine. Donc, pour moi, cette réponse n'aide pas à clarifier la nécessité d'avoir des contextes bornés séparés dans la même base de code.
Rogério
@ Rogério votre objection est en fait un bel exemple sur la raison pour laquelle il est important de définir correctement les langages omniprésents utilisés dans chaque contexte délimité :)
MauganRa
Je me demande simplement dans les cas où nous avons un système de gestion de la clientèle, lorsque nous téléphonons pour interroger nos commandes, ou la facturation, etc. nous sommes mis en attente pendant que nous sommes transférés au service approprié. La connaissance du domaine de chaque département entre en jeu - au grand dam du client dans ces scénarios. On peut peut-être reprocher à DDD d'avoir forcé la séparation entre ces contextes.
Andez
16

Je peux vous donner un autre exemple. Considérez que vous avez un système de commerce électronique. Vous auriez des produits là-bas, mais les produits feront partie d'au moins deux domaines différents:

  • Catalogue de produits, où vous conservez la description de votre produit et tous ses attributs
  • Inventaire, où vous avez le niveau de stock des produits

Si vous avez un contexte délimité pour les deux domaines, votre solution peut rapidement devenir une grosse boule de boue car vous commencerez à le croiser. À la fin, vous n'aurez plus deux domaines. Votre inventaire de produits sera gâché avec des références de catalogue de produits et vice versa. En conséquence, vous ne pourrez pas changer de domaine sans en toucher un autre, même si vous réalisez que ce n'est pas nécessaire. Vos modèles deviennent dépendants les uns des autres et étroitement couplés, et dépendent dans le mauvais sens - dépendant de la mise en œuvre.

Cependant, si vous avez deux contextes limités, toutes les modifications que vous effectuez dans un domaine n'affecteront pas l'autre dès que vous gardez vos canaux de communication clairs. Cela signifie que vous devez avoir une duplication des données, mais c'est le moindre coût à payer pour une application basée sur des composants à couplage lointain. Vos domaines peuvent communiquer entre eux à l'aide d'événements de domaine. Même si vous ne prévoyez pas d'avoir une application basée sur SOA au début, vous pourrez évoluer jusqu'à ce niveau lorsque vous en aurez besoin avec un effort relativement faible, car vous modifiez simplement le transport pour vos événements de domaine, en laissant l'idée derrière elle intacte.

Mise à jour: Il y a une bonne diffusion de compétences sur SkillsMatter, d'Eric Evans. Il donne une analogie avec la vieille histoire, lorsque plusieurs aveugles décrivent un éléphant de leur point de vue. Étant donné que chaque homme ne peut toucher qu'une partie de l'éléphant, ils le décrivent comme un "arbre", un "mur", un "serpent", une "corde". Et chacun de ces hommes est dans son contexte. Le contexte borné est celui où vit une langue omniprésente. En dehors du contexte, ces termes peuvent avoir une signification complètement différente mais à l'intérieur du contexte, la langue est la même dans plusieurs domaines. Greg Young suggère fortement de commencer à lire le livre bleu du chapitre 11, car les concepts fondamentaux les plus importants y sont expliqués. L'accent mis sur les schémas tactiques au début du livre rend cette approche «DDD-light» très courante,

Alexey Zimarev
la source
1
+1 pour avoir également évoqué la duplication. c'est un peu déroutant au début ("Suis-je en train de mal faire ça?!) mais c'est tout à fait naturel, dans de nombreux cas, requis.
Adrian Schneider
Dans ce scénario, ces Productclasses partagent-elles hypothétiquement le même ID (par exemple, les deux tables BC distinctes ont-elles une clé étrangère vers une table avec un ID produit unique)? Peut-être qu'en communiquant avec les événements de domaine, ils pourraient utiliser cet ID?
lko
1
Tout dépend du stockage choisi. Il n'est pas nécessaire d'utiliser l'ID technique pour faire référence à plusieurs domaines. Il est également déconseillé de faire une communication inter-contexte.
Alexey Zimarev
1
On dirait qu'il est temps de sortir le livre bleu de l'étagère et de lire ces chapitres ultérieurs
Markus Pscheidt