Structure : Adapter, Façade, Decorator
Le code neuf rencontre du code vieux (API bizarre, lib capricieuse, service externe).
Prérequis : cours 1.3 et 2.1.
Pourquoi
Le code neuf rencontre du code vieux (API bizarre, lib capricieuse, service externe). Ces trois patterns sont des interfaces de traduction : ils évitent de contaminer ton domaine avec les bizarreries du dehors.
Concepts
- Adapter : convertit une interface en une autre (
StripeWebhook→PaymentEventmétier). Le domaine ne voit jamais Stripe : changer de prestataire = changer d'adapter. - Façade : simplifie un sous-système complexe derrière UNE entrée claire (
Billing.charge(order)qui orchestre TVA, remise, facture, paiement). Les détails restent dedans. - Decorator : ajoute un comportement en enveloppant (logs, cache, retry autour d'un appel) sans toucher au code d'origine. Empilable :
retry(cache(log(api))).
Exemple : décorer sans toucher
const withRetry = (fn, n = 3) => async (...a) => {
for (let i = 0; i < n; i++) try { return await fn(...a); } catch (e) { if (i === n - 1) throw e; }
};
const robustFetch = withRetry(fetchJson);
Cas réel
Prestataire SMS qui change son API (v1 → v2, champs renommés) : sans adapter, 14 fichiers touchés ; avec, un seul. La migration a pris une heure au lieu d'une semaine — et le prochain changement coûtera pareil.
Pièges
- Adapter qui fuit (types du prestataire dans le domaine) : l'abstraction est percée, le changement coûtera quand même.
- Façade-dieu : 40 méthodes = nouveau fourre-tout. Une façade par usage cohérent.
- Decorators empilés à l'aveugle : l'ordre compte (retry autour du cache ou l'inverse ?) — à penser, pas à empiler.
À retenir
Adapter = traduire le dehors, Façade = simplifier le dedans, Decorator = envelopper sans toucher.
Pas de correction en ligneConfrontez votre code aux résultats attendus du cours.