Porozprávajte o hexagonálnej architektúre a jej pôvode.
sobes.tech AI
Odpoveď od AI
Heksagonálna architektúra (Ports and Adapters) je architektonický vzor navrhnutý Alistairom Coburnom. Jejím cieľom je izolovať jadro podnikovej logiky aplikácie od vonkajších závislostí (UI, databázy, služby tretích strán).
Pôvod:
Alistair Coburn predstavil koncept v roku 2005. Hlavná myšlienka vznikla ako reakcia na tradičné viacvrstvové architektúry, kde bola podniková logika často úzko prepojená s infraštruktúrnou vrstvou. Coburn sa snažil vytvoriť architektúru, ktorá umožní vývoj a testovanie podnikovej logiky nezávisle od spôsobu, akým komunikuje s vonkajším svetom. Názov "heksagonálna" symbolizuje možnosť, že aplikácia môže komunikovať s rôznymi typmi vonkajších "adapterov" cez "porty". Heksagonálna architektúra bola zvolená ako abstraktná forma, ktorá má dostatočný počet "uhlov" (portov) na interakciu s rôznymi systémami.
Hlavné princípy:
- Jadro (Core / Domain): Obsahuje čistú podnikateľskú logiku a objekty domény. Nezávisí od vonkajších technológií.
- Porty (Ports): Rozhrania, ktoré určujú interakciu medzi jadrom a vonkajším svetom. Existujú dva typy portov:
- Vstupné (Driving Ports): Určujú, ako môžu vonkajší agenti (napríklad používateľské rozhranie alebo API) volať funkcie jadra.
- Výstupné (Driven Ports): Určujú, ako môže jadro komunikovať s vonkajšími službami (napríklad databáza alebo tretí API). Jadro definuje tieto rozhrania, ale ich neimplementuje.
- Adaptery (Adapters): Implementujú porty a slúžia ako spojovací článok medzi jadrom a vonkajšími prvkami. Existujú tiež dva typy adaptérov:
- Vstupné (Driving Adapters): Prevod požiadaviek od vonkajších agentov do formátu, ktorému rozumie jadro (napríklad UI adaptér).
- Výstupné (Driven Adapters): Prevod volaní z jadra do formátu, ktorému rozumejú vonkajšie služby (napríklad databázový adaptér).
Výhody:
- Izolácia: Jadro podnikovej logiky nie je závislé od vonkajších technológií.
- Testovateľnosť: Jadro môže byť testované nezávisle, bez potreby spúšťania celého stacku.
- Flexibilita: Jednoducho je možné nahradiť jeden adaptér iným bez zmeny jadra (napríklad prechod z jednej databázy na inú).
- Udržateľnosť: Rôzne časti aplikácie (jadro a adaptéry) môžu byť vyvíjané a evolvované nezávisle.
Použitie vo Frontende:
Heksagonálna architektúra, hoci je často spájaná s backendom, jej princípy je možné aplikovať aj vo frontende na štruktúrovanie klientskej aplikácie:
- Jadro: Moduly obsahujúce podnikateľskú logiku a stav aplikácie (napríklad Redux reduktory, Zustand store, komponenty s čistou logikou bez väzby na DOM).
- Porty: Rozhrania, ktoré určujú, ako UI komunikuje s logikou (vstupné), a ako logika komunikuje s vonkajšími API alebo lokálnym úložiskom (výstupné).
- Adaptery: UI komponenty, ktoré spracovávajú používateľský vstup a volajú porty (vstupné adaptéry), a služby, ktoré vykonávajú HTTP požiadavky alebo pracujú s browser API (napríklad localStorage) (výstupné adaptéry).
Príklad štruktúry (abstraktné):
📦 app
┣ 📂 core
┃ ┣ 📂 domain
┃ ┃ ┗ 📜 todos.ts // Popis entity Todo
┃ ┣ 📂 application
┃ ┃ ┗ 📜 todoService.ts // Biznis logika práce s Todo
┃ ┗ 📂 ports
┃ ┃ ┣ 📜 in/ITodoUseCase.ts // Vstupný port (rozhranie pre UI)
┃ ┃ ┗ 📜 out/ITodoRepository.ts // Výstupný port (rozhranie pre prístup k dátam)
┣ 📂 infra
┃ ┣ 📂 adapters
┃ ┃ ┣ 📂 in/reactUIAdapter.tsx // Vstupný adaptér (React komponenta)
┃ ┃ ┗ 📂 out/apiTodoRepository.ts // Výstupný adaptér (implementácia prístupu k API)