Архитектурные основы

5 мин чтения

Hexagonal Architecture: зачем отделять бизнес-логику от базы данных, API и фреймворков

База данных, HTTP-фреймворк и брокер сообщений могут меняться. Бизнес-правила обычно живут дольше. Hexagonal Architecture предлагает сделать это различие явным и не позволять техническим деталям диктовать форму всей системы.

Во многих системах бизнес-логика быстро смешивается с техническими деталями. Правило расчёта цены знает о таблице базы, обработчик API сам решает бизнес-условия, а тестирование требует поднять половину инфраструктуры.

Пока продукт маленький, это кажется удобным: меньше слоёв, меньше интерфейсов, меньше файлов. Проблема появляется позже, когда смена хранения, интерфейса или интеграции затрагивает правила, которые вообще не должны были зависеть от этой технологии.

Какую проблему мы решаем

Hexagonal Architecture, или Ports and Adapters, помещает бизнес-логику в центр. Она общается с внешним миром через явные порты — контракты того, что ей нужно.

База данных, HTTP API, очередь или внешний провайдер становятся адаптерами. Они знают, как перевести технический протокол в понятный для ядра вызов и обратно.

В идеале бизнес-правило можно проверить без настоящей базы, сети и фреймворка. Техническая деталь подключается снаружи, а не прорастает внутрь.

Что получает бизнес

Главная выгода — снижение стоимости изменений там, где технология меняется быстрее бизнес-правил.

Если продукт живёт долго, вероятность замены базы, провайдера, канала интеграции или интерфейсного протокола растёт. Хорошо отделённое ядро уменьшает шанс, что такая замена превратится в переписывание ключевой логики.

Архитектура также облегчает параллельное развитие каналов. Один и тот же бизнес-сценарий может вызываться через веб, API или сообщение, не получая отдельную копию правил для каждого входа.

Но компания платит за эту гибкость заранее. Если система короткоживущая и простая, инвестиция в абстракции может не успеть окупиться.

Что получает команда

Команда получает более чёткую границу между правилами предметной области и инфраструктурой.

Юнит-тесты становятся проще, потому что внешний мир заменяется тестовыми адаптерами. Технические компоненты можно менять с меньшим количеством каскадных правок.

Одновременно появляется риск архитектурного формализма: интерфейс на каждый класс, лишние DTO и много кода, который ничего не защищает. Порты полезны только на реальных границах.

Что получает клиент

Клиент обычно не видит архитектурный стиль. Он получает косвенный эффект: изменения каналов и интеграций реже ломают бизнес-правила, а новые способы взаимодействия могут появляться быстрее.

Но никакая Hexagonal Architecture сама по себе не делает продукт быстрее или стабильнее. Это способ управлять изменениями, а не пользовательская функция.

Чем мы за это платим

Код становится более структурированным и местами многословным. Нужно проектировать контракты, преобразования и зависимости.

Команде требуется дисциплина, чтобы не протащить инфраструктурные типы обратно в ядро.

Неправильно применённый подход легко превращается в церемонию: много абстракций, но технические решения всё равно протекают через все уровни.

Когда Hexagonal Architecture не нужна

Для маленького CRUD-сервиса с коротким сроком жизни прямой путь от HTTP к базе может быть дешевле.

Подход имеет смысл, когда есть существенная бизнес-логика, несколько внешних интерфейсов, долгий жизненный цикл или высокая вероятность смены инфраструктурных деталей.

Что стоит спросить перед решением

В итоге

Hexagonal Architecture полезна не потому, что «так чище». Она полезна, когда бизнес-правила должны жить дольше конкретной технологии вокруг них.

Для бизнеса это инвестиция в более дешёвую смену технических деталей — но только там, где такие изменения действительно вероятны и дороги.