Qu'est-ce qu'un contexte délimité par rapport à DDD?

40

En travaillant sur le livre "Implementing Domain Driven Design" de Vaughn Vernon, je suis incapable de bien comprendre ce qu'est un contexte délimité.

Le livre définit un contexte délimité comme "une frontière conceptuelle dans laquelle un modèle de domaine est applicable. Il fournit un langage omniprésent qui est parlé par l'équipe et exprimé dans son modèle logiciel soigneusement conçu" (la section "Guide de préparation de ce livre"). Cette définition donnerait l’impression qu’un contexte délimité est le modèle et le langage d’un sous-domaine, où ce sous-domaine peut devenir le domaine principal (ce qui semble devoir être qualifié de "sous-domaine principal", mais une autre discussion ...). Cela laisse encore une certaine ambiguïté quant à ce qu'un contexte délimité fournit. Est-ce un groupe d'un ou plusieurs sous-domaines? Si un seul sous-domaine correspond à un contexte lié, que nous dit réellement le contexte lié?

Le chapitre 3 du même livre, cependant, fait référence aux techniques d'intégration entre des contextes liés. Cela semblerait toutefois impliquer que les contextes délimités sont en réalité des systèmes logiciels ou des artefacts de différentes variétés.

Martin Fowler discute brièvement de l’idée d’un contexte délimité ( http://martinfowler.com/bliki/BoundedContext.html ), mais ne clarifie pas vraiment la question.

En fin de compte, qu'est - ce qu'un contexte délimité? Est-ce un groupe de sous-domaines? Le modèle et le langage pour un sous-domaine? La mise en place d'un sous-domaine? Sans ces réponses, il semble assez difficile de comprendre comment décomposer un espace de problème réel dans des contextes limités.

Michael
la source
2
Cet article ne précise pas vraiment la définition, du moins pour moi. Il aborde l'idée de contextes délimités dans la mesure où ils peuvent s'appliquer de manière organisationnelle, mais ne ramène jamais vraiment cela au développement de logiciels.
Michael
1
D'ACCORD. Bien que je ne sois pas un expert en DDD, cette description de Microsoft a été utile (dans le paragraphe Introduction): msdn.microsoft.com/en-us/library/jj591572.aspx . Il dit: ...
Robert Harvey
1
Les contextes délimités sont des composants autonomes, avec leurs propres modèles de domaine et leur propre langage omniprésent. Ils ne doivent pas avoir de dépendance les uns aux autres au moment de l'exécution et doivent pouvoir fonctionner de manière isolée. Cependant, ils font partie du même système global et doivent échanger des données entre eux ...
Robert Harvey
1
... Si vous implémentez le modèle CQRS dans un contexte lié, vous devez utiliser des événements pour ce type de communication: votre contexte lié peut répondre aux événements déclenchés en dehors du contexte lié, et votre contexte lié peut publier des événements que d'autres les contextes liés peuvent souscrire à. Les événements vous permettent de maintenir le couplage lâche entre vos contextes délimités.
Robert Harvey

Réponses:

38

Les contextes et les sous-domaines liés existent à différents niveaux.

Un sous- domaine est une partie de l'espace du problème, c'est une partition naturelle du système, reflétant souvent la structure de l'organisation. Ainsi, la logistique et les opérations peuvent être séparées de la facturation . Eric différencie les sous-domaines de base , de support et génériques en fonction de leur pertinence commerciale dans le scénario donné.

Les contextes font partie de l'espace des solutions. Ils sont des modèles . Ce serait une bonne chose de les avoir, de refléter le partitionnement des domaines-sous-domaines ... mais la vie n’est pas toujours aussi facile. Et vous avez peut-être hérité d'un domaine hérité englobant tout ou plus de contexte dans le même sous-domaine (c'est-à-dire une ancienne application héritée que l'application de remplacement est en train de créer).

Pour avoir un contexte borné, vous devez avoir un modèle et une limite explicite autour de celui-ci. Exactement ce qui manque dans de nombreuses applications basées sur les données qui utilisent des bases de données pour partager des données.

Une autre façon - orthogonale - de voir cela peut être la suivante. La langue omniprésente , la condition particulière dans laquelle chaque terme a une définition unique et non ambiguë, n’a pas d’échelle. Plus vous l'agrandissez, plus l'ambiguïté s'infiltre. Si vous voulez réaliser des modèles précis et non ambigus, vous devez expliciter leurs frontières et parler de nombreux petits langages ubiquitaires, chacun dans un même contexte délimité, avec un objectif bien défini. .

ZioBrando
la source
1
Donc, dans un monde idéal, il y aurait une relation un-à-un entre les sous-domaines et les contextes liés? (Comprendre, évidemment, que ce qui est idéal et ce qui est vrai diffèrent).
Michael
2
Pas nécessairement: l’essentiel est qu’une Colombie-Britannique recouvrant de nombreux sous-domaines est une mauvaise odeur. Eh bien ... ce n'est pas borné. En termes de DDD, un modèle devrait être parfaitement adapté à son objectif, et différents sous-domaines ont des objectifs différents (et probablement même des patrons différents ayant des objectifs différents). Mais dans le même sous-domaine, différents BC peuvent exister pour différentes raisons. Le Web et l'application mobile peuvent être le cas, ou différents modèles pour la planification ou l' exécution .
ZioBrando
Mais l'essentiel est de comprendre qu'il existe deux familles de problèmes: 1) la lecture du contexte existant (où vous ne pouvez accepter et classer que les modèles et les collaborations existants), 2) la conception du bon logiciel en fonction des contraintes existantes, imposant ainsi des limites de contexte. entre les petits modèles, orientés vers un but. Dans le deuxième scénario, vous ne chevaucherez pas intentionnellement les frontières des sous-domaines. ... en général, la recherche d'un logiciel parfait dans une organisation non parfaite peut être une tâche ardue. Mais résoudre ces incohérences pourrait valoir la peine.
ZioBrando
8

