#exp #gex #arch
Я столкнулся с Гексагональной архитектурой не так давно. Однако, этот паттерн проектирования архитектуры приложений настолько сильно захватил мои мысли, что теперь, работая над чужим ПО, я думаю "Какого 🤬🤬🤬 тут нет гексагоналки?!" 😅
❓Что такое Гексагональная архитектура?
#️⃣ Гексагональная архитектура - это паттерн проектирования, который был представлен Алистером Кокберном в 2005 году.
❓ Зачем нужен этот паттерн?
Гексагональная архитектура позволяет решить следующие проблемы:
1️⃣ Во-первых, проблему невозможности протестировать систему из-за модулей, зависящих от деталей других модулей;
2️⃣ Во-вторых, проблему перехода от одного технического решения к другому. Например, переход на другую СУБД, фреймворк и даже язык программирования;
3️⃣ В-третьих, проблему переиспользования модулей внутри одной или нескольких программ.
Сам же Алистер описывает задачу паттерна следующим образом:
Далее я хочу подробнее рассказать о данном паттерне и начну с описания слоев приложения.
Я столкнулся с Гексагональной архитектурой не так давно. Однако, этот паттерн проектирования архитектуры приложений настолько сильно захватил мои мысли, что теперь, работая над чужим ПО, я думаю "Какого 🤬🤬🤬 тут нет гексагоналки?!" 😅
❓Что такое Гексагональная архитектура?
#️⃣ Гексагональная архитектура - это паттерн проектирования, который был представлен Алистером Кокберном в 2005 году.
❓ Зачем нужен этот паттерн?
Гексагональная архитектура позволяет решить следующие проблемы:
1️⃣ Во-первых, проблему невозможности протестировать систему из-за модулей, зависящих от деталей других модулей;
2️⃣ Во-вторых, проблему перехода от одного технического решения к другому. Например, переход на другую СУБД, фреймворк и даже язык программирования;
3️⃣ В-третьих, проблему переиспользования модулей внутри одной или нескольких программ.
Сам же Алистер описывает задачу паттерна следующим образом:
"Добиться, чтобы приложение в равной степени могло управляться пользователями, программами, автоматизированными тестовыми или пакетными сценариями, а также разрабатываться и тестироваться в изоляции от устройств и баз данных, на которых оно впоследствии будет выполняться."
Алистер Кокберн.
Далее я хочу подробнее рассказать о данном паттерне и начну с описания слоев приложения.
👍7🤔5
#arch #gex #exp
Что такое слои приложения, и зачем они нужны?
#️⃣ Слой - это некоторая область вашего приложения, которая инкапсулирует функционал части системы.
Идея разделить программу на слои - это не что-то новое. Программисты занимались этим задолго до гексагоналки. Однако, общепринятого "эталона" не было.
Тогда на свет пришла гексагоналка со своими стандартными слоями. А именно:
1️⃣ Слой доменов - тут мы можем расположить базовые сущности нашего приложения. А также модули, реализующие бизнес-логику приложения.
2️⃣ Слой приложения - в данном слое расположены ваши Use Cases. Это некие агрегаторы, которые вызывают несколько разных модулей.
3️⃣ Слой представления - здесь находятся ваши контроллеры, cli команды, страницы сайта и т.п.
4️⃣ Слой инфраструктуры содержит любые модули (адаптеры) для внешних систем (БД, Интеграции и т.п.).
Далее я расскажу о каждом слое более подробно.
Что такое слои приложения, и зачем они нужны?
#️⃣ Слой - это некоторая область вашего приложения, которая инкапсулирует функционал части системы.
Идея разделить программу на слои - это не что-то новое. Программисты занимались этим задолго до гексагоналки. Однако, общепринятого "эталона" не было.
Тогда на свет пришла гексагоналка со своими стандартными слоями. А именно:
1️⃣ Слой доменов - тут мы можем расположить базовые сущности нашего приложения. А также модули, реализующие бизнес-логику приложения.
2️⃣ Слой приложения - в данном слое расположены ваши Use Cases. Это некие агрегаторы, которые вызывают несколько разных модулей.
3️⃣ Слой представления - здесь находятся ваши контроллеры, cli команды, страницы сайта и т.п.
4️⃣ Слой инфраструктуры содержит любые модули (адаптеры) для внешних систем (БД, Интеграции и т.п.).
Далее я расскажу о каждом слое более подробно.
👍7🔥2
#exp #arch #gex
Слой доменов
❓Из чего состоит слой доменов?
Как я писал ранее, слой состоит из бизнес сущностей и бизнес логики. Бизнес сущность - это ограниченный контекст вашего бизнеса, который подчиняется некоторому набору бизнес правил (бизнес логике).
Предположим, вы делаете сайт знакомств.
❓Какие можно выделить сущности?
1️⃣ Пользователь - информация о пользователе (ФИО, текст "о себе");
2️⃣ Лайк - запись о том, кто кого лайкнул;
❓Какие модули с бизнес логикой можно выделить?
1️⃣ Действие "Поставить лайк";
2️⃣ Действие "Отменить лайк".
А вот, например, действие "Загрузка фото пользователя" не будет являться доменной бизнес логикой - его следует выносить в слой приложения. И отслеживать эту операцию нужно через EventBus (о нем я обязательно напишу, когда буду рассказывать о слое приложения).
Слой доменов
❓Из чего состоит слой доменов?
Как я писал ранее, слой состоит из бизнес сущностей и бизнес логики. Бизнес сущность - это ограниченный контекст вашего бизнеса, который подчиняется некоторому набору бизнес правил (бизнес логике).
Предположим, вы делаете сайт знакомств.
❓Какие можно выделить сущности?
1️⃣ Пользователь - информация о пользователе (ФИО, текст "о себе");
2️⃣ Лайк - запись о том, кто кого лайкнул;
❓Какие модули с бизнес логикой можно выделить?
1️⃣ Действие "Поставить лайк";
2️⃣ Действие "Отменить лайк".
А вот, например, действие "Загрузка фото пользователя" не будет являться доменной бизнес логикой - его следует выносить в слой приложения. И отслеживать эту операцию нужно через EventBus (о нем я обязательно напишу, когда буду рассказывать о слое приложения).
👍5🤔4🔥2
#exp #gex #arch
Кстати, на практике я заметил, что в доменном слое можно "обойтись" без реализации бизнес логики. И оставить в нем только интерфейсы, которые декларируют контракты модулей этого слоя.
Приведу пример:
Вы хотите сделать функцию "Поставить лайк" на вашем сайте знакомств. Вы делаете в доменном слое модуль, например,
❓Где же тогда разместить саму бизнес логику?
Все просто. Для интерфейса
Кстати, на практике я заметил, что в доменном слое можно "обойтись" без реализации бизнес логики. И оставить в нем только интерфейсы, которые декларируют контракты модулей этого слоя.
Приведу пример:
Вы хотите сделать функцию "Поставить лайк" на вашем сайте знакомств. Вы делаете в доменном слое модуль, например,
ApplyLike и пишите в нем свою логику. Вот тут и кроется подвох. В какой-то момент вы хотите использовать другую логику, но ваши Use Cases уже связаны с модулем ApplyLike. Решить эту проблему можно с помощью интерфейса ApplyLikeInterface. Такая реализация сделает ваш доменный слой более гибким и позволит легче масштабироваться.❓Где же тогда разместить саму бизнес логику?
Все просто. Для интерфейса
ApplyLikeInterface вы делаете слой DomainCore, для модуля ApplyLike с вашей бизнес логикой вы должны сделать Domain слой.👍6🔥2
#exp #arch #gex
Порты и Адаптеры
Альтернативное название Гексагональной архитектуры - “Порты и адаптеры”. Это название лучше отражает принцип работы этого паттерна, так как шестиугольник (гексагон) не является строгим требованием паттерна, а вот наличие портов и адаптеров является одним из ключевых факторов.
❓Что такое порты?
Определение портов довольно простое. По сути это любая точка входа в вашем приложении. Это может быть графический интерфейс, командная строка, даже публичный метод класса - все это является портами.
❓Что такое адаптеры?
Точки входа (порты) мы определили. Теперь наша задача - передать данные через порты так, чтобы сохранился приемлемый уровень изоляции одного слоя от другого. В этом нам помогают адаптеры. Они позвляют транспортировать данные в другой слой, ничего не зная о деталях реализации модулей, которые мы хотим использовать. Максимум, который нам известен при использовании адаптеров, - это некий контракт взаимодействия.
Используя порты в качестве точек входа, а адаптеры в качестве транспортировщиков данных, система обретает гибкость, которая позволит в будущем легче масштабироваться. Например, использовать другой бизнес-логический модуль, фреймворк, базу данных и так далее.
Теперь, зная о том, что такое порты и адаптеры, стоит запомнить ключевое правило: любое перемещение между слоями системы должно сопровождаться входом на порт слоя и передачей данных его адаптеру.
Ниже я расскажу, какие ограничения накладываются на подобные перемещения.
Порты и Адаптеры
Альтернативное название Гексагональной архитектуры - “Порты и адаптеры”. Это название лучше отражает принцип работы этого паттерна, так как шестиугольник (гексагон) не является строгим требованием паттерна, а вот наличие портов и адаптеров является одним из ключевых факторов.
❓Что такое порты?
Определение портов довольно простое. По сути это любая точка входа в вашем приложении. Это может быть графический интерфейс, командная строка, даже публичный метод класса - все это является портами.
❓Что такое адаптеры?
Точки входа (порты) мы определили. Теперь наша задача - передать данные через порты так, чтобы сохранился приемлемый уровень изоляции одного слоя от другого. В этом нам помогают адаптеры. Они позвляют транспортировать данные в другой слой, ничего не зная о деталях реализации модулей, которые мы хотим использовать. Максимум, который нам известен при использовании адаптеров, - это некий контракт взаимодействия.
Используя порты в качестве точек входа, а адаптеры в качестве транспортировщиков данных, система обретает гибкость, которая позволит в будущем легче масштабироваться. Например, использовать другой бизнес-логический модуль, фреймворк, базу данных и так далее.
Теперь, зная о том, что такое порты и адаптеры, стоит запомнить ключевое правило: любое перемещение между слоями системы должно сопровождаться входом на порт слоя и передачей данных его адаптеру.
Ниже я расскажу, какие ограничения накладываются на подобные перемещения.
👍5🔥2
#exp #arch #gex
Принцип инверсии зависимостей отчетливо прослеживается, когда мы используем слой представления, слой приложения, доменный слой и слой инфраструктуры. Стоит заметить, что при правильном использовании DIP все зависимости направлены внутрь системы. От конкретных деталей ко все более и более абстрактным модулям на других слоях.
Благодаря этому принципу вы сможете проектировать модули так, чтобы они не зависели от представлений или от конкретных внешних систем. Именно это помогает достичь необходимого уровня изоляции каждой отдельно взятой системы или модуля и создать "идеальную" среду для тестирования.
Принцип инверсии зависимостей отчетливо прослеживается, когда мы используем слой представления, слой приложения, доменный слой и слой инфраструктуры. Стоит заметить, что при правильном использовании DIP все зависимости направлены внутрь системы. От конкретных деталей ко все более и более абстрактным модулям на других слоях.
Благодаря этому принципу вы сможете проектировать модули так, чтобы они не зависели от представлений или от конкретных внешних систем. Именно это помогает достичь необходимого уровня изоляции каждой отдельно взятой системы или модуля и создать "идеальную" среду для тестирования.
🔥5👍3🤔2
#exp #gex #arch
Слой приложения
#️⃣ Давайте вспомним, за что отвечает слой приложения. В данном слое расположены ваши Use Cases. Это некие агрегаторы, которые вызывают несколько разных логических модулей.
Помните про действия “Поставить лайк” (
В гексагональной архитектуре действует постулат: все Use Cases должны храниться в слое приложения и только там. Также не забываем о том, что данный слой должен иметь порты и адаптеры для того, чтобы его можно было вызвать из других слоев, например, из слоя представления (API, GUI, etc.).
На самом деле, это практически все, что необходимо знать об этом слое - его не стоит сильно усложнять. Единственное, что мы позже в него добавим, - взаимодействие со слоем инфраструктуры через EventBus.
Слой приложения
#️⃣ Давайте вспомним, за что отвечает слой приложения. В данном слое расположены ваши Use Cases. Это некие агрегаторы, которые вызывают несколько разных логических модулей.
Помните про действия “Поставить лайк” (
ApplyLike) и “Отменить лайк” (CancelLike) из поста про слой доменов? В слое приложения мы можем сделать use case “toggleLike” - это будет переключатель лайка. Если пользователь кликает на фото другого пользователя и у него еще нет лайка, то лайк ставится (ApplyLike), в противном случае лайк отменяется (CancelLike). В данном примере toggleLike - это Use Case двух бизнес логик.В гексагональной архитектуре действует постулат: все Use Cases должны храниться в слое приложения и только там. Также не забываем о том, что данный слой должен иметь порты и адаптеры для того, чтобы его можно было вызвать из других слоев, например, из слоя представления (API, GUI, etc.).
На самом деле, это практически все, что необходимо знать об этом слое - его не стоит сильно усложнять. Единственное, что мы позже в него добавим, - взаимодействие со слоем инфраструктуры через EventBus.
Telegram
Башня Байткода: заметки об архитектуре ПО
#exp #arch #gex
Слой доменов
❓Из чего состоит слой доменов?
Как я писал ранее, слой состоит из бизнес сущностей и бизнес логики. Бизнес сущность - это ограниченный контекст вашего бизнеса, который подчиняется некоторому набору бизнес правил (бизнес логике).…
Слой доменов
❓Из чего состоит слой доменов?
Как я писал ранее, слой состоит из бизнес сущностей и бизнес логики. Бизнес сущность - это ограниченный контекст вашего бизнеса, который подчиняется некоторому набору бизнес правил (бизнес логике).…
👍6🔥4
#exp #gex #arch
Инфраструктурный слой (ИС)
❓ Что такое инфраструктурный слой?
Инфраструктурный слой - это слой для связи приложения с внешним миром. Однако, стоит ограничивать общение этого слоя, так как в противном случае он может очень сильно разрастись. Обычно в этот слой относят взаимодействия с:
1️⃣ Базой данных;
2️⃣ Системами индексации контента;
3️⃣ Кэшем;
4️⃣ Файловой системой или файловым хранилищем;
5️⃣ ORM;
6️⃣ Фреймворками;
7️⃣ Сторонними библиотеками;
8️⃣ Брокерами очередей
... и многими другими инструментами.
Некоторые разработчики ошибочно включают в этот слой такие модули как GUI, API и т.п., то есть те модули, с которыми непосредственно работает конечный пользователь системы. Это большая ошибка, потому что они перегружают слой, и постепенно он становиться трудно изменяемым. Чтобы избавиться от этой проблемы, данный слой разделяют на подмножества: слой доступа к данным (Data Access Layer) и слой представления данных (Data Presentation Layer).
Хочу отметить, что ИС - один из самых эффективных слоев, который позволяет сделать ваше ПО чрезвычайно устойчивым к изменениям требований (любых требований). Фактор устойчивости крайне важен - он помогает вашей системе деградировать медленнее.
Формируя инфраструктурный слой своего приложения, старайтесь делать адаптеры более абстрактными. Адаптеры с более абстрактными методами легче заменить, чем адаптеры, которые сильно связаны с деталями реализации.
Инфраструктурный слой (ИС)
❓ Что такое инфраструктурный слой?
Инфраструктурный слой - это слой для связи приложения с внешним миром. Однако, стоит ограничивать общение этого слоя, так как в противном случае он может очень сильно разрастись. Обычно в этот слой относят взаимодействия с:
1️⃣ Базой данных;
2️⃣ Системами индексации контента;
3️⃣ Кэшем;
4️⃣ Файловой системой или файловым хранилищем;
5️⃣ ORM;
6️⃣ Фреймворками;
7️⃣ Сторонними библиотеками;
8️⃣ Брокерами очередей
... и многими другими инструментами.
Некоторые разработчики ошибочно включают в этот слой такие модули как GUI, API и т.п., то есть те модули, с которыми непосредственно работает конечный пользователь системы. Это большая ошибка, потому что они перегружают слой, и постепенно он становиться трудно изменяемым. Чтобы избавиться от этой проблемы, данный слой разделяют на подмножества: слой доступа к данным (Data Access Layer) и слой представления данных (Data Presentation Layer).
Хочу отметить, что ИС - один из самых эффективных слоев, который позволяет сделать ваше ПО чрезвычайно устойчивым к изменениям требований (любых требований). Фактор устойчивости крайне важен - он помогает вашей системе деградировать медленнее.
Формируя инфраструктурный слой своего приложения, старайтесь делать адаптеры более абстрактными. Адаптеры с более абстрактными методами легче заменить, чем адаптеры, которые сильно связаны с деталями реализации.
👍6🔥4
#arch #gex #exp
Инфраструктурный слой. Что в него выделять?
Все. Все, что сможете (любые внешние модули).
Библиотеки. Я стараюсь не использовать зависимости проекта напрямую. Лучше сделать адаптер в инфраструктурном слое, чтобы библиотеку можно было легко заменить. Ведь завтра релизнется новая более удобная и производительная либа, которую я захочу подключить в свой проект.
Хранилища данных. Тут частота изменений не такая большая. По моему опыту, вопрос о смене БД возникает, когда проект достигает "подросткового возраста" и старше. Смена СУБД или драйвера БД - это довольно трудоемкая задача. Если вы правильно организуете код, то вы сможете избежать основную массу проблем при миграции.
Прикрываем тыл. Бывает так, что на старте нового проекта вы приняли решение использовать Инструмент А, потому что вы с ним лучше знакомы, но в какой-то момент вы поняли, что это была плохая идея, и вам нужен Инструмент Б. Если вы не сможете быстро и бесшовно внедрить Инструмент Б, то цена такой ошибки может оказаться очень большой (деньги компании, ваше время, время коллег и нервы).
Инфраструктурный слой. Что в него выделять?
Библиотеки. Я стараюсь не использовать зависимости проекта напрямую. Лучше сделать адаптер в инфраструктурном слое, чтобы библиотеку можно было легко заменить. Ведь завтра релизнется новая более удобная и производительная либа, которую я захочу подключить в свой проект.
Хранилища данных. Тут частота изменений не такая большая. По моему опыту, вопрос о смене БД возникает, когда проект достигает "подросткового возраста" и старше. Смена СУБД или драйвера БД - это довольно трудоемкая задача. Если вы правильно организуете код, то вы сможете избежать основную массу проблем при миграции.
Прикрываем тыл. Бывает так, что на старте нового проекта вы приняли решение использовать Инструмент А, потому что вы с ним лучше знакомы, но в какой-то момент вы поняли, что это была плохая идея, и вам нужен Инструмент Б. Если вы не сможете быстро и бесшовно внедрить Инструмент Б, то цена такой ошибки может оказаться очень большой (деньги компании, ваше время, время коллег и нервы).
👍6🔥4
#exp #arch #gex
Слой представления
❓Что такое слой представления?
Данный слой - это подмножество инфраструктурного слоя. В инфраструктуру обычно выделяют минимум две задачи: доступ к данным (Data Access Layer) и представление данных (Data Presentation Layer). В слой представления обычно выносят все, с чем взаимодействуют конечные пользователи. Это может быть графический интерфейс, командная оболочка, HTTP API и т.п.
#️⃣ Немного о факторе устойчивости
Ранее я писал о слое инфраструктуры и его подмножестве - слое доступа к данным (Data Access Layer). Упоминался такой фактор как устойчивость к изменениям. Данный фактор/критерий является частью общей теории о Функциональной устойчивости информационных систем. По сути он означает то, что ваша система должна уметь быстро изменяться. Например, пользователи вашего приложения начнут уходить в сервис, который визуально удобнее вашего. Вы должны иметь возможность без лишних замедлений обновить свою систему, чтобы пользователям стало комфортнее. И такие банальные проблемы как неразделенные слои не должны вам мешать.
Также под устойчивостью подразумевается исправление ошибок. Плохо спроектированная архитектура может заметно увеличить время исправления бага. Если возникает подобная проблема, значит, ваша система в некоторой степени не устойчива к изменениям. Решить это можно регулярным проведением качественного рефакторинга архитектуры вашей системы.
Слой представления
❓Что такое слой представления?
Данный слой - это подмножество инфраструктурного слоя. В инфраструктуру обычно выделяют минимум две задачи: доступ к данным (Data Access Layer) и представление данных (Data Presentation Layer). В слой представления обычно выносят все, с чем взаимодействуют конечные пользователи. Это может быть графический интерфейс, командная оболочка, HTTP API и т.п.
#️⃣ Немного о факторе устойчивости
Ранее я писал о слое инфраструктуры и его подмножестве - слое доступа к данным (Data Access Layer). Упоминался такой фактор как устойчивость к изменениям. Данный фактор/критерий является частью общей теории о Функциональной устойчивости информационных систем. По сути он означает то, что ваша система должна уметь быстро изменяться. Например, пользователи вашего приложения начнут уходить в сервис, который визуально удобнее вашего. Вы должны иметь возможность без лишних замедлений обновить свою систему, чтобы пользователям стало комфортнее. И такие банальные проблемы как неразделенные слои не должны вам мешать.
Также под устойчивостью подразумевается исправление ошибок. Плохо спроектированная архитектура может заметно увеличить время исправления бага. Если возникает подобная проблема, значит, ваша система в некоторой степени не устойчива к изменениям. Решить это можно регулярным проведением качественного рефакторинга архитектуры вашей системы.
👍4🔥3🤯3
#exp #arch #gex
Разделение на компоненты и слайсы (Feature slicing)
Компонентно-ориентированную разработку можно использовать где угодно. Эта парадигма не связана с гексагональной архитектурой напрямую. Однако, паттерн гексагона описывает некий Component (закрашенная синяя область на схеме), в котором стоит разобраться.
❓ Что такое компонент с точки зрения гексагональной архитектуры?
В гексагональной архитектуре под компонентом понимается набор модулей, который относится к одной конкретной сущности вашего приложения. Это может быть бизнес-сущность Пользователь, Товар или что-то еще. Самое главное, что модули этого компонента могут находиться на разных слоях и объединяться в CBSE компоненты.
На практике не очень удобно, что приходится оперировать одним и тем же термином (компонент) в разных контекстах. Я предлагаю выделять следующие правила для гексагоналки:
1️⃣ Термин компонент подразумевается только в конексте CBSE;
2️⃣ Набор компонентов, которые можно сгруппировать на нескольких слоях, будет называться слайс (slice или feature slice);
3️⃣ Составление компонентов происходит по правилам CBSE. За одним исключением: компоненты на внутреннем уровне не должны зависеть от компонентов на внешнем уровне. Соблюдаем принцип инверсии зависимостей.
❓ Чем полезен feature slice?
Слайсы привносят в паттерн гексагональной архитектуры не только понятие CBSE, но и способ организации кода. Когда вы думаете не только о том, как организовать компонент, но и о том, как организовать слайс, то проект становится более структурированным. Это позволяет не только быстро и удобно разрабатывать фичи, но и делать это максимально изолированно от других слайсов и их компонентов.
Разделение на компоненты и слайсы (Feature slicing)
Компонентно-ориентированную разработку можно использовать где угодно. Эта парадигма не связана с гексагональной архитектурой напрямую. Однако, паттерн гексагона описывает некий Component (закрашенная синяя область на схеме), в котором стоит разобраться.
В гексагональной архитектуре под компонентом понимается набор модулей, который относится к одной конкретной сущности вашего приложения. Это может быть бизнес-сущность Пользователь, Товар или что-то еще. Самое главное, что модули этого компонента могут находиться на разных слоях и объединяться в CBSE компоненты.
На практике не очень удобно, что приходится оперировать одним и тем же термином (компонент) в разных контекстах. Я предлагаю выделять следующие правила для гексагоналки:
Слайсы привносят в паттерн гексагональной архитектуры не только понятие CBSE, но и способ организации кода. Когда вы думаете не только о том, как организовать компонент, но и о том, как организовать слайс, то проект становится более структурированным. Это позволяет не только быстро и удобно разрабатывать фичи, но и делать это максимально изолированно от других слайсов и их компонентов.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🤯3🔥2
#exp #gex #arch
Command/Query bus на практике
Когда мы принимаем на вход какие-либо данные от пользователей, мы обязательно валидируем входящие данные и формируем ответ в нужном формате. Обычная схема в таком случае это Controller => Use Case => Domain Logic => Responder.
Controller - принимает и валидирует данные;
Use Case - агрегирует и использует доменную логику (Domain Logic);
Responder - формирует ответ в нужном формате.
Обычно этого хватает на старте, но с развитием системы могут появиться проблемы: разработчик забыл написать валидацию, нарушение конвенций или их отсутствие, некачественная валидация и т.д.
Решением подобных проблем являются внедрение правил CQRS и организация слоя Command/Query bus.
❓ Что такое Command/Query bus?
CQB - это изолированный слой системы, который несет ответственность за все входящие данные и формирует выходящие данные.
Для CQB можно выделить следующие задачи:
1️⃣ формирует команду/запрос;
2️⃣ валидирует команду/запрос;
3️⃣ передает её в обработчик команды/запроса;
4️⃣ обработчик команды/запроса формирует ответ*.
* В случае команд (запись данных) можно отдать стандартный ответ из контролера
CQB унифицирует работу с входными/выходными данными и предотвращает передачу некорректных данных в слой бизнес логики.
Command/Query bus на практике
Когда мы принимаем на вход какие-либо данные от пользователей, мы обязательно валидируем входящие данные и формируем ответ в нужном формате. Обычная схема в таком случае это Controller => Use Case => Domain Logic => Responder.
Controller - принимает и валидирует данные;
Use Case - агрегирует и использует доменную логику (Domain Logic);
Responder - формирует ответ в нужном формате.
Обычно этого хватает на старте, но с развитием системы могут появиться проблемы: разработчик забыл написать валидацию, нарушение конвенций или их отсутствие, некачественная валидация и т.д.
Решением подобных проблем являются внедрение правил CQRS и организация слоя Command/Query bus.
CQB - это изолированный слой системы, который несет ответственность за все входящие данные и формирует выходящие данные.
Для CQB можно выделить следующие задачи:
* В случае команд (запись данных) можно отдать стандартный ответ из контролера
CQB унифицирует работу с входными/выходными данными и предотвращает передачу некорректных данных в слой бизнес логики.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍4
#exp #arch #gex
Выводы о Гексагональной архитектуре
✅ Преимущества
1. Строго декларируются зоны ответственности, которые инкапсулируются в слоях приложения;
2. Бизнес-логика отделяется от логики системы, что упрощает миграцию кода;
3. Строго определяется направление зависимостей в соответствии с DIP;
4. Исчезает проблема зависимости от конкретных технических и технологических решений;
5. Бизнес-логика и системная логика отделяются от модулей представления;
6. Появляются правила объединения модулей в компоненты, которые можно переиспользовать в других системах;
7. Появляются правила CQRS, позволяющие увеличить производительность системы.
🚫 Недостатки
1. Очень высокий порог входа в концепции паттерна;
2. Увеличение количества слоев может затруднить понимание работы системы;
3. Большое количество кодовой базы.
Выводы о Гексагональной архитектуре
1. Строго декларируются зоны ответственности, которые инкапсулируются в слоях приложения;
2. Бизнес-логика отделяется от логики системы, что упрощает миграцию кода;
3. Строго определяется направление зависимостей в соответствии с DIP;
4. Исчезает проблема зависимости от конкретных технических и технологических решений;
5. Бизнес-логика и системная логика отделяются от модулей представления;
6. Появляются правила объединения модулей в компоненты, которые можно переиспользовать в других системах;
7. Появляются правила CQRS, позволяющие увеличить производительность системы.
1. Очень высокий порог входа в концепции паттерна;
2. Увеличение количества слоев может затруднить понимание работы системы;
3. Большое количество кодовой базы.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥3
#gex #navi
Первая цепочка постов о Гексагональной архитектуре подошла к концу. Надеюсь, вы получили много полезой информации о том, как работать с рассмотренным паттерном. Чтобы глубже понять Гексагоналку, нам потребуется больше времени, а пока продолжим погружаться в другие интересные темы проектирования архитектуры.
Навигация по постам
1. Что такое Гексагональная архитектура?
2. Что такое слои приложения, и зачем они нужны?
3. Слой доменов Часть 1, Часть 2
4. Порты и Адаптеры
5. Принцип инверсии зависимостей в Гексагональной архитектуре
6. Слой приложения
7. Инфраструктурный слой
8. Инфраструктурный слой. Что в него выделять?
9. Слой представления
10. Разделение на компоненты и слайсы (Feature slicing)
11. Command/Query bus на практике
Первая цепочка постов о Гексагональной архитектуре подошла к концу. Надеюсь, вы получили много полезой информации о том, как работать с рассмотренным паттерном. Чтобы глубже понять Гексагоналку, нам потребуется больше времени, а пока продолжим погружаться в другие интересные темы проектирования архитектуры.
Навигация по постам
1. Что такое Гексагональная архитектура?
2. Что такое слои приложения, и зачем они нужны?
3. Слой доменов Часть 1, Часть 2
4. Порты и Адаптеры
5. Принцип инверсии зависимостей в Гексагональной архитектуре
6. Слой приложения
7. Инфраструктурный слой
8. Инфраструктурный слой. Что в него выделять?
9. Слой представления
10. Разделение на компоненты и слайсы (Feature slicing)
11. Command/Query bus на практике
Telegram
Башня Байткода: заметки об архитектуре ПО
#exp #gex #arch
Я столкнулся с Гексагональной архитектурой не так давно. Однако, этот паттерн проектирования архитектуры приложений настолько сильно захватил мои мысли, что теперь, работая над чужим ПО, я думаю "Какого 🤬🤬🤬 тут нет гексагоналки?!" 😅
❓Что…
Я столкнулся с Гексагональной архитектурой не так давно. Однако, этот паттерн проектирования архитектуры приложений настолько сильно захватил мои мысли, что теперь, работая над чужим ПО, я думаю "Какого 🤬🤬🤬 тут нет гексагоналки?!" 😅
❓Что…
👍5🔥4
#arch #ddd
Проектирование по модели предметной области становится возможным только в том случае, если четко отделен уровень предметной области. В многоуровневой архитектуре таким уровнем является Доменный слой (Domain Layer), который мы ранее рассматривали в Гексагональной архитектуре.
Уровень предметной области отвечает за описание бизнес-логики, рабочие состояния, бизнес-правила.
Именно здесь контролируется и используется текущее состояние прикладной модели, пусть даже технические подробности манипуляций данными делегируются инфраструктуре. Этот уровень является главной, алгоритмической частью программы.
Изолирование доменного слоя от кода интерфейса пользователя, прикладных операций и инфраструктуры позволяет модели развиться до достаточно сложной и в то же время достаточно понятной, чтобы заключить в себе существенные знания о предмете и эффективно их применить.
Проектирование по модели предметной области становится возможным только в том случае, если четко отделен уровень предметной области. В многоуровневой архитектуре таким уровнем является Доменный слой (Domain Layer), который мы ранее рассматривали в Гексагональной архитектуре.
Уровень предметной области отвечает за описание бизнес-логики, рабочие состояния, бизнес-правила.
Именно здесь контролируется и используется текущее состояние прикладной модели, пусть даже технические подробности манипуляций данными делегируются инфраструктуре. Этот уровень является главной, алгоритмической частью программы.
Изолирование доменного слоя от кода интерфейса пользователя, прикладных операций и инфраструктуры позволяет модели развиться до достаточно сложной и в то же время достаточно понятной, чтобы заключить в себе существенные знания о предмете и эффективно их применить.
Telegram
Башня Байткода: заметки об архитектуре ПО
#exp #arch #gex
Слой доменов
❓Из чего состоит слой доменов?
Как я писал ранее, слой состоит из бизнес сущностей и бизнес логики. Бизнес сущность - это ограниченный контекст вашего бизнеса, который подчиняется некоторому набору бизнес правил (бизнес логике).…
Слой доменов
❓Из чего состоит слой доменов?
Как я писал ранее, слой состоит из бизнес сущностей и бизнес логики. Бизнес сущность - это ограниченный контекст вашего бизнеса, который подчиняется некоторому набору бизнес правил (бизнес логике).…
👍4🔥3