Что такое гексагональная архитектура (порты и адаптеры) и чем она отличается от слоистой?
- Что такое чистая архитектура?
- Зачем отделять домен от фреймворка и базы данных?
Домен в центре и не зависит ни от чего внешнего. Он объявляет порты — интерфейсы на своём языке: входящие (сценарии использования) и исходящие (OrderRepository, PaymentGateway). Адаптеры снаружи реализуют их: REST-контроллер, JPA-репозиторий, клиент Kafka. Все зависимости направлены внутрь.
- Слоистая: контроллер → сервис → репозиторий, и бизнес-логика зависит от слоя данных
- Гексагональная переворачивает эту стрелку через DIP
- Домен тестируется без БД и фреймворка — подменой адаптеров
А ещё Чистая и луковая архитектуры — варианты той же идеи
Подробно
Проблема слоистой архитектуры. Сервис зависит от репозитория, а репозиторий — от ORM. Бизнес-правила обрастают аннотациями JPA, исключениями драйвера, DTO фреймворка. Сменить базу или протестировать логику без неё трудно.
Порты и адаптеры (Алистер Кокберн):
- домен — сущности и правила, без импорта фреймворков;
- входящие порты — сценарии:
PlaceOrder,CancelOrder; - исходящие порты — что домену нужно от мира:
Orders,PaymentGateway,Clock; - входящие адаптеры вызывают сценарии: REST, консьюмер очереди, CLI, тесты;
- исходящие адаптеры реализуют исходящие порты: JPA, HTTP-клиент, Kafka-продюсер.
[REST] → PlaceOrder → (домен) → Orders ← [JpaOrders]
→ PaymentGateway ← [StripeClient]
Плюсы: домен тестируется быстрыми юнит-тестами с фейковыми адаптерами; инфраструктура заменяема; бизнес-код читается без шума.
Цена: больше интерфейсов и маппинга между доменными объектами и сущностями БД; для CRUD без правил это избыточно.
Критерий хорошего порта: он сформулирован в терминах домена — в нём нет слов SQL, JPA, HTTP, Entity.
Что хотят услышать
- Домен, порты, адаптеры и направление зависимостей.
- Отличие от слоистой архитектуры.
- Плюсы и цена, когда избыточно.
Частые ошибки
- Называть гексагональной архитектурой просто интерфейс над репозиторием Spring Data.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Шесть обязательных слоёв, каждый вызывает только соседний
- ✗То же, что слоистая архитектура, но контроллеры и репозитории лежат в одном пакете с бизнес-логикой
- ✗Разбиение системы на шесть микросервисов
- ✓Домен объявляет порты, адаптеры снаружи их реализуют, все зависимости направлены внутрь
Связанные вопросы
- Доменный сервис работает с базой напрямую через JPA-репозиторий Spring Data. Как применить Dependency Inversion Principle, и что именно здесь «инвертируется»? Senior
- Сервис получает через конструктор зависимость типа PostgresOrderRepository (конкретный класс), которую внедряет Spring. Что здесь верно? Middle
- Что такое anemic domain model, чем она плоха и когда всё-таки допустима? Middle
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.