Что представляет собой Агрегат в контексте DDD?

Ответ

Агрегат в Domain-Driven Design (DDD) — это кластер связанных объектов домена, которые можно рассматривать как единое целое. Главная задача агрегата — обеспечивать целостность данных и соблюдение бизнес-правил (инвариантов) внутри своей транзакционной границы.

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

Ключевые принципы:

  1. Защита инвариантов: Корень агрегата отвечает за то, чтобы любое изменение не нарушало бизнес-правила. Например, нельзя добавить в заказ товар, которого нет на складе.
  2. Транзакционная целостность: Изменения в агрегате сохраняются атомарно. Либо все изменения внутри него успешны, либо ни одно из них не применяется.
  3. Ссылки по идентификатору: Внешние объекты могут ссылаться только на корень агрегата. Прямые ссылки на внутренние объекты агрегата запрещены, чтобы не нарушать его целостность.

Пример на Go:

// Order является Корнем Агрегата
type Order struct {
    ID         uuid.UUID
    CustomerID uuid.UUID
    Items      []OrderItem
    Status     string
}

// OrderItem - часть агрегата, управляемая через Order
type OrderItem struct {
    ProductID uuid.UUID
    Price     float64
    Quantity  int
}

// Метод на корне агрегата для добавления элемента.
// Он контролирует соблюдение бизнес-правил.
func (o *Order) AddItem(item OrderItem) error {
    if o.Status == "Completed" {
        return errors.New("нельзя добавить товар в завершенный заказ")
    }
    // Другие проверки, например, на максимальное количество товаров
    o.Items = append(o.Items, item)
    return nil
}