Михаил Омельченко | AI&IT
5.28K subscribers
976 photos
192 videos
4 files
713 links
ИИ в работе, разработка, веб. Агенты, автоматизация, инструменты. Веду я, Михаил Омельченко, внешний технический директор по ИИ и ментор.

Менторство, реклама и сотрудничество: djwoms.ru
Telegram - @DJWOMS
YouTube - https://www.youtube.com/c/DjangoSchool
Download Telegram
Луковая Архитектура

Привет! Начинаю серию постов об архитектуре.
Сегодня поговорим о луковой архитектуре (Onion или Hexagonal).

🤔 Что такое Луковая Архитектура?

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

😎 Слоистая Архитектура

Мы разбиваем код на несколько слоев:

✅ Domain layer (Слой Домена): Это место, где живет бизнес-логика приложения. Здесь определяются все правила и операции, с которыми работает бизнес. Остальные слои предназначены для того, чтобы защитить бизнес-логику от внешних воздействий.

✅ Application layer (Слой Приложения): Этот слой связывает доменную модель с инфраструктурными службами. Здесь находятся классы, которые обрабатывают запросы и команды, связанные с бизнес-логикой.

✅ Infrastructure layer (Инфраструктурный слой): Этот слой содержит всю инфраструктуру, необходимую для взаимодействия приложения с внешним миром. Это файловая система, сеть, базы данных, фреймворки и так далее. Важно помнить, что здесь не должно быть никакой бизнес-логики.

🧐 Что это дает нам?

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

Зачем это нужно?

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

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

#djangoschool #IT #Архитектура
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥2❤1🥰1
(DDD) Domain-driven design (Предметно-ориентированное проектирование) — это набор принципов и схем, направленных на создание оптимальных систем объектов.

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

Предметно-ориентированное проектирование не является какой-либо конкретной технологией или методологией.

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

#djangoschool #ddd
👍12
Стратегическое проектирование

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

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

Для реализации этого требуется объединение усилий как разработчиков, так и экспертов в предметной области. Создание дружной и сплоченной команды позволяет получить большое количество преимуществ для бизнеса. Обмен знаниями между членами команды снижает шансы появления «тайного знания» о модели, достигается консенсус между экспертами предметной области в отношении различных понятий и терминологии, разрабатывается более точное определение и описание самого бизнеса.

Ubiquitous Language (Единый язык)

Для того чтобы уравнять разработчиков и экспертов предметной области, чтобы было гораздо проще обмениваться полезными знаниями о предметной области, подход DDD предлагает применять общий набор терминов, понятий и фраз, который будет использоваться в общении между членами команды, и который позже отразится в исходном коде программы.

Этот коллективный язык терминов называется - единый язык (Ubiquitous Language).
Это один из основных и самых важных шаблонов предметного-ориентированного проектирования.

Это не бизнес жаргон, навязанный разработчикам, а настоящий язык, созданный целостной командой – экспертами в предметной области, разработчиками, бизнес-аналитиками и всеми, кто вовлечен в создание системы. Роль в команде не столь существенна, поскольку каждый член команды использует для описания проекта единый язык.

#djangoschool #ddd
👍4
Михаил Омельченко | AI&IT
Стратегическое проектирование Проектирование на высоком уровне абстракции, без технических нюансов, осуществляемое всей командой - как менеджерами/заказчиками, так и техническими специалистами. Основной целью применения DDD является получение высококачественной…
Выводы:

1. Стратегическое проектирование включает высокоуровневое проектирование на абстрактном уровне, с участием всей команды.

2. Основная цель DDD - создание высококачественной модели ПО, отражающей бизнес-цели.

3. Единый язык (Ubiquitous Language) - это коллективный набор терминов, понятий и фраз, используемых всей командой для общения и в исходном коде программы.

4. Единый язык помогает выровнять знания и облегчает обмен полезной информацией о предметной области.

5. Единый язык создается командой, включая экспертов предметной области и разработчиков, полноценный язык общения всей команды.

Общайтесь с заказчиком, погружайтесь в тему бизнеса. Без этого будет сложно.

#djangoschool #ddd
👍3🔥3
Bounded Context (Ограниченный контекст)

Существует некая граница, в пределах которой понятия единого языка имеют вполне конкретное контекстное значение - ограниченный контекст (Bounded context).

Это второе по значимости свойство DDD после единого языка. Оба эти понятия взаимосвязаны и не могут существовать друг без друга.

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

Важно помнить, что в одной области или команде есть только один язык, который они понимают. Этот язык используется только внутри этой области или команды.

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

#djangoschool #ddd
👍3
Предметная область (Domain)

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

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

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

#djangoschool #ddd
👍5
Смысловое ядро (Core domain)

Очень важный аспект подхода DDD.
Смысловое ядро – это подобласть, имеющая первостепенное значение для организации. Со стратегической точки зрения бизнес должен выделяться своим смысловым ядром.

Большинство DDD проектов сосредоточены именно на смысловом ядре. Лучшие разработчики и эксперты должны быть задействованы именно в этой подобласти. Большинство инвестиций должны быть направлены именно сюда для достижения преимущества для бизнеса и получения наибольшей прибыли.

#djangoschool #ddd
👍3
Пространство задач и пространство решений

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

Пространство задач – части предметной области, которые необходимы, чтобы создать смысловое ядро. Это комбинация смыслового ядра и подобластей, которое это ядро должно использовать.

