DDD
Что такое DDD
DDD - Domain Driven Design подход к разработке ориентированный на тесное сотрудничество бизнеса и разработчиков.
Что такое EDA
- архитектурный подход, где компоненты системы взаимодействуют через асинхронные события. Вместо прямых вызовов между сервисами, изменения состояния или бизнес-действия генерируют события, на которые могут реагировать другие части системы.
Оба подхода позволяют реализовать сложные бизнес-правила без жёстких транзакционных границ. Например, агрегаты (DDD) гарантируют целостность данных в своих границах, а события (EDA) обеспечивают реактивность и слабую связность между компонентами.
Слои
- Domain layer - слой, отвечающий на вопросы: что делает бизнес; как применяются бизнес правила;
- Application layer - *
- Infrastructure layer - *
Строительные блоки
Bounded Context
Что такое Bounded Context - граница, внутри которой действует определённые модель (агрегаты, сервисы, правила) и Ubiquitous Language.
Как описывать:
Удобнее всего описывать все контексты в Context Map
:
Название | Ответственность | Входящие контракты | Исходящие контракты | Владелец |
---|---|---|---|---|
Какое название более кратко и четко отображает бизнес-действия? | Какие бизнес-действия выполняет этот контекст? | На какие ивенты нужно реагировать? | На какие ивенты, генерируемые этим контекстом, должны реагировать другие контексты? | Какая команда отвечает за целосность и эволюцию модели? |
Пример:
Название | Ответственность | Входящие контракты | Исходящие контракты | Владелец |
---|---|---|---|---|
OrderTracking | Уведомление пользователя об изменении состояния заказа. | OrderCreated , OrderStatusUpdated | - | Команда продакта |
Ubiquitous language
Что такое Ubiquitous Language - термины, определенные в рамках конкретного Bounded Context. В разных контекстах один и тот же термин может иметь разные значения.
Как описывать: Лучше определять Ubiquitous Language через описание контекстов - что происходит и при каких условиях.
Пример: Когда изменяется статус заказа, пользователь получает уведомление.
Aggregate
Что такое Aggregate - это кластер сущностей (entities) и объектов значений (value objects), который должен инкапсулировать бизнес-правила и гарантировать целостность данных в пределах границы одного агрегата. Корнем агрегата выступает Entity.
Entity
Что такое Entity - это изменяемый объект с уникальным идентификатором, который может изменять своё состояние, сохраняя целостность.
Как описывать: Структура - Поле 1 - Поле 2 - ... *Инварианты - ...
Пример:
Order (Entity)
- orderId (UUID)
- customerId (UUID)
- items (List VO: itemId, price, amount)
- totalPrice (float)
- orderStatus (OrderStatus)
+ описание VO, которые относятся к этому Entity
Инварианты
- totalAmount должен быть больше 0.
- orderStatus может быть обновлен только на старший выбор из OrderStatus
Values Object
Что такое Value Object - это отдельный класс, который локализирует логику проверки и структурирования сложного типа.
Как описывать: Структура - Поле 1 - Поле 2 - ...
Пример: orderItem (VO) - itemId (UUID) - price (float) - amount (int)
Domain service
Что такое Domain service - это сервис, реализующий бизнес-логику, которая не принадлежит конкретному Entity или Value Object.
Как описывать:
Свойство | Описание |
---|---|
Назначение | В чем назначение этого сервиса? |
Агрегаты | Какими объектами оперирует этот сервис? |
Инварианты | Какие условия должны всегда выполняться по бизнес логике? |
Входящие контракты | На какие ивенты реагирует этот сервис? |
Исходящие контракты | На какие ивенты, генерируемые этим сервисом, должны реагировать? |
Event
Что такое Event - это сообщения, которые генерируются системой или ее компонентами при возникновении определенных условий или изменений состояния. События могут быть использованы для коммуникации между различными частями системы. Ивенты бывают разные - внутренние и внешние. На внешние ивенты обязательно должны быть читатели, или это уже не внешний.
Как описывать:
Структура (Информация, которую несет с собой ивент)
- Поле 1
- Поле 2
- ...
ACL (Для внешних событий - событий, которыми обмениваются разные части системы)
- Владелец: Кто публикует событие (домен | контекст)
- Потребители: Кто реагирует на событие
- Способ интеграции: Через что ведется обещние (kafka, rabbitmq и т.д.)
Ошибки и инварианты Те условия по бизнес логике, которые должны быть проверены, и как реагировать на их не выполнение.