Что такое порт в гексагональной архитектуре?

Ответ

В гексагональной архитектуре (также известной как Ports and Adapters) порт — это интерфейс, который определяет контракт взаимодействия между ядром приложения (бизнес-логикой) и внешним миром (адаптерами). Порты служат точками входа и выхода для ядра, абстрагируя детали реализации и позволяя ядру оставаться полностью независимым от внешних систем (баз данных, UI, сторонних API и т.д.). Это обеспечивает высокую степень изоляции, облегчает тестирование и замену внешних зависимостей.

Порты бывают двух основных типов:

  1. Входные (Driving/Primary Ports): Определяют, как внешние клиенты (например, UI, REST API, CLI) взаимодействуют с ядром приложения. Они инициируют действия в бизнес-логике.
  2. Выходные (Driven/Secondary Ports): Определяют, как ядро приложения взаимодействует с внешними сервисами (например, базами данных, файловой системой, внешними API). Ядро вызывает эти порты для выполнения операций во внешнем мире.

Пример выходного порта для работы с хранилищем пользователей (Python):

from abc import ABC, abstractmethod

# Это порт — абстрактный интерфейс, который ядро приложения будет использовать
class UserRepository(ABC):
    @abstractmethod
    def save(self, user: 'User') -> None:
        """Сохраняет пользователя в хранилище."""
        pass

    @abstractmethod
    def get_by_id(self, user_id: str) -> 'User':
        """Получает пользователя по ID из хранилища."""
        pass

Пояснение: Ядро приложения будет зависеть только от этого абстрактного UserRepository. Конкретные реализации (например, PostgresUserRepository, InMemoryUserRepository) будут являться адаптерами, которые реализуют этот порт, подключая ядро к реальным внешним системам. Это позволяет легко менять технологию хранения данных без изменения бизнес-логики.