archi3

Comparatif

Trois réponses à trois questions différentes

Hexagonale, Clean Architecture et DDD sont presque toujours présentés comme des choix concurrents. En réalité, ils répondent à des questions différentes et se combinent naturellement dans la plupart des projets sérieux.

HexagonaleClean ArchitectureDDD
Auteur, annéeAlistair Cockburn, 2005Robert C. Martin, 2012Eric Evans, 2003
Question poséeComment isoler le métier de la technique ?Dans quel sens doivent pointer les dépendances ?Quel modèle mettre dans le métier, et comment le découper ?
Unité centraleLe domaine, au centre de l'hexagoneLes Entités, au centre des cerclesL'agrégat, à l'intérieur d'un bounded context
Vocabulaire de la frontièrePorts (entrants / sortants) et adaptateursAdaptateurs d'interface, règle de dépendanceContext mapping (ACL, Shared Kernel, Conformist...)
Ce que ça garantitLe métier se teste sans framework ni base de donnéesAucune dépendance ne pointe de l'intérieur vers l'extérieurLe code parle le même langage que les experts métier
Point faible si mal appliquéPorts qui recopient un schéma SQL (CRUD déguisé)Sur-découpage en couches sur une app trivialePatterns tactiques sans langage omniprésent ni bounded context

Comment elles s'articulent

Le DDD répond à la question du contenu : qu'est-ce qui doit vivre dans le cœur du système, et comment le découper en modèles cohérents (bounded contexts) ? L'hexagonale et Clean Architecture répondent à la question de la structure : comment protéger ce cœur, une fois défini, de tout ce qui l'entoure ?

Concrètement, les entités et agrégats du DDD occupent exactement la place du noyau hexagonal ou du cercle "Entités" de Clean Architecture. Les repositories que le DDD définit comme faisant partie du domaine sont des ports sortants au sens hexagonal. Rien ne s'oppose entre ces trois approches - elles décrivent le même bâtiment sous trois angles différents.

Par quoi commencer ?

Toujours : le langage omniprésent

Discuter avec les utilisateurs du système et nommer le code exactement comme eux nomment les choses ne coûte rien et évite la majorité des malentendus, quelle que soit la taille du projet.

Presque toujours : ports et adaptateurs

Isoler le métier derrière quelques interfaces simples rend les tests rapides et le changement de technologie moins risqué, même sur une application de taille modeste.

Seulement si le métier est vraiment complexe : agrégats, bounded contexts multiples

Ces patterns ont un coût de conception réel. Ils se justifient face à une complexité métier authentique (règles nombreuses, invariants stricts, équipes multiples) - pas sur un CRUD avec trois écrans.