Гексагональная архитектура (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 (исходящие адаптеры).
Пример структуры (абстрактный):
plaintext