Créer une architecture backend propre : SOLID, Clean Architecture et Hexagonal

Pourquoi l'architecture backend est un enjeu stratégique

Schéma des principes SOLID appliqués à l'architecture backend
Source : blog.liink.ovh

Un projet qui commence sans structure solide se heurte rapidement à des problèmes de maintenabilité. Les premières semaines de développement se passent bien, puis chaque nouvelle fonctionnalité devient plus longue à implémenter. Les bugs se multiplient, les tests deviennent fragiles, et le code se rigidifie au point de freiner toute évolution. Ce scénario concerne aussi bien les startups que les grandes entreprises, et il trouve sa source dans une absence d'architecture cohérente.

Une architecture backend bien conçue n'est pas un luxe réservé aux équipes expérimentées. C'est un investissement qui réduit le coût des modifications futures, facilite l'intégration des nouveaux développeurs et permet de changer de technologie sans tout réécrire. Cet article détaille les principes fondamentaux — SOLID, Clean Architecture, Hexagonal — et montre comment les appliquer concrètement.

Les principes SOLID : socle de toute architecture maintenable

Les cinq principes SOLID, formalisés par Robert C. Martin, constituent le fondement des architectures logicielles modernes. Leur application systématique transforme la manière dont le code est structuré et évolue dans le temps.

Le principe de responsabilité unique (Single Responsibility) impose qu'une classe ou un module n'ait qu'une seule raison de changer. Concrètement, un contrôleur ne devrait pas contenir de logique métier, et un repository ne devrait pas gérer la validation des données. Ce principe, apparemment simple, est celui qui a le plus d'impact sur la maintenabilité d'un projet.

Le principe ouvert/fermé (Open/Closed) stipule que les entités doivent être ouvertes à l'extension mais fermées à la modification. En pratique, cela signifie que l'ajout d'une nouvelle fonctionnalité ne devrait pas nécessiter de modifier le code existant, mais plutôt d'étendre le comportement via des interfaces ou des classes dérivées. Les systèmes de plugins et l'injection de dépendances sont des manifestations courantes de ce principe.

Le principe de substitution de Liskov garantit que les sous-classes doivent pouvoir remplacer leur classe parent sans altérer le comportement attendu. Une violation typique consiste à créer une classe Square qui hérite de Rectangle en redéfinissant les setters de largeur et hauteur — un cas classique qui brise ce principe.

Enfin, les principes de ségrégation des interfaces (Interface Segregation) et d'inversion des dépendances (Dependency Inversion) complètent l'ensemble en encourageant des interfaces fines et spécialisées, ainsi qu'une dépendance vers les abstractions plutôt que vers les implémentations concrètes.

Clean Architecture : séparer les préoccupations

Représentation de l'architecture hexagonale avec ports et adaptateurs
Source : blog.liink.ovh

La Clean Architecture, également popularisée par Robert C. Martin, organise le code en cercles concentriques. Chaque cercle représente un niveau d'abstraction différent, et la règle fondamentale est que les dépendances pointent toujours vers l'intérieur : les couches internes (domaine métier) ne doivent rien savoir des couches externes (base de données, frameworks, interfaces utilisateur).

Concrètement, cette architecture se traduit par une organisation en trois couches principales :

  • Domaine (entités et règles métier) : le cœur de l'application, indépendant de toute infrastructure. Les entités, value objects et services du domaine vivent ici.
  • Application (cas d'utilisation) : les orchestrateurs qui coordonnent les interactions entre le domaine et le monde extérieur. Un cas d'utilisation définit une action métier spécifique sans connaître les détails techniques de son exécution.
  • Infrastructure (frameworks, base de données, API) : l'implémentation concrète des interfaces définies par les couches internes. C'est ici que vivent les repositories SQL, les clients HTTP, les contrôleurs.

Cette séparation permet de tester le domaine sans infrastructure, de remplacer une base de données sans impacter la logique métier, et de maintenir une cohérence forte sur la durée du projet.

Architecture hexagonale : ports et adaptateurs

L'architecture hexagonale (Alistair Cockburn, 2005) pousse la logique de séparation encore plus loin en introduisant la notion de ports (interfaces définies par le domaine) et d'adaptateurs (implémentations concrètes de ces interfaces).

Le principe est simple : le domaine définit ce dont il a besoin via des interfaces (les ports), et les adaptateurs fournissent les implémentations pour chaque technologie spécifique. Un port de repository peut avoir des adaptateurs PostgreSQL, MongoDB ou Redis, interchangeables sans modification du domaine.

Cette approche présente deux avantages majeurs. D'une part, elle rend le domaine totalement indépendant des choix technologiques, ce qui facilite les migrations et les tests unitaires. D'autre part, elle impose une discipline architecturale qui empêche les dépendances parasites entre le code métier et l'infrastructure.

Comparaison des approches et cas pratiques

Comparaison entre architecture en couches et Clean Architecture
Source : blog.liink.ovh

Le choix entre une architecture en couches classique (layered), une Clean Architecture ou une architecture hexagonale dépend du contexte du projet. Les critères à prendre en compte incluent la taille de l'équipe, la complexité du domaine métier, la fréquence des changements technologiques anticipés et la durée de vie prévue du projet.

Pour un projet de taille modeste avec une équipe réduite ou un prototype, l'architecture en couches reste un choix pragmatique. La Clean Architecture et l'approche hexagonale deviennent pertinentes lorsque le projet atteint une certaine complexité — typiquement au-delà de dix cas d'utilisation distincts ou lorsque plusieurs sources de données sont impliquées.

Un cas concret : une application de gestion de réservation pour une plateforme de services. L'architecture hexagonale permet de traiter les réservations via une API REST, une interface d'administration et des jobs batch sans dupliquer la logique métier. Chaque point d'entrée devient un adaptateur supplémentaire connecté au même port, ce qui réduit considérablement la duplication de code.

L'adoption d'une architecture propre est un investissement qui porte ses fruits sur la durée. Elle offre une flexibilité qui permet d'adapter le projet aux évolutions technologiques et aux changements de périmètre sans reconstruire l'intégralité du socle. Les équipes qui l'adoptent constatent une réduction significative du temps d'intégration des nouveaux développeurs et une meilleure isolation des bugs dans les couches spécifiques plutôt que dans le cœur métier.

Link_