Senior
Que savez-vous de l'architecture des ports et des adaptateurs?
sobes.tech IA
Réponse de l'IA
L'architecture des ports et adaptateurs, également connue sous le nom d'architecture hexagonale (Hexagonal Architecture), sépare la logique métier de l'application (Core) des dépendances externes (interfaces utilisateur, bases de données, services externes).
Concepts principaux :
- Ports : Définissent les interfaces par lesquelles le Core interagit avec le monde extérieur. Les ports sont de deux types :
- Entrants (Driving Ports) : Utilisés par des entités externes pour invoquer la fonctionnalité du Core (par exemple, interface API).
- Sortants (Driven Ports) : Utilisés par le Core pour invoquer des fonctionnalités d'entités externes (par exemple, interface de dépôt pour accéder aux données).
- Adaptateurs : Implémentent les ports, connectant le Core à des technologies ou frameworks externes spécifiques.
- Entrants (Driving Adapters) : Implémentent les ports entrants et transforment les requêtes externes en appels au Core (par exemple, contrôleur REST).
- Sortants (Driven Adapters) : Implémentent les ports sortants et transforment les appels du Core pour interagir avec l'environnement externe (par exemple, implémentation de dépôt pour travailler avec une base de données spécifique).
- Core (Domaine) : Contient la logique métier de l'application. Il est complètement isolé des détails externes et n'interagit avec eux qu'à travers les ports.
Avantages :
- Testabilité : L'isolation du Core facilite les tests unitaires de la logique métier sans avoir besoin de simuler des dépendances externes complexes.
- Flexibilité : Permet de remplacer ou d'ajouter facilement de nouvelles technologies externes (bases de données, frameworks) sans modifier le Core. Il suffit d'écrire un nouvel adaptateur pour un port existant.
- Code propre : Favorise la création d'un code plus propre et maintenable, en se concentrant uniquement sur les règles métier.
- Séparation des responsabilités : Divise clairement les zones de responsabilité.
Relation avec le Frontend :
Dans le frontend, l'architecture des ports et adaptateurs s'applique pour :
- Séparer la logique métier du composant des sources de données : Le composant interagit avec un "port" (interface), qui peut être implémenté par différents "adaptateurs" (qui récupèrent des données via API, stockage local, mocks, etc.).
- Gestion des événements externes : Les ports entrants peuvent représenter des gestionnaires d'événements UI, et les adaptateurs transforment ces événements en appels à la logique interne.
- Encapsulation de l'interaction avec des bibliothèques externes : Les adaptateurs peuvent envelopper les appels à des bibliothèques tierces (par exemple, bibliothèque pour travailler avec des cartes), fournissant au Core une interface simple et stable.
Exemple en JavaScript (schéma) :
// Exemple de port sortant (interface pour obtenir des données)
class DataGateway {
getData() {
throw new Error("La méthode getData doit être implémentée");
}
}
// Exemple d'adaptateur sortant (implémentation du port pour API)
class ApiDataGateway extends DataGateway {
async getData() {
const response = await fetch('/api/data');
return response.json();
}
}
// Exemple de port entrant (interface pour la logique métier)
class BusinessLogicPort {
constructor(dataGateway) {
this.dataGateway = dataGateway;
}
async processData() {
throw new Error("La méthode processData doit être implémentée");
}
}
// Exemple de Core (logique métier)
class MyBusinessLogic extends BusinessLogicPort {
async processData() {
const data = await this.dataGateway.getData();
// Logique de traitement des données
console.log("Données traitées :", data);
return data;
}
}
// Exemple d'adaptateur entrant (utilisation dans l'UI)
async function initApp() {
const apiGateway = new ApiDataGateway(); // Adaptateur concret
const businessLogic = new MyBusinessLogic(apiGateway); // Core utilise le port
await businessLogic.processData(); // L'adaptateur entrant appelle le Core
}
initApp();