Пространство решений – один или несколько ограниченных контекстов, набор конкретных моделей программного обеспечения.

Разработанный ограниченный контекст – это конкретное решение, представление реализации.

Идеальным вариантом является обеспечение однозначного соответствия между подобластями и ограниченными контекстами. Таким образом, объединяются пространство задач и пространство решений, выделяются модели предметной области в четко определенные области в зависимости от поставленных целей.

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

#djangoschool #ddd
👍5
👀 Тактическое проектирование

Использование технических, структурных паттернов в вашем коде, для отражения результатов стратегического проектирования непосредственно в коде приложения.

😎 Entity - сущность

Если какое-то понятие предметной области является уникальным и отличным от всех других объектов в системе, то для его моделирования используется сущность (entity).

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

Для этого используются уникальные идентификаторы, создание которых необходимо продумать в первую очередь при проектировании сущности.

🤔 Value Object

Небольшой простой объект, такой как деньги или диапазон дат, равенство которых не основано на идентичности.

Если для объекта не важна индивидуальность, если он полностью определяется своими атрибутами, его следует считать объектом-значением.

Чтобы выяснить, является ли какое-то понятие значением, необходимо выяснить, обладает ли оно большинством из следующих характеристик:

✅ Оно измеряет, оценивает или описывает объект предметной области;

✅ Должен быть неизменяем (immutable): при попытке обновления значения свойств мы должны создать и вернуть новый экземпляр VO;

✅ Оно моделирует нечто концептуально целостное, объединяя связанные атрибуты в одно целое;

✅ При изменении способа измерения или описания его можно полностью заменить;

✅ Его можно сравнивать с другими объектами с помощью отношения равенства значений. Два VO считаются одинаковыми тогда и только тогда, когда все поля VO равны;

✅ Оно предоставляет связанным с ним объектам функцию без побочных эффектов;

✅ Состоит только из других VO и примитивов(не может содержать сущность или сервис);

✅ Должен содержать в себе логику самовалидации: VO не может быть не валидный, исключение должно выкидываться прямо из метода VO (конструктор или клон).

#djangoschool #ddd
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍2
🧐 Domain Service

Используя единый язык, существительные этого языка отражаются в объектах, а глаголы отражаются в действиях этих объектов.

Очень часто существуют глаголы или какие-то действия, которые нельзя отнести к какой-то сущности или к какому-то объекту-значению. Если существует такая операция в предметной области, ее называют Domain Service (она отличается от прикладной службы, которая является клиентом).

Есть три характеристики служб:

✅ Операция, выполняемая службой, относится к концепции предметной области, которая не принадлежит ни одной из существующих сущностей;

✅ Операция выполняется над различными объектами модели предметной области;

✅ Операция не имеет состояния.


🤔 Domain Event

Событие — это то, что произошло в прошлом. Логически, событие предметной области — это то, что произошло в конкретной предметной области, и то, о чем должны быть в курсе и на что должны реагировать другие части той же предметной области.
Должны быть иммутабельными (так как нельзя менять прошлое). Название должно описывать случившиеся в прошлом событие.

😳 Module

Модули внутри модели являются именованными контейнерами для некоторой группы объектов предметной области, тесно связанных друг с другом.

Их цель – ослабление связей между классами, которые находятся в различных модулях. Так как модули в подходе DDD – это неформальные или обобщенные разделы, их следует правильно называть. Выбор их имен является функцией единого языка.

#djangoschool #ddd
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
👉 Factory

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

Проблема в том, что иногда задачу создания сложных вещей передают клиенту, и тогда клиенту нужно знать, как устроен объект внутри. Это нарушает инкапсуляцию и привязывает клиента к определенной реализации (таким образом, при изменении объекта придется менять и реализацию клиента).

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

👉 Aggregate

Aggregate - это группа связанных объектов сущностей или значений. То есть эти объекты рассматриваются как единое целое с точки зрения изменения данных. У каждого агрегата есть корень (Aggregate Root) и граница, внутри которой всегда должны быть удовлетворены инварианты.

Для взаимодействия с агрегатом используется только его корень, который имеет уникальный идентификатор. Внутренние объекты агрегата имеют только локальную идентичность и могут ссылаться друг на друга. Внешние объекты могут хранить только ссылку на корень, а не на внутренние объекты.

👉 Repository

Репозиторий - это место, где безопасно хранятся элементы. В DDD репозиторий используется для хранения агрегатов. Когда вы помещаете агрегат в репозиторий и затем извлекаете его оттуда, вы получаете целостный объект. Если агрегат изменяется, изменения сохраняются. Если агрегат удаляется, его уже нельзя извлечь.

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

Есть два типа репозиториев:

❇️ Которые имитируют коллекции

❇️ Которые обеспечивают постоянное хранение

#djangoschool #ddd
🔥5👍1
Тест подсветки синтаксиса в телеграм

 
from starlette.status import HTTP_400_BAD_REQUEST, HTTP_204_NO_CONTENT
from fastapi import Depends, HTTPException, APIRouter
👍7❤5🤔4
У всех отображается в виде нормального кода?

Это получается теперь будет более-менее читабельный код?
👍24🍾1
Потихоньку готовлю доклад на тему "Чистой архитектуры" и DDD в python проектах.

Если хватит сил, то покажу пример на паре фреймворков.

Но для начала, бизнес логика никак не должна зависеть от инфраструктуры, фреймворков и БД.
🔥20