Senior
345
questionbank

Что вы знаете об архитектуре портов и адаптеров?

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

Архитектура портов и адаптеров, также известная как гексагональная архитектура (Hexagonal Architecture), отделяет логику предметной области приложения (Core) от внешних зависимостей (интерфейсов пользователя, баз данных, внешних сервисов).

Основные концепции:

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

Преимущества:

  • Тестируемость: Изоляция Core облегчает юнит-тестирование бизнес-логики без необходимости мокировать сложные внешние зависимости.
  • Гибкость: Позволяет легко заменять или добавлять новые внешние технологии (базы данных, фреймворки) без изменения Core. Достаточно написать новый адаптер для существующего порта.
  • Чистый код: Способствует созданию более чистого и поддерживаемого кода, фокусируя Core только на бизнес-правилах.
  • Разделение ответственности: Четко разделяет зоны ответственности.

Связь с Frontend:

На Frontend архитектура портов и адаптеров применима для:

  • Отделения бизнес-логики компонента от источников данных: Компонент взаимодействует с "портом" (интерфейсом), который может быть реализован разными "адаптерами" (получающими данные из API, Local Storage, тестовых моков и т.д.).
  • Обработки внешних событий: Входящие порты могут представлять обработчики событий UI, а адаптеры преобразуют эти события в вызовы внутренней логики.
  • Инкапсуляции взаимодействия с внешними библиотеками: Адаптеры могут оборачивать обращения к сторонним библиотекам (например, библиотеке для работы с картами), предоставляя Core простой и стабильный интерфейс.

Пример на JavaScript (схема):

javascript