Sobes.tech
Senior

Vertel over de hexagonale architectuur en de oorsprong ervan.

sobes.tech AI

Antwoord van AI

De hexagonale architectuur (Ports en Adapters) is een architecturaal patroon voorgesteld door Alistair Cockburn. Het is bedoeld om de kern van de bedrijfslogica van de toepassing te isoleren van externe afhankelijkheden (UI, databases, derden services).

Oorsprong:

Alistair Cockburn presenteerde het concept in 2005. Het hoofddoel is ontstaan als reactie op traditionele gelaagde architecturen, waarbij de bedrijfslogica vaak sterk gekoppeld was aan de infrastructuurlaag. Cockburn wilde een architectuur creëren die het mogelijk maakt om de bedrijfslogica te ontwikkelen en te testen onafhankelijk van hoe deze met de buitenwereld interageert. De naam "hexagonaal" symboliseert de mogelijkheid voor de toepassing om met verschillende soorten "adapters" extern te communiceren via "poorten". Een hexagoon werd gekozen als abstracte figuur met voldoende "zijden" (poorten) om met verschillende systemen te communiceren.

Basisprincipes:

  • Kern (Core / Domein): Bevat de zuivere bedrijfslogica en domeobjecten. Het is onafhankelijk van externe technologieën.
  • Poorten (Ports): Interfaces die de interactie tussen de kern en de buitenwereld definiëren. Er zijn twee typen poorten:
    • Inkomende (Driving Ports): Definiëren hoe externe actoren (bijvoorbeeld gebruikersinterface of API) functies van de kern kunnen aanroepen.
    • Uitgaande (Driven Ports): Definiëren hoe de kern kan communiceren met externe services (bijvoorbeeld database of derde partij API). De kern definieert deze interfaces, maar implementeert ze niet.
  • Adapters: Implementeren de poorten en dienen als schakel tussen de kern en externe elementen. Er zijn ook twee typen adapters:
    • Inkomende (Driving Adapters): Transformeren verzoeken van externe actoren naar een formaat dat door de kern begrepen wordt (bijvoorbeeld UI-adapter).
    • Uitgaande (Driven Adapters): Transformeren calls vanuit de kern naar een formaat dat door externe services begrepen wordt (bijvoorbeeld database-adapter).

Voordelen:

  • Isolatie: De kern van de bedrijfslogica is niet afhankelijk van externe technologieën.
  • Testbaarheid: De kern kan onafhankelijk getest worden, zonder dat de hele stack gestart hoeft te worden.
  • Flexibiliteit: Het is eenvoudig om een adapter te vervangen door een andere zonder de kern te wijzigen (bijvoorbeeld overstappen van de ene database naar de andere).
  • Onderhoudbaarheid: Verschillende delen van de toepassing (kern en adapters) kunnen onafhankelijk ontwikkeld en geëvolueerd worden.

Toepassing in Frontend:

Hoewel de hexagonale architectuur meer geassocieerd wordt met de backend, kunnen de principes ook in de frontend toegepast worden om de clientapplicatie te structureren:

  • Kern: Modules die de bedrijfslogica en de toestand van de toepassing bevatten (bijvoorbeeld Redux-reducers, Zustand store, componenten met zuivere logica zonder binding aan DOM).
  • Poorten: Interfaces die definiëren hoe de UI met de logica interageert (inkomend), en hoe de logica met externe API's of lokale opslag communiceert (uitgaand).
  • Adapters: UI-componenten die gebruikersinvoer verwerken en de poorten aanroepen (inkomende adapters), en services die HTTP-verzoeken uitvoeren of werken met de browser API zoals localStorage (uitgaande adapters).

Voorbeeldstructuur (abstract):

📦 app
 ┣ 📂 core
 ┃ ┣ 📂 domein
 ┃ ┃ ┗ 📜 todos.ts  // Beschrijving van de Todo-entiteit
 ┃ ┣ 📂 toepassing
 ┃ ┃ ┗ 📜 todoService.ts // Bedrijfslogica voor Todo
 ┃ ┗ 📂 poorten
 ┃ ┃ ┣ 📜 in/ITodoUseCase.ts // Inkomende poort (interface voor UI)
 ┃ ┃ ┗ 📜 out/ITodoRepository.ts // Uitgaande poort (interface voor gegevensaccess)
 ┣ 📂 infra
 ┃ ┣ 📂 adapters
 ┃ ┃ ┣ 📂 in/reactUIAdapter.tsx // Inkomende adapter (React component)
 ┃ ┃ ┗ 📂 out/apiTodoRepository.ts // Uitgaande adapter (implementatie van API toegang)