Sobes.tech
Senior

Разкажете за шестоъгълната архитектура и за произхода й.

sobes.tech AI

Отговор от AI

Гексагоналната архитектура (Ports and Adapters) е архитектурен шаблон, предложен от Алистър Кобърн. Тя има за цел да изолира ядрото на бизнес логиката на приложението от външните зависимости (UI, бази данни, трети страни услуги).

Произход:

Алистър Кобърн представи концепцията през 2005 година. Основната идея възникна като реакция на традиционните многослойни архитектури, където бизнес логиката често беше силно свързана с инфраструктурния слой. Кобърн се стремеше да създаде архитектура, която позволява разработването и тестването на бизнес логиката независимо от начина, по който тя взаимодейства с външния свят. Името "гексагонална" символизира възможността приложението да взаимодейства с различни типове външни "адаптери" чрез "порти". Гексагоналната архитектура е избрана като абстрактна фигура, която разполага с достатъчно "ъгли" (порти) за взаимодействие с различни системи.

Основни принципи:

  • Ядро (Core / Domain): Съдържа чиста бизнес логика и обекти на домейна. Не зависи от външни технологии.
  • Порти (Ports): Интерфейси, които определят взаимодействието между ядрото и външния свят. Има два типа порти:
    • Входни (Driving Ports): Определят как външните агенти (например, потребителски интерфейс или API) могат да извикват функции на ядрото.
    • Изходящи (Driven Ports): Определят как ядрото може да взаимодейства с външни услуги (например, база данни или трети API). Ядрото определя тези интерфейси, но не ги реализира.
  • Адаптери (Adapters): Реализират портовете и служат като свързващо звено между ядрото и външните елементи. Има също два типа адаптери:
    • Входни (Driving Adapters): Преобразуват заявките от външните агенти към формат, разбираем от ядрото (например, UI адаптер).
    • Изходящи (Driven Adapters): Преобразуват извикванията от ядрото към формат, разбираем за външните услуги (например, база данни адаптер).

Предимства:

  • Изолация: Ядрото на бизнес логиката не зависи от външни технологии.
  • Тестване: Ядрото може да бъде тествано независимо, без да е необходимо да се стартира цялата стека.
  • Гъвкавост: Лесно може да се замени един адаптер с друг без промяна на ядрото (например, преминаване от една база данни към друга).
  • Поддръжка: Различните части на приложението (ядрото и адаптерите) могат да се развиват и еволюират независимо.

Приложение във Frontend:

Въпреки че гексагоналната архитектура често се свързва с бекенда, нейните принципи могат да се прилагат и във фронтенда за структуриране на клиентското приложение:

  • Ядро: Модули, съдържащи бизнес логика и състояние на приложението (например, Redux редуктори, Zustand store, компоненти с чиста логика без връзка с DOM).
  • Порти: Интерфейси, които определят как UI взаимодейства с логиката (входящи), и как логиката взаимодейства с външни API или локално хранилище (изходящи).
  • Адаптери: UI компоненти, които обработват потребителския вход и извикват порти (входящи адаптери), и услуги, които изпълняват HTTP заявки или работят с браузърния API localStorage (изходящи адаптери).

Примерна структура (абстрактна):

📦 app
 ┣ 📂 core
 ┃ ┣ 📂 domain
 ┃ ┃ ┗ 📜 todos.ts  // Описание на същността Todo
 ┃ ┣ 📂 application
 ┃ ┃ ┗ 📜 todoService.ts // Бизнес логика за работа с Todo
 ┃ ┗ 📂 ports
 ┃ ┃ ┣ 📜 in/ITodoUseCase.ts // Входен порт (интерфейс за UI)
 ┃ ┃ ┗ 📜 out/ITodoRepository.ts // Изходен порт (интерфейс за достъп до данни)
 ┣ 📂 infra
 ┃ ┣ 📂 adapters
 ┃ ┃ ┣ 📂 in/reactUIAdapter.tsx // Входящ адаптер (React компонент)
 ┃ ┃ ┗ 📂 out/apiTodoRepository.ts // Изходящ адаптер (реализация на достъп до API)