Hexagonale, en oignon, clean : trois noms pour une même idée — isoler le domaine et inverser les dépendances.
Une même idée, deux représentations : le cœur métier au centre, tout le reste branché autour.
Les flèches indiquent le sens des dépendances : tout pointe vers le domaine, jamais l'inverse.
Le domaine définit des interfaces (ports) ; l'infrastructure les implémente. Le métier dépend d'abstractions, jamais du concret.
❌ Avant
// Le domaine dépend directement de la BDD (couplage fort)
class ServiceCommande {
enregistrer(cmd) {
const db = new PostgresClient(); // dépendance concrète
db.insert('orders', cmd); // domaine soudé à Postgres
}
}
✅ Après
// Le domaine définit un PORT (interface) ; l'infra l'implémente
interface DepotCommande { enregistrer(cmd): void; }
class ServiceCommande {
constructor(depot) { this.depot = depot; } // dépend de l'abstraction
traiter(cmd) { this.depot.enregistrer(cmd); }
}
// L'adaptateur Postgres implémente le port, hors du domaine
class DepotPostgres /* implements DepotCommande */ { /* ... */ }
Quelques questions pour ancrer le principe.