Когда DDD превращается в спагетти на стероидах: типичные ошибки в Aggregates и Entities

Когда DDD превращается в спагетти на стероидах: типичные ошибки в Aggregates и Entities

Domain-Driven Design (DDD) — мощный подход к проектированию сложных систем, который обещает порядок в сложных бизнес процессах, однако он также скрывает ряд ловушек, связанных с проектированием агрегатов (Aggregates), сущностей (Entities). Без должного внимания к процессу легко допустить ошибки, способные привести к спагетти коду на стероидах. Рассмотрим основные типы распространенных ошибок формирования агрегатов и сущностей.

🧨Основные ошибки проектирования

Слишком большие агрегаты ("God Objects")

Часто встречается ситуация, когда один Aggregate содержит слишком много логики и объектов, это приводит к:

  • Повышенной сложности поддержки и внесения изменений в структуру системы.
  • Нарушению принципа единственной ответственности (Single Responsibility Principle, SRP).
  • Конфликтам при параллельных изменениях.
  • Падению производительности (тяжёлые операции чтения/записи)

Симптомы:

  • Агрегат редко загружается целиком, обычно нужны только его части.
  • Изменение даже небольшой части агрегата требует тщательного анализа всех последствий.
  • Частые deadlock’и или оптимистичные блокировки в БД.

Объединение независимых объектов в единый агрегат

В агрегат включаются сущности, фактически не зависимые друг от друга.

Симптомы:

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

Неправильные границы агрегатов

Граница агрегата определяет единицу изменения данных. Когда граница определена некорректно, возникает риск потери контроля над целостностью данных. Это приводит к следущим последствиям:

  • Частичные обновления – система остается в несогласованном состоянии.
  • Сложные компенсирующие операции – приходится вручную откатывать изменения.
  • Растет число запросов между агрегатами.

Симптомы:

  • Увеличивается взаимозависимость между различными агрегатами.
  • Сложность с обеспечением согласованности данных в рамках отдельных транзакций.
  • Много "внешних" проверок перед сохранением.
  • Часто используются JOIN между таблицами разных агрегатов в прикладном коде.

Отсутствие бизнес-логики при создании сущностей

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

  • Существованию объектов в недопустимых вариациях и состояниях.
  • Дублированию проверок – валидация повторяется в разных слоях.

Симптомы:

  • Бизнес логика вынесена наружу, не встроена непосредственно в сам объект.
  • Отсутствует очевидная связь между поведением объекта и внешними функциями.
  • Много сеттеров (setXXX()), а не методов с осмысленными именами (completeOrder()).

✅ Как избежать перечисленных ошибок?

Чтобы правильно спроектировать Aggregates и Entities, рекомендуется следовать нескольким важным принципам:

  • Совместно с представителями бизнеса формулировать требования и выделять ключевые концепции предметной области.
  • Применять Ubiquitous Language. Определить чёткий словарь терминов и использовать его всеми участниками команды, для обеспечения единообразия в понимании ключевых понятий.
  • Контролировать границы транзакций. Грамотно организованные агрегаты содержат ровно столько данных, сколько нужно для поддержания целостного состояния.
  • Снижать уровень зависимость. Минимизировать количество ссылок и отношений между разными частями приложения.
  • Соблюдать принцип единой отвественности (SRP). Каждая сущность должна отвечать строго за ограниченный круг задач.

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

Мой канал в telegram

Начать дискуссию