Перейти к основному содержимому

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 и т.д.)

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