Les techniques de conception dirigée par domaine nous aident à créer des modèles du monde dans lequel nous vivons. Ces modèles existent en tant qu'idées dans l'esprit des personnes impliquées dans un projet.

Comme la télépathie en est encore à ses balbutiements, ces idées sont communiquées entre personnes à l'aide de mots et de phrases.

Les mots et les phrases peuvent être ambigus dans le meilleur des cas. Pour nous aider à réduire les ambiguïtés, nous utilisons le terme «contexte» pour clarifier leur signification.

Quand les gens se plongent profondément dans un projet de logiciel qui s'étend sur plusieurs années, ils semblent oublier le contexte dans lequel sont venues les idées qui se sont transformées en mots et qui se sont transformées en noms de variables qui ont été intégrés au code.

Les débutants arrivent au projet et commencent à utiliser et à utiliser son langage. Ce sont peut-être des utilisateurs, peut-être des développeurs. Si aucun contexte ne leur est fourni, ils créeront leur propre contexte (et donc leur signification) à partir de leur propre expérience de vie.

Ce contexte nouvellement appliqué guidera la manière dont les nouveaux développeurs refacturent ou développent le code. S'ils appliquaient le mauvais contexte, ils refactureraient et développeraient le code, peut-être même légèrement, dans la mauvaise direction. De mauvaises directions, même légères, peuvent causer des problèmes beaucoup plus graves sur toute la ligne.

Selon moi, un "contexte délimité" est simplement un "contexte clarifié" qui est transmis aux débutants du projet afin qu'ils n'appliquent pas leur propre contexte arbitraire pour altérer notre modèle, magnifiquement élaboré.

Il est une reconnaissance explicite, par l'équipe, qui this phrase, au this part of the projectmoyen exactement this thing(et non, comme vous pourriez bien penser, that thing).

C'est une bonne idée de marquer les limites entre votre jardin et celui de votre voisin. Vous spécifiez la limite de manière explicite pour que vous ne soyez pas en colère quand ils commencent à creuser un lit de fleurs sur votre pelouse parfaitement entretenue.

C'est ça. C'est une idée très simple qui est tellement importante que beaucoup a été écrit à ce sujet.

Donc oui. Un contexte délimité est littéralement une frontière, une "clôture", qui distingue le contexte d'un sous-domaine du contexte d'un autre sous-domaine d'un projet.

Le modèle et le langage d'un sous-domaine sont isolés des autres modèles et langages pour éviter les ambiguïtés de sens.

Mais oui. Le monde n'est pas si simple.

L'équipe et vous-même devez être rigoureux dans le respect du contexte défini. Il est vraiment facile d’être paresseux et de ré-imaginer le contexte dans lequel couper les angles lors de la construction du logiciel.

De plus, les objets interagissent avec d'autres objets et les contextes liés doivent interagir les uns avec les autres. Il existe donc divers modèles pour décrire comment ces interactions se produisent. Voir le livre de Eric Evan intitulé Domain Driven Design, chapitre 14, pour ces différents modèles: noyau partagé, fournisseur client, conformiste, couche anticorruption, chemins distincts, service hôte ouvert, langue publiée.

JW01
la source
1
Il s’agit donc d’une clôture autour d’un sous-domaine.
Robert Harvey
1
Oui. Autant que je puisse le voir. C'est une clôture.
JW01
0

Fondamentalement, le contexte borné définit certaines limites d'applicabilité tangibles de certains sous-domaines. C'est un domaine abstrait dans lequel un certain sous-domaine a un sens, contrairement aux autres. Cela peut donc être une conversation, une présentation, un projet de code avec des limites physiques définies par l'artefact.

Dans différentes situations, j'utilise trois perspectives différentes, ou métaphores du concept de contexte limité.

Du point de vue de l'exécution, il représente les limites logiques, définies par contrat d'un service où le modèle est implémenté. Le contrat peut être représenté sous la forme de l'API de ce service ou d'un ensemble d'événements qu'il publie et qu'il consomme. Donc, de ce point de vue, le contexte borné n’a rien à voir avec les limites physiques.

Du point de vue d'un expert de domaine, le contexte délimité est un domaine dans lequel certains processus métier sont mis en œuvre, un langage omniprésent est appliqué et certains termes ont un sens clair, tandis que d'autres ne le sont pas. Donc, ce n’est qu’un rectangle dessiné sur une feuille de papier ou un tableau blanc.

Pour un développeur de logiciel, c'est-à-dire du point de vue du code statique, un contexte délimité représente une façon dont j'ai conçu mes modèles autour de sous-domaines correspondants. Avec combien de bases de code un sous-domaine spécifique est-il implémenté? De quels concepts sont-ils composés? Quels concepts sont applicables dans chacun d'eux? C'est pourquoi on dit que les contextes liés appartiennent à un espace Solution.

J'aime beaucoup cet exemple du concept de contexte borné.

Une autre question importante (sinon la plus importante) est de savoir comment identifier les contextes liés . Si vous ne le faites pas correctement, vous obtiendrez des services bavards, incontrôlables et étroitement couplés , également appelés monolithes distribués .

Zapadlo
la source