Senior
77
questionbank

Расскажите о гексагональной архитектуре и о её происхождении.

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

Гексагональная архитектура (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