Sobes.tech
Senior

Vorbiți despre arhitectura hexagonală și despre originea sa.

sobes.tech AI

Răspuns de la AI

Arhitectura hexagonală (Ports and Adapters) este un model arhitectural propus de Alistair Cockburn. Are ca scop izolarea nucleului logicii de business a aplicației de dependențele externe (UI, baze de date, servicii terțe).

Origine:

Alistair Cockburn a prezentat conceptul în 2005. Ideea principală a apărut ca o reacție la arhitecturile tradiționale în straturi, unde logica de business era adesea strâns legată de stratul de infrastructură. Cockburn a dorit să creeze o arhitectură care să permită dezvoltarea și testarea logicii de business independent de modul în care aceasta interacționează cu lumea exterioară. Numele "hexagonal" simbolizează capacitatea aplicației de a interacționa cu diferite tipuri de "adaptori" externi prin intermediul "porturilor". S-a ales un hexagon ca figură abstractă, având suficiente "fețe" (porturi) pentru a interacționa cu diferite sisteme.

Principii de bază:

  • Nucleul (Core / Domeniu): Conține logica de business pură și obiectele de domeniu. Nu depinde de tehnologiile externe.
  • Porturi (Ports): Interfețe care definesc interacțiunea dintre nucleu și lumea exterioară. Există două tipuri de porturi:
    • Intrare (Driving Ports): Define modul în care agenții externi (de exemplu, interfața utilizator sau API) pot apela funcțiile nucleului.
    • Ieșire (Driven Ports): Define modul în care nucleul poate interacționa cu serviciile externe (de exemplu, baza de date sau API-ul terț). Nucleul definește aceste interfețe, dar nu le implementează.
  • Adaptori (Adapters): Implementează porturile și servesc ca legătură între nucleu și elementele externe. Există, de asemenea, două tipuri de adaptori:
    • Adaptori de intrare (Driving Adapters): Transformă cererile de la agenții externi într-un format înțeles de nucleu (de exemplu, adaptor UI).
    • Adaptori de ieșire (Driven Adapters): Transformă apelurile din nucleu într-un format înțeles de serviciile externe (de exemplu, adaptor bază de date).

Avantaje:

  • Izolare: Nucleul logicii de business nu depinde de tehnologiile externe.
  • Testabilitate: Nucleul poate fi testat independent, fără a fi nevoie să ruleze întregul stack.
  • Flexibilitate: Este ușor să înlocuiești un adaptor cu altul fără a modifica nucleul (de exemplu, trecerea de la o bază de date la alta).
  • Mentenabilitate: Diferitele părți ale aplicației (nucleul și adaptoarele) pot fi dezvoltate și evoluate independent.

Aplicare în frontend:

Deși arhitectura hexagonală este mai frecvent asociată cu backend-ul, principiile sale pot fi aplicate și în frontend pentru structurarea aplicației client:

  • Nucleul: Module care conțin logica de business și starea aplicației (de exemplu, reductori Redux, magazin Zustand, componente cu logică pură fără legătură cu DOM-ul).
  • Porturi: Interfețe care definesc modul în care UI interacționează cu logica (intrare) și modul în care logica interacționează cu API-urile externe sau stocarea locală (ieșire).
  • Adaptori: Componente UI care gestionează inputul utilizatorului și apelează porturile (adaptori de intrare), precum și servicii care efectuează solicitări HTTP sau lucrează cu API-ul browser-ului, cum ar fi localStorage (adaptori de ieșire).

Exemplu de structură (abstract):

📦 app
 ┣ 📂 core
 ┃ ┣ 📂 domeniu
 ┃ ┃ ┗ 📜 todos.ts  // Descrierea entității Todo
 ┃ ┣ 📂 aplicație
 ┃ ┃ ┗ 📜 todoService.ts // Logica de business pentru Todo
 ┃ ┗ 📂 porturi
 ┃ ┃ ┣ 📜 in/ITodoUseCase.ts // Port de intrare (interfață pentru UI)
 ┃ ┃ ┗ 📜 out/ITodoRepository.ts // Port de ieșire (interfață pentru accesul la date)
 ┣ 📂 infra
 ┃ ┣ 📂 adaptoare
 ┃ ┃ ┣ 📂 in/reactUIAdapter.tsx // Adaptator de intrare (componentă React)
 ┃ ┃ ┗ 📂 out/apiTodoRepository.ts // Adaptator de ieșire (implementare acces API)