Bounded Contexts sont l'un des concepts les plus fondamentaux et pourtant mal compris du Domain-Driven Design. La plupart des échecs proviennent d'une mauvaise identification ou implémentation des frontières de contexte.
Qu'est-ce qu'un Bounded Context ?
Un Bounded Context est une frontière explicite dans laquelle un modèle de domaine particulier est défini et applicable. À l'intérieur de cette frontière, tous les termes et concepts ont une signification spécifique et unifiée.
Pourquoi c'est crucial ?
Dans une organisation complexe, le même terme peut avoir des significations différentes selon le contexte. Par exemple, le mot "Customer" peut signifier :
Dans le contexte Sales : Une personne ou entreprise qui achète nos produits
Dans le contexte Support : Quelqu'un qui a besoin d'aide avec nos services
Dans le contexte Billing : Une entité avec des obligations financières
Chaque contexte a sa propre définition légitime, et tenter de créer un modèle unifié créerait plus de confusion que de clarté.
Identifier les Bounded Contexts
L'identification des bounded contexts nécessite une approche méthodique. Contrairement à ce que beaucoup pensent, il ne s'agit pas seulement d'une question technique, mais d'une analyse organisationnelle et métier profonde.
Event Storming : Point de départ
L'Event Storming reste ma technique favorite pour découvrir les frontières naturelles. Voici les signaux à surveiller :
Changement de vocabulaire : Quand les participants utilisent des termes différents pour des concepts similaires
Conflits de définition : Quand deux équipes ont des définitions incompatibles du même terme
Responsabilités organisationnelles : Quand différentes équipes "possèdent" différentes parties du processus
Fréquence d'interaction : Les événements qui communiquent rarement entre eux suggèrent une frontière
La Loi de Conway en pratique
"Les organisations qui conçoivent des systèmes sont contraintes de produire des designs qui copient les structures de communication de ces organisations."
Cette loi n'est pas une contrainte à combattre, mais un guide à embrasser. Dans mes projets, j'aligne systématiquement les bounded contexts sur la structure organisationnelle existante.
Implémentation technique
Une fois les frontières identifiées, l'implémentation technique suit des patterns éprouvés. Voici une approche progressive que j'utilise systématiquement.
Structure modulaire
Chaque bounded context devient un module autonome avec sa propre structure :
L'intégration entre contexts suit des patterns spécifiques selon le type de relation :
Shared Kernel : Pour les concepts fondamentaux (Money, Address)
Anti-Corruption Layer : Pour intégrer des systèmes legacy
Published Language : Pour les APIs publiques
Domain Events : Pour la communication asynchrone
Context Mapping
Le Context Map visualise les relations entre bounded contexts. C'est un outil de communication essentiel entre équipes techniques et métier.
Types de relations
Chaque relation entre contexts a ses propres implications architecturales :
Partnership : Développement coordonné, évolution synchronisée
Customer/Supplier : Relation client-fournisseur avec SLA
Conformist : Acceptation des changements du fournisseur
Separate Ways : Aucune intégration, duplication assumée
Erreurs courantes
Après des années d'expérience, j'ai identifié les erreurs les plus fréquentes :
Contexts trop fins : Créer un context par aggregate mène à de la complexité inutile
Partage de base de données : Chaque context doit avoir son propre stockage
Couplage temporel : Les contexts ne doivent pas dépendre de la disponibilité d'autres contexts
Négligence de la governance : Les frontières évoluent, il faut un processus pour les ajuster
Conclusion
Les Bounded Contexts sont la fondation de toute architecture DDD réussie. Leur identification nécessite une compréhension profonde du domaine métier et de l'organisation, pas seulement des compétences techniques.
Commencez petit, itérez souvent, et n'hésitez pas à redécouper quand l'évolution du métier l'exige. Les frontières parfaites n'existent pas, mais les frontières utiles font toute la différence.
Techniques pour découvrir et faire évoluer le langage du domaine avec les parties prenantes. Comment combler le fossé entre concepts métier et implémentation technique à travers des sessions de modélisation collaborative.
Mettre en œuvre les principes de Clean Architecture dans les applications modernes. Comment créer des systèmes maintenables, testables et indépendants avec une gestion appropriée des dépendances.
Appliquer le pattern ports et adapters dans les systèmes distribués. Comment structurer les microservices pour la testabilité, la maintenabilité et la clarté du domaine.