Sobes.tech
Senior

Rääkige mulle heksagonaalsest arhitektuurist ja selle päritolust.

sobes.tech AI

Vastus AI-lt

Heksagonaalne arhitektuur (Ports and Adapters) on arhitektuuri mustrid, mille pakkus välja Alistair Coberne. Selle eesmärk on isoleerida äri-loga keskne osa väliste sõltuvuste (UI, andmebaasid, kolmanda osapoole teenused) eest.

Päritolu:

Alistair Coberne tutvustas seda kontseptsiooni 2005. aastal. Põhiteooria tekkis reaktsioonina traditsioonilistele mitmekihilistele arhitektuuridele, kus äri-logic sageli oli tihedalt seotud infrastruktuurikihiga. Coberne püüdis luua arhitektuuri, mis võimaldaks arendada ja testida äri-logic sõltumatult sellest, kuidas see suhtleb välismaailmaga. Nimetus "heksagonaalne" sümboliseerib võimalust rakendusel suhelda erinevat tüüpi väliste "adapteritega" läbi "pordi". Heksagonaal valiti kui abstraktne kuju, millel on piisavalt "nurkadesid" (pordi), et suhelda erinevate süsteemidega.

Põhiprintsiibid:

  • Keskne osa (Core / Domain): Sisaldab puhast äri-logic ja domeeni objekte. See ei sõltu väliste tehnoloogiate kasutamisest.
  • Pordid (Ports): Interfeysid, mis määratlevad suhtluse keskse osa ja välismaailma vahel. On kaks tüüpi pordi:
    • Sissepääsud (Driving Ports): Määratlevad, kuidas välised agendid (nt kasutajaliides või API) saavad kutsuda keskse osa funktsioone.
    • Väljundid (Driven Ports): Määratlevad, kuidas keskne osa saab suhelda väliste teenustega (nt andmebaas või kolmanda osapoole API). Keskne osa määratleb need interfeysid, kuid ei rakenda neid.
  • Adapterid (Adapters): Rakendavad pordi ja toimivad ühenduslüliks keskse osa ja väliste elementide vahel. On ka kaks adapterite tüüpi:
    • Sissepääsud (Driving Adapters): Muudavad väliste agentide päringud arusaadavasse formaati keskse osa jaoks (nt UI adapter).
    • Väljundid (Driven Adapters): Muudavad keskse osa väljakutseid arusaadavasse formaati väliste teenuste jaoks (nt andmebaasi adapter).

Eelised:

  • Isolatsioon: Äri-logic keskne osa ei sõltu väliste tehnoloogiate kasutamisest.
  • Testitavus: Keskne osa saab olla testitud sõltumatult, ilma kogu staki käivitamata.
  • Paindlikkus: Lihtne asendada üks adapter teisega ilma keskse osa muutmiseta (nt üleminek ühest andmebaasist teise).
  • Hooldatavus: Erinevad rakenduse osad (keskne osa ja adapterid) saab arendada ja evolutsioneerida sõltumatult.

Näide frontendis:

Kuigi heksagonaalne arhitektuur on sageli seotud backendiga, saab selle põhimõtteid rakendada ka frontendis, struktuurides kliendi rakendust:

  • Keskne osa: Moodulid, mis sisaldavad äri-logic ja rakenduse olekut (nt Redux reducerid, Zustand pood, komponendid puhta loogikaga, mis ei ole seotud DOM-iga).
  • Pordid: Interfeysid, mis määratlevad, kuidas UI suhtleb logikaga (sissepääsud) ja kuidas loogika suhtleb väliste API-de või lokaalse salvestusruumiga (väljundid).
  • Adapterid: UI komponendid, mis töötlevad kasutaja sisestusi ja kutsuvad pordi (sissepääsud), ning teenused, mis teevad HTTP-päringuid või töötavad brauseri API localStorage'iga (väljundid).

Näide struktuurist (abstraktne):

📦 app
 ┣ 📂 core
 ┃ ┣ 📂 domain
 ┃ ┃ ┗ 📜 todos.ts  // Todo objekti kirjeldus
 ┃ ┣ 📂 application
 ┃ ┃ ┗ 📜 todoService.ts // Äri-logic Todo-ga töötamiseks
 ┃ ┗ 📂 ports
 ┃ ┃ ┣ 📜 in/ITodoUseCase.ts // Sissepääsu pordid (UI liides)
 ┃ ┃ ┗ 📜 out/ITodoRepository.ts // Väljundi pordid (andmetele juurdepääs)
 ┣ 📂 infra
 ┃ ┣ 📂 adapters
 ┃ ┃ ┣ 📂 in/reactUIAdapter.tsx // Sissepääsu adapter (React komponent)
 ┃ ┃ ┗ 📂 out/apiTodoRepository.ts // Väljundi adapter (andmetele juurdepääsu realiseering)