Aller au contenu
Filtrer les règles par style d’implémentation
Partie 1 sur 4

Conception stratégique ​

Avant de modéliser, on décide où un modèle s’applique. Toutes les autres parties le supposent : le modèle vit dans un bounded context, l’architecture découpe le code par bounded context, l’intégration relie des frontières déjà claires.

Pourquoi c’est essentiel pour faire évoluer un projet ​

Un projet grandit : de nouveaux besoins, de nouvelles équipes, de nouveaux partenaires. Sans frontières, chaque ajout touche tout le reste.

  • Un changement reste local. Payment revoit l’exécution d’un paiement sans toucher au Ledger, tant que leur contrat tient.
  • Les mots gardent leur sens. « Compte » n’a pas à servir à la fois la relation client et la comptabilité.
  • Les équipes avancent sans s’attendre. Chacune a son bounded context, et sait qui prévenir quand un contrat change.
  • L’effort va où il compte. Le core reçoit le modèle le plus soigné, le supporting et le generic restent simples ou s’achètent.
  • Les choix restent réversibles. Un bounded context bien délimité se remplace, se découpe ou se déploie à part.

Sans conception stratégique, on obtient un big ball of mud : tout dépend de tout, et chaque évolution coûte plus cher que la précédente.

Idées clés ​

Problème et solution ​

Problem spaceSolution space
Qui s’en chargeLe produitLa tech
Son unitéLe subdomain : une part de l’activitéLe bounded context : la frontière d’un modèle et de son langage
Ses variantesCore, supporting, genericTactique, transaction scripts
  • Un subdomain core distingue l’entreprise. Supporting, il lui est propre mais simple. Generic, il est le même partout, et souvent acheté.
  • Dans un bounded context, chaque terme a un seul sens : c’est son ubiquitous language, écrit dans son glossaire et repris dans le code.
  • Idéalement, un bounded context par subdomain, et son style suit le subdomain : tactique pour le core, transaction scripts ailleurs. Voir choisir un style.

Context map ​

Les relations déclarées entre bounded contexts. Dans chacune, l’un est upstream : l’autre dépend de lui et suit ses changements. L’autre est downstream : son pattern dit s’il se plie à ces changements ou s’en protège. Le sens est celui de l’influence, pas celui des données.

PatternCôtéCe qu’il signifie
Open host service (OHS)UpstreamUn seul protocole, pensé pour tous les consumers
Published language (PL)UpstreamUn contrat documenté, distinct du modèle interne
Anticorruption layer (ACL)DownstreamUne traduction qui tient le modèle étranger à l’écart
Conformist (CF)DownstreamLe modèle upstream repris tel quel
Shared kernel (SK)Les deuxUn petit modèle que les deux équipes possèdent

Le détail de chaque pattern : partie intégration.

L’exemple, vu de haut ​

Un établissement de paiement, découpé en cinq bounded contexts. À l’extérieur, le CSM achemine les paiements entre prestataires de services de paiement. Sur chaque relation, U marque le côté upstream, D le côté downstream.

Context map de l’exemple : Customer, Compliance, Ledger et le CSM sont upstream de Payment, Customer de Compliance, Ledger de Safeguarding

Bounded contextSubdomainStyleCe qu’il possède
PaymentCoreTactiqueLes paiements, de l’ordre à leur exécution
LedgerCoreTactiqueLes comptes et les écritures équilibrées
CustomerSupportingTransaction scriptsLes clients et la façon de les joindre
SafeguardingSupportingTransaction scriptsLa protection des fonds des clients
ComplianceCoreTactiqueLe filtrage des clients et des paiements
CSMGenericSystème externeLa compensation et le règlement entre prestataires de services de paiement

Le détail : le même mot avec deux sens dans bounded contexts, chaque relation expliquée dans context maps.

En revue de code ​

  1. Chaque fichier modifié reste-t-il dans son bounded context, sans concept d’un autre subdomain ? (CTX-01, CTX-04)
  2. Chaque terme garde-t-il le sens de son glossaire ? (CTX-02, CTX-03)
  3. Un import, un appel ou un message franchit une frontière ? La context map le déclare (MAP-01), et aucune table n’est partagée (MAP-02).
  4. Les données venues de l’extérieur sont-elles traduites en un concept local ? (CTX-05, CTX-06)
  5. L’effort suit-il le subdomain : tactique pour le core, transaction scripts ailleurs ? (CTX-13, CTX-14)

Ce dont cette partie a besoin

Ces règles jugent le code par rapport à ce que le projet a déclaré : une context map, un glossaire par bounded context, la déclaration des styles et un fichier CODEOWNERS. Sans eux, une règle ne conclut pas à un défaut : elle pose une question. Voir mettre en place un projet.

Thèmes ​