Sobes.tech
Senior

Papaskokite apie šešiakampę architektūrą ir jos kilmę.

sobes.tech AI

Atsakymas iš AI

Heksagoninė architektūra (Ports and Adapters) yra architektūros šablonas, pasiūlytas Alistero Coberno. Ji siekia izoliuoti verslo logikos branduolį nuo išorinių priklausomybių (UI, duomenų bazės, trečiųjų šalių paslaugos).

Kilmė:

Alisteras Cobernas pristatė šią koncepciją 2005 metais. Pagrindinė idėja kilo kaip reakcija į tradicines daugiasluoksnes architektūras, kuriose verslo logika dažnai buvo glaudžiai susijusi su infrastruktūros sluoksniu. Cobernas siekė sukurti architektūrą, leidžiančią kurti ir testuoti verslo logiką nepriklausomai nuo to, kaip ji sąveikauja su išoriniu pasauliu. Pavadinimas "heksagoninė" simbolizuoja galimybę programai sąveikauti su įvairiais išoriniais "adapteriais" per "povius". Heksagonas pasirinktas kaip abstrakti figūra, turinti pakankamai "kampų" (povų) sąveikai su skirtingomis sistemomis.

Pagrindiniai principai:

  • Šerdis (Core / Domain): Laikoma švari verslo logika ir domeno objektai. Ji nepriklauso nuo išorinių technologijų.
  • Poviai (Ports): Sąsajos, apibrėžiančios sąveiką tarp šerdies ir išorinio pasaulio. Yra du povių tipai:
    • Įėjimo (Driving Ports): Apibrėžia, kaip išoriniai agentai (pvz., vartotojo sąsaja ar API) gali iškviesti šerdies funkcijas.
    • Išeities (Driven Ports): Apibrėžia, kaip šerdis gali sąveikauti su išorinėmis paslaugomis (pvz., duomenų baze ar trečiosios šalies API). Šerdis apibrėžia šias sąsajas, bet jų neįgyvendina.
  • Adapteriai (Adapters): Įgyvendina povius ir tarnauja kaip jungtis tarp šerdies ir išorinių elementų. Taip pat yra du adapterių tipai:
    • Įėjimo (Driving Adapters): Konvertuoja užklausas iš išorinių agentų į formatą, suprantamą šerdžiai (pvz., UI adapteris).
    • Išeities (Driven Adapters): Konvertuoja šerdies iškvietimus į formatą, suprantamą išorinėms paslaugoms (pvz., duomenų bazės adapteris).

Privalumai:

  • Izoliacija: Verslo logikos šerdis nepriklauso nuo išorinių technologijų.
  • Testavimas: Šerdis gali būti testuojama nepriklausomai, nereikalaujant paleisti viso stogo.
  • Lankstumas: Lengva pakeisti vieną adapterį kitu be šerdies keitimo (pvz., pereiti nuo vienos duomenų bazės prie kitos).
  • Priežiūra: Skirtingos programos dalys (šerdis ir adapteriai) gali būti kuriamos ir evoliucionuojamos nepriklausomai.

Naudojimas frontend'e:

Nors heksagoninė architektūra dažniausiai siejama su backend'u, jos principai gali būti taikomi ir frontend'e struktūrizuojant kliento programą:

  • Šerdis: Modulia, kuriuose yra verslo logika ir programos būsena (pvz., Redux reduceriai, Zustand saugykla, komponentai su švarią logiką be DOM priklausomybės).
  • Poviai: Sąsajos, apibrėžiančios, kaip UI sąveikauja su logika (įėjimo) ir kaip logika sąveikauja su išoriniais API ar vietiniu saugykla (išeities).
  • Adapteriai: UI komponentai, kurie tvarko naudotojo įvestį ir iškviečia povius (įėjimo adapteriai), ir paslaugos, kurios atlieka HTTP užklausas ar dirba su naršyklės API localStorage (išeities adapteriai).

Pavyzdinė struktūra (abstrakti):

📦 app
 ┣ 📂 core
 ┃ ┣ 📂 domain
 ┃ ┃ ┗ 📜 todos.ts  // Todo objekto aprašymas
 ┃ ┣ 📂 application
 ┃ ┃ ┗ 📜 todoService.ts // Verslo logika, dirbanti su Todo
 ┃ ┗ 📂 ports
 ┃ ┃ ┣ 📜 in/ITodoUseCase.ts // Įėjimo porthas (UI sąsaja)
 ┃ ┃ ┗ 📜 out/ITodoRepository.ts // Išeities porthas (prieigos prie duomenų)
 ┣ 📂 infra
 ┃ ┣ 📂 adapters
 ┃ ┃ ┣ 📂 in/reactUIAdapter.tsx // Įėjimo adapteris (React komponentas)
 ┃ ┃ ┗ 📂 out/apiTodoRepository.ts // Išeities adapteris (duomenų prieigos realizacija)