Используя единый язык, существительные этого языка отражаются в объектах, а глаголы отражаются в действиях этих объектов.
Очень часто существуют глаголы или какие-то действия, которые нельзя отнести к какой-то сущности или к какому-то объекту-значению. Если существует такая операция в предметной области, ее называют 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
Иногда у нас есть сложные вещи, которые не могут создаваться сами по себе.
Например, двигатель автомобиля может собираться механиком или роботом, но никак не сам по себе.
Проблема в том, что иногда задачу создания сложных вещей передают клиенту, и тогда клиенту нужно знать, как устроен объект внутри. Это нарушает инкапсуляцию и привязывает клиента к определенной реализации (таким образом, при изменении объекта придется менять и реализацию клиента).
Чтобы избежать этих проблем, мы используем фабрики. Фабрика - это часть программы, которая создает другие объекты. Таким образом, создание сложных вещей происходит отдельно, без вмешательства клиента.
👉 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
Потихоньку готовлю доклад на тему "Чистой архитектуры" и DDD в python проектах.
Если хватит сил, то покажу пример на паре фреймворков.
Но для начала, бизнес логика никак не должна зависеть от инфраструктуры, фреймворков и БД.
Если хватит сил, то покажу пример на паре фреймворков.
Но для начала, бизнес логика никак не должна зависеть от инфраструктуры, фреймворков и БД.
🔥20
С чего вы обычно начинаете новый проект?
Anonymous Poll
24%
С проектирования БД
6%
Со структуры папок в проекте
4%
С выбора инструментов
44%
С понимания бизнес задачи
23%
Херак-херак и в прод
За что вы обычно топите?
Anonymous Poll
19%
Монолит наше всё
41%
Микросервисы нужно юзать
29%
Модульный монолит, иначе никак
3%
Я фронтендер мне не важно
8%
Ваш вариант в комментариях
Заметил в последнее время много роликов, и докладов на тему чистой архитектуры и ddd в python проектах.
Видимо пришло время.
Хештег #хватитписатьговно
Видимо пришло время.
Хештег #хватитписатьговно
🔥28
Объяснение сложных систем, используя наглядные изображения и простые термины.
👉 Протоколы связи
👉 CI/CD
👉 Архитектурные шаблоны
👉 База данных
👉 Кэш
👉 Микросервисная архитектура
👉 Платежные системы
👉 DevOps
👉 Git
👉 Облачные сервисы
👉 Инструменты повышения производительности разработчиков
👉 Linux
👉 Безопасность
👉 Практические примеры из реальной жизни
https://github.com/ByteByteGoHq/system-design-101
👉 Протоколы связи
👉 CI/CD
👉 Архитектурные шаблоны
👉 База данных
👉 Кэш
👉 Микросервисная архитектура
👉 Платежные системы
👉 DevOps
👉 Git
👉 Облачные сервисы
👉 Инструменты повышения производительности разработчиков
👉 Linux
👉 Безопасность
👉 Практические примеры из реальной жизни
https://github.com/ByteByteGoHq/system-design-101
🔥22
Liquibase — это независимая от базы данных библиотека с открытым исходным кодом для отслеживания, управления и применения изменений схемы базы данных.
В качестве описания структуры и изменений базы данных используется: SQL, XML, YAML и JSON форматы.
Пришлось использовать вместо alembic.
Ссылка
В качестве описания структуры и изменений базы данных используется: SQL, XML, YAML и JSON форматы.
Пришлось использовать вместо alembic.
Ссылка
👍8👏1