Sobes.tech
Senior

Erzählen Sie mir von der hexagonalen Architektur und ihrer Herkunft.

sobes.tech KI

Antwort von AI

Die hexagonale Architektur (Ports and Adapters) ist ein architektonisches Muster, das von Alistair Cockburn vorgeschlagen wurde. Sie soll das Kernstück der Geschäftslogik der Anwendung von externen Abhängigkeiten (UI, Datenbanken, Drittanbieterdienste) isolieren.

Herkunft:

Alistair Cockburn stellte das Konzept im Jahr 2005 vor. Die Hauptidee entstand als Reaktion auf traditionelle mehrschichtige Architekturen, bei denen die Geschäftslogik oft stark mit der Infrastruktur-Schicht verbunden war. Cockburn wollte eine Architektur schaffen, die es ermöglicht, die Geschäftslogik zu entwickeln und zu testen, unabhängig davon, wie sie mit der Außenwelt interagiert. Der Begriff "hexagonal" symbolisiert die Möglichkeit, mit verschiedenen Arten von externen "Adaptern" über "Ports" zu interagieren. Ein Hexagon wurde als abstrakte Figur gewählt, die genügend "Facetten" (Ports) hat, um mit verschiedenen Systemen zu interagieren.

Grundprinzipien:

  • Kern (Core / Domain): Enthält die reine Geschäftslogik und Domänenobjekte. Es ist unabhängig von externen Technologien.
  • Ports: Schnittstellen, die die Interaktion zwischen dem Kern und der Außenwelt definieren. Es gibt zwei Arten von Ports:
    • Eingehende (Driving Ports): Bestimmen, wie externe Agenten (z.B. Benutzeroberfläche oder API) Funktionen des Kerns aufrufen können.
    • Ausgehende (Driven Ports): Bestimmen, wie der Kern mit externen Diensten (z.B. Datenbank oder Drittanbieter-API) interagieren kann. Der Kern definiert diese Schnittstellen, implementiert sie aber nicht.
  • Adapter (Adapters): Implementieren die Ports und dienen als Verbindung zwischen dem Kern und externen Elementen. Es gibt auch zwei Arten von Adaptern:
    • Eingehende (Driving Adapters): Wandeln Anfragen externer Agenten in ein vom Kern verständliches Format um (z.B. UI-Adapter).
    • Ausgehende (Driven Adapters): Wandeln Aufrufe aus dem Kern in ein Format um, das externe Dienste verstehen (z.B. Datenbank-Adapter).

Vorteile:

  • Isolation: Der Kern der Geschäftslogik ist nicht von externen Technologien abhängig.
  • Testbarkeit: Der Kern kann unabhängig getestet werden, ohne die gesamte Schicht auszuführen.
  • Flexibilität: Es ist einfach, einen Adapter durch einen anderen zu ersetzen, ohne den Kern zu verändern (z.B. Wechsel der Datenbank).
  • Wartbarkeit: Verschiedene Teile der Anwendung (Kern und Adapter) können unabhängig entwickelt und weiterentwickelt werden.

Anwendung im Frontend:

Obwohl die hexagonale Architektur eher mit dem Backend assoziiert wird, können ihre Prinzipien auch im Frontend angewendet werden, um die Client-Anwendung zu strukturieren:

  • Kern: Module, die die Geschäftslogik und den Zustand der Anwendung enthalten (z.B. Redux-Reducer, Zustand Store, Komponenten mit reiner Logik ohne DOM-Bezug).
  • Ports: Schnittstellen, die definieren, wie die UI mit der Logik interagiert (eingehend), und wie die Logik mit externen APIs oder lokalem Speicher interagiert (ausgehend).
  • Adapter: UI-Komponenten, die die Benutzereingabe verarbeiten und die Ports aufrufen (eingehende Adapter), sowie Dienste, die HTTP-Anfragen durchführen oder mit der Browser-API wie localStorage arbeiten (ausgehende Adapter).

Beispielstruktur (abstrakt):

📦 app
 ┣ 📂 core
 ┃ ┣ 📂 domain
 ┃ ┃ ┗ 📜 todos.ts  // Beschreibung der Todo-Entität
 ┃ ┣ 📂 application
 ┃ ┃ ┗ 📜 todoService.ts // Geschäftslogik für Todo
 ┃ ┗ 📂 ports
 ┃ ┃ ┣ 📜 in/ITodoUseCase.ts // Eingehender Port (Schnittstelle für UI)
 ┃ ┃ ┗ 📜 out/ITodoRepository.ts // Ausgehender Port (Schnittstelle für Datenzugriff)
 ┣ 📂 infra
 ┃ ┣ 📂 adapters
 ┃ ┃ ┣ 📂 in/reactUIAdapter.tsx // Eingehender Adapter (React-Komponente)
 ┃ ┃ ┗ 📂 out/apiTodoRepository.ts // Ausgehender Adapter (Implementierung des API-Zugriffs)