Sobes.tech
Senior

Meséljen a hexagonális architektúráról és eredetéről.

sobes.tech MI

Válasz az MI-től

A hézagarchitektúra (Ports and Adapters) egy olyan architekturális mintázat, amelyet Alistair Coburn javasolt. Célja, hogy elszigetelje az alkalmazás üzleti logikájának magját a külső függőségektől (UI, adatbázisok, harmadik fél szolgáltatásai).

Eredet:

Alistair Coburn 2005-ben mutatta be a koncepciót. Az ötlet főként a hagyományos többrétegű architektúrákra adott reakcióként született, ahol az üzleti logika gyakran szorosan kapcsolódott az infrastruktúra réteghez. Coburn olyan architektúrát kívánt létrehozni, amely lehetővé teszi az üzleti logika fejlesztését és tesztelését függetlenül attól, hogyan lép kölcsönhatásba a külvilággal. A "hézag" név a különböző típusú külső "adapterek"-kel való kapcsolódás lehetőségét szimbolizálja a "portokon" keresztül. A hézag egy olyan absztrakt alakzat, amely elég "sarkot" (portokat) tartalmaz ahhoz, hogy különböző rendszerekkel léphessen kapcsolatba.

Alapelvek:

  • Mag (Core / Domain): Tiszta üzleti logikát és domain objektumokat tartalmaz. Nem függ külső technológiáktól.
  • Portok (Ports): Interfészek, amelyek meghatározzák a kapcsolatot a mag és a külső világ között. Két típusuk van:
    • Bemeneti (Driving Ports): Meghatározzák, hogyan hívhatják meg a külső ügynökök (pl. felhasználói felület vagy API) a mag funkcióit.
    • Kimeneti (Driven Ports): Meghatározzák, hogyan léphet kölcsönhatásba a mag külső szolgáltatásokkal (pl. adatbázis vagy harmadik fél API-ja). A mag határozza meg ezeket az interfészeket, de nem valósítja meg őket.
  • Adapterek (Adapters): Megvalósítják a portokat, és összekötő szerepet töltenek be a mag és a külső elemek között. Két típusuk van:
    • Bemeneti (Driving Adapters): Átalakítják a külső ügynökök kérését olyan formátumba, amit a mag értelmez (pl. UI adapter).
    • Kimeneti (Driven Adapters): Átalakítják a mag hívásait olyan formátumba, amit a külső szolgáltatások értenek (pl. adatbázis adapter).

Előnyök:

  • Elszigetelés: A üzleti logika magja nem függ külső technológiáktól.
  • Tesztelhetőség: A mag függetlenül tesztelhető, anélkül, hogy az egész rendszert futtatni kellene.
  • Rugalmasság: Könnyen cserélhető egy adapter másikra anélkül, hogy a mag változna (pl. egyik adatbázisból a másikba való áttérés).
  • Fenntarthatóság: A különböző alkalmazásrészek (mag és adapterek) fejleszthetők és evolválhatnak függetlenül.

Alkalmazás a Frontend-ben:

Bár a hézagarchitektúra gyakran a backendhez kötött, elveit frontendben is alkalmazhatjuk a kliensoldali szerkezet kialakítására:

  • Mag: Az üzleti logikát és az alkalmazás állapotát tartalmazó modulok (pl. Redux reduktorok, Zustand store, tiszta logikával rendelkező komponensek DOM-hoz kötöttség nélkül).
  • Portok: Interfészek, amelyek meghatározzák, hogyan lép kapcsolatba a UI a logikával (bejövő) és hogyan lép kapcsolatba a logika a külső API-kkal vagy helyi tárolóval (kimenő).
  • Adapterek: UI komponensek, amelyek kezelik a felhasználói bemenetet és hívják a portokat (bejövő adapterek), valamint szolgáltatások, amelyek HTTP-kéréseket hajtanak végre vagy a böngésző API-kat (pl. localStorage) használják (kimenő adapterek).

Struktúra példa (absztrakt):

📦 app
 ┣ 📂 core
 ┃ ┣ 📂 domain
 ┃ ┃ ┗ 📜 todos.ts  // Todo entitás leírása
 ┃ ┣ 📂 application
 ┃ ┃ ┗ 📜 todoService.ts // Biznisz logika a Todo-hoz
 ┃ ┗ 📂 ports
 ┃ ┃ ┣ 📜 in/ITodoUseCase.ts // Bejövő port (UI interfész)
 ┃ ┃ ┗ 📜 out/ITodoRepository.ts // Kimenő port (adat-hozzáférés interfész)
 ┣ 📂 infra
 ┃ ┣ 📂 adapters
 ┃ ┃ ┣ 📂 in/reactUIAdapter.tsx // Bejövő adapter (React komponens)
 ┃ ┃ ┗ 📂 out/apiTodoRepository.ts // Kimenő adapter (API hozzáférés implementációja)