Разкажете за шестоъгълната архитектура и за произхода й.
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)