Ответ
В гексагональной архитектуре (также известной как Ports and Adapters) порт — это интерфейс, который определяет контракт взаимодействия между ядром приложения (бизнес-логикой) и внешним миром (адаптерами). Порты служат точками входа и выхода для ядра, абстрагируя детали реализации и позволяя ядру оставаться полностью независимым от внешних систем (баз данных, UI, сторонних API и т.д.). Это обеспечивает высокую степень изоляции, облегчает тестирование и замену внешних зависимостей.
Порты бывают двух основных типов:
- Входные (Driving/Primary Ports): Определяют, как внешние клиенты (например, UI, REST API, CLI) взаимодействуют с ядром приложения. Они инициируют действия в бизнес-логике.
- Выходные (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
) будут являться адаптерами, которые реализуют этот порт, подключая ядро к реальным внешним системам. Это позволяет легко менять технологию хранения данных без изменения бизнес-логики.