Назад к вопросам
Senior
147
questionbank

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

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech 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)