Архитектура является одним из строительных блоков любой системы, и правильный выбор ее на начальном этапе поможет вам в дальнейшем обслуживании и масштабировании. Большинство из нас слышали об архитектуре MVC и ее широком использовании благодаря простоте разработки, но в эпоху развивающихся технологий нам нужна архитектура, способная поддерживать эти динамические изменения.
Что такое гексагональная архитектура и почему ее следует принять?
В традиционной методологии у нас есть веб-слой, который получает запросы и направляет их к службе в домене или бизнес-слое. Сервис выполняет некоторую бизнес-логику и вызывает компоненты из слоя постоянства для запроса или изменения текущего состояния наших доменных сущностей.
Знаете что? Слои — это надежный архитектурный паттерн. Если мы правильно их используем, то можем построить логику домена, которая не зависит от веб-уровня и уровня персистентности. Мы можем менять веб-технологии или технологии персистентности, не затрагивая логику нашего домена, если нам так захочется. Мы можем добавлять новые функции, не затрагивая существующие. С хорошей многоуровневой архитектурой мы держим свои возможности открытыми и можем быстро адаптироваться к изменяющимся требованиям и внешним факторам.
С шестиугольной архитектурой у вас будет достаточно рычагов воздействия и удержания вашей бизнес-логики. Ее прелесть в том, что входные и выходные данные находятся на границах приложения, поэтому в будущем, даже если вы решите использовать другой способ получения входных данных или отправлять выходные данные в новом формате, вам не придется менять основные функциональные возможности.
Основная идея этой архитектуры заключается в том, что бизнес-логика не должна зависеть от источника или формата данных, из которого она поступает, это может быть что угодно CSV, XML, JSON, база данных или REST, и она не должна зависеть от того, как мы возвращаем данные через REST или GraphQL API.
Что такое порт и адаптер?
Проще говоря, порт — это способ связи, подобно тому, как ваши настольные компьютеры и ноутбуки имеют USB-порт, через который вы можете подключить любое устройство при условии, что у них есть USB-адаптеры. Подобно этому в гексагональной архитектуре существуют порты, в основном интерфейсы, и их реализация (адаптеры), которая дает вам достаточно контроля, чтобы вы могли подключать и отключать адаптеры в соответствии с вашими требованиями.
Порты и адаптеры играют решающую роль в создании слоя абстракции, этот слой сохраняет основную область приложения изолированной от внешних инструментов и используемых технологий.
Эта архитектура способна работать с несколькими портами и адаптерами, отсюда и название архитектуры — шестиугольная, что создает иллюзию сочетания нескольких портов и адаптеров.
Здесь может быть веб-адаптер, взаимодействующий с веб-браузером, несколько адаптеров, взаимодействующих с внешними системами, и адаптер, взаимодействующий с базой данных.
Адаптеры с левой стороны — это адаптеры, которые управляют нашим приложением (потому что они вызывают ядро приложения), а адаптеры с правой стороны управляются нашим приложением (потому что их вызывает ядро приложения).
Чтобы обеспечить связь между ядром приложения и адаптерами, ядро приложения предоставляет определенные порты. Для управляемых адаптеров используется порт, который представляет собой интерфейс, реализуемый одним из классов сценариев использования в ядре и вызываемый адаптером. Для управляемого адаптера это может быть интерфейс, который реализуется адаптером и вызывается ядром.
Гексагональная архитектура относится к архитектуре слоев, поскольку мы можем организовать ее по слоям. Внешний слой состоит из адаптера, который взаимодействует с внешними инструментами/системами, далее порты и их сценарии использования могут быть объединены как слой приложений и, наконец, слой домена, содержащий сущности. Основным правилом в такой архитектуре является правило зависимости, которое гласит, что все зависимости между этими слоями должны быть направлены внутрь.
Заключение
Выбор оптимальной архитектуры для вашего приложения зависит от ваших требований, от того, какое приложение вы собираетесь построить, от его будущих задач и многих других факторов. Гексагональная архитектура — не единственный разумный набор для приложения, она предполагает определенный уровень сложности. При правильной реализации и в паре с другими методологиями, такими как Domain-Driven Design, порты и адаптеры могут обеспечить долгосрочную стабильность и расширяемость приложения, принося большую пользу системе и предприятию.
Спасибо за прочтение!