КЛЯТВА
Для защиты и сохранения чести профессии программиста обещаю, что в меру своих возможностей и суждений:
1) я не буду создавать вредоносный код;
2) я буду писать самый лучший код, на который способен. Я не позволю себе намеренно увеличивать количество кода с дефектами в поведении или структуре;
3) для каждой версии я буду предоставлять быстрое, надежное и воспроизводимое доказательство того, что все элементы кода работают должным образом;
4) я буду делать частые небольшие релизы, чтобы не мешать работе других;
5) при каждой возможности я буду бесстрашно и неустанно улучшать свои творения. Я никогда не позволю своему коду деградировать;
6) я приложу все усилия для поддержания своей и чужой продук-тивности на как можно более высоком уровне. Я не буду делать ничего из того, что снижает эту продуктивность;
7) я буду постоянно заботиться о том, чтобы мои коллеги могли подменить меня, а я их;
8) я всегда буду давать честную и точную оценку. Я не буду давать обещания, которые не могу гарантированно выполнить;
9) я буду уважать своих коллег-программистов за их этические принципы, стандарты, дисциплину и навыки. Никакие другие качества или характеристики не будут влиять на мое отношение к коллегам;
10) я никогда не перестану учиться и совершенствовать свои профессиональные навыки.
Для защиты и сохранения чести профессии программиста обещаю, что в меру своих возможностей и суждений:
1) я не буду создавать вредоносный код;
2) я буду писать самый лучший код, на который способен. Я не позволю себе намеренно увеличивать количество кода с дефектами в поведении или структуре;
3) для каждой версии я буду предоставлять быстрое, надежное и воспроизводимое доказательство того, что все элементы кода работают должным образом;
4) я буду делать частые небольшие релизы, чтобы не мешать работе других;
5) при каждой возможности я буду бесстрашно и неустанно улучшать свои творения. Я никогда не позволю своему коду деградировать;
6) я приложу все усилия для поддержания своей и чужой продук-тивности на как можно более высоком уровне. Я не буду делать ничего из того, что снижает эту продуктивность;
7) я буду постоянно заботиться о том, чтобы мои коллеги могли подменить меня, а я их;
8) я всегда буду давать честную и точную оценку. Я не буду давать обещания, которые не могу гарантированно выполнить;
9) я буду уважать своих коллег-программистов за их этические принципы, стандарты, дисциплину и навыки. Никакие другие качества или характеристики не будут влиять на мое отношение к коллегам;
10) я никогда не перестану учиться и совершенствовать свои профессиональные навыки.
🔥11👍4
Башня Байткода pinned «КЛЯТВА Для защиты и сохранения чести профессии программиста обещаю, что в меру своих возможностей и суждений: 1) я не буду создавать вредоносный код; 2) я буду писать самый лучший код, на который способен. Я не позволю себе намеренно увеличивать количество…»
Башня Байткода
КЛЯТВА Для защиты и сохранения чести профессии программиста обещаю, что в меру своих возможностей и суждений: 1) я не буду создавать вредоносный код; 2) я буду писать самый лучший код, на который способен. Я не позволю себе намеренно увеличивать количество…
Всем привет 👋
Собственно, хочется объяснить смысл того, что тут происходит...
Во-первых, я очень долго зрел для идеи завести свой канал о проектировании архитектуры ПО.
Во-вторых, несколько лет работы помогли мне понять, что даже если программист думает о том, как ему проектировать архитектуру, то это не всегда получается хорошо.
В-третьих, мне больше нравится идея канала, а не статей на хабре. Потому что тут я могу выдавать знания сериями и не вываливать на новичков тонны инфы.
Я надеюсь, что эта идея будет очень полезна всем присутствующим. Совсем скоро будет первый пост из цепочки постов про архитектуру ПО. Всем до встречи 🫡
Собственно, хочется объяснить смысл того, что тут происходит...
Во-первых, я очень долго зрел для идеи завести свой канал о проектировании архитектуры ПО.
Во-вторых, несколько лет работы помогли мне понять, что даже если программист думает о том, как ему проектировать архитектуру, то это не всегда получается хорошо.
В-третьих, мне больше нравится идея канала, а не статей на хабре. Потому что тут я могу выдавать знания сериями и не вываливать на новичков тонны инфы.
Я надеюсь, что эта идея будет очень полезна всем присутствующим. Совсем скоро будет первый пост из цепочки постов про архитектуру ПО. Всем до встречи 🫡
👍9🔥5
#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
#arch #note #solid
Направление зависимостей или Принцип инверсии зависимостей
#️⃣ Принцип инверсии зависимостей — The Dependency Inversion Principle или DIP — один из пяти основных принципов объектно‑ориентированного программирования и проектирования (SOLID ), сформулированных Робертом Мартином.
Принцип декларирует, что:
1️⃣ Модули верхних уровней не должны зависеть от модулей нижних уровней, и оба типа модулей должны зависеть от абстракций;
2️⃣ Сами абстракции не должны зависеть от деталей, а вот детали должны зависеть от абстракций.
Направление зависимостей или Принцип инверсии зависимостей
#️⃣ Принцип инверсии зависимостей — The Dependency Inversion Principle или DIP — один из пяти основных принципов объектно‑ориентированного программирования и проектирования (
Принцип декларирует, что:
1️⃣ Модули верхних уровней не должны зависеть от модулей нижних уровней, и оба типа модулей должны зависеть от абстракций;
2️⃣ Сами абстракции не должны зависеть от деталей, а вот детали должны зависеть от абстракций.
👍6🔥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
#note #cbse #arch
Компонентная разработка программного обеспечения | Component-based software engineering (CBSE)
❓ Что такое компонентная разработка?
Компонентно-ориентированное программирование — это передовая парадигма разработки программного обеспечения, которая подчеркивает модульность, повторное использование и разделение задач путем построения сложных систем посредством композиции более мелких независимых компонентов. Эти компоненты, обычно инкапсулированные в отдельные блоки, называемые «модулями», представляют собой автономные, слабосвязанные и допускающие многократное использование объекты, предназначенные для выполнения конкретных задач или выполнения определенных функций в системе.
❓ Когда следует использовать?
1️⃣ Когда компоненты должны быть заменяемыми. Это означает, что компонент должен быть заменен другим, имеющим те же интерфейсы, без нарушения остальной части системы.
2️⃣ Когда компоненты должны быть многоразовыми.
Компонентная разработка программного обеспечения | Component-based software engineering (CBSE)
Компонентно-ориентированное программирование — это передовая парадигма разработки программного обеспечения, которая подчеркивает модульность, повторное использование и разделение задач путем построения сложных систем посредством композиции более мелких независимых компонентов. Эти компоненты, обычно инкапсулированные в отдельные блоки, называемые «модулями», представляют собой автономные, слабосвязанные и допускающие многократное использование объекты, предназначенные для выполнения конкретных задач или выполнения определенных функций в системе.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥4
#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
#arch #cqs #cqrs #note
Command Query Responsibility Segregation (CQRS)
❓ Что такое CQS (Разделение команд и запросов / Command-Query separation)
Первым упоминанием CQS считается книга B. Meyer Object Oriented Software Construction. Основная идея CQS заключается в том, что в объекте методы могут быть двух типов:
1️⃣ Команды (Commands) - методы, которые изменяют состояние объекта, не возвращая значение;
2️⃣ Запросы (Queries) - методы, которые возвращают результат, не изменяя состояние объекта.
❓ Что такое CQRS (Разделение ответственности на Команды и Запросы / Command Query Responsibility Segregation)
CQRS означает разделение ответственности за команду и запрос - это шаблон, который разделяет операции чтения и обновления для хранилища данных. Внедрив в приложение CQRS, можно максимально увеличить его производительность, масштабируемость и защиту.
Преимущества CQRS включают:
1️⃣ Независимое масштабирование. CQRS позволяет раздельно масштабировать рабочие нагрузки чтения и записи, снижая риск конфликтов блокировки.
2️⃣ Оптимизация схем данных. Для процессов чтения можно применить схему, оптимизированную для запросов, а для процессов записи — другую схему, оптимизированную для обновлений.
3️⃣ Четкое разделение зон ответственности. Разделение процессов чтения и записи позволяет получить более гибкие и простые в обслуживании модули. Бо́льшая часть сложной бизнес-логики переместится в модель записи. Это в некоторой степени упростит модель чтения.
4️⃣ Более простые запросы. Сохраняя в базе данных для чтения материализованное представление данных, вы предотвратите использование приложением сложных соединений в запросах.
https://cqrs.nu
Command Query Responsibility Segregation (CQRS)
Первым упоминанием CQS считается книга B. Meyer Object Oriented Software Construction. Основная идея CQS заключается в том, что в объекте методы могут быть двух типов:
CQRS означает разделение ответственности за команду и запрос - это шаблон, который разделяет операции чтения и обновления для хранилища данных. Внедрив в приложение CQRS, можно максимально увеличить его производительность, масштабируемость и защиту.
Преимущества CQRS включают:
https://cqrs.nu
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍4
#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