Carte Context Mapping #2 : Anticorruption Layer
📇 Carte #2 : Anticorruption Layer (ACL)
Vue Rapide
🎯 Objectif : L’équipe downstream crée une couche d’isolation pour protéger son modèle
👥 Relation d’équipe : Upstream/Downstream (asymétrique)
📊 Couplage : Bas (isolation complète)
Concept
L’équipe downstream crée une couche de traduction (ACL) qui :
- Traduit le modèle upstream en modèle downstream
- Isole le domaine downstream des changements upstream
- Protège l’indépendance du downstream
Upstream (modèle compliqué/différent)
↓
Anticorruption Layer (translation)
↓
Downstream (modèle propre et indépendant)
Quand l’Utiliser ? ✅
- ✅ Les modèles upstream et downstream sont radicalement différents
- ✅ Vous voulez protéger votre domaine des pollutions upstream
- ✅ L’upstream change fréquemment ou est mal conçu
- ✅ Vous avez besoin d’indépendance maximale
- ✅ L’interface upstream est imposée et immuable
Exemples
- Legacy System Integration : Intégrer un vieux système avec ACL
- Third-party API : Adapter une API externe à votre domaine
- Big Ball Of Mud : Isoler votre domaine du chaos upstream
Quand l’Éviter ? ❌
- ❌ L’interface upstream est simple et stable
- ❌ Vous pouvez vous permettre d’adopter le modèle upstream (Conformist)
- ❌ La complexité de traduction est excessive
- ❌ Vous avez besoin de synchronisation temps-réel très serrée
Questions Clés à se Poser 💭
- Le modèle upstream pollue-t-il notre domaine ?
- Pouvons-nous nous permettre de créer une couche de traduction ?
- La traduction est-elle complexe ou simple ?
- Comment maintenons-nous la synchronisation entre les deux modèles ?
- Où plaçons-nous l’ACL : au niveau de l’équipe ou du service ?
Implications pour l’Équipe Downstream
Responsabilités
- ✓ Concevoir l’ACL : mapper upstream → downstream
- ✓ Maintenir l’ACL : gérer les évolutions upstream
- ✓ Documenter les mappings : pourquoi cette traduction ?
- ✓ Tester l’ACL : validation des conversions
Avantages
- ✓ Indépendance totale : votre domaine est protégé
- ✓ Flexibilité : vous pouvez changer sans affecter l’upstream
- ✓ Clarté : votre code est clair, la traduction est centralisée
- ✓ Évolutivité : remplacer upstream ne casse pas votre logique
Risques
- ⚠️ Complexité : maintenir une couche de traduction
- ⚠️ Performance : la traduction peut avoir un coût
- ⚠️ Synchronisation : gérer les changements upstream
- ⚠️ Duplication : code de mapping qui peut devenir lourd
Patterns de Traduction Courants
1. Mapping Simple
Upstream: Order { items: [], total: 0 }
↓
ACL: convertOrderToOurModel()
↓
Downstream: PurchaseOrder { lineItems: [], grossAmount: 0 }
2. Enrichissement
Upstream: minimal data
↓
ACL: enrichir avec contexte (user, country, etc.)
↓
Downstream: complete domain object
3. Agrégation
Upstream 1: User data
Upstream 2: Address data
↓
ACL: combiner les sources
↓
Downstream: Customer aggregate
4. Transformation
Upstream: Legacy format
↓
ACL: parser, validator, transformer
↓
Downstream: Modern format
Exemple Concret : Integration d’un Legacy System
Contexte Downstream : Nouvelle Commande Service
Votre domaine clair et moderne :