Что такое DDD и ключевые принципы

Что такое DDD и ключевые принципы

Всем привет! Сегодня я бы хотел поговорить о Domain Driven Design. Данный подход имеет как своих ярых сторонников, так и не менее яростных противников. Появившийся на страницах одной книги, он тут же завоевал сердца и умы многих разработчиков.

Что такое DDD

Domain-Driven Design (DDD) — это подход к разработке ПО, впервые предоженный Эриком Эвансом в книге "Domain-Driven Design: Tackling Complexity in the Heart of Software (Eric Evans: "Domain-Driven Design: Tackling Complexity in the Heart of Software). В данном подходе делается акцент на моделировании бизнес-домена. Основная идея - создание программной модели, которая отражает бизнес процессы и правила предметной области.

Цель данного подхода

  • Фокус на бизнес ценности: При разработке програмных систем мы уводим фокус с технологий и фреймворков и моделируем необходимые бизнес процессы.
  • Упрощение сложности: Использование единого языка между всеми участниками процесса разработки должно уменьшить количество ошибок. Более того, выработанный единый язык увеличивает взаимопонимание в команде - все находятся на одной волне, а это в свою очередь увеличивает скорость разработки
  • Отражение реального домена: В идеальном случае описание бизнес процессов, их правил, проблем и целей бизнеса производится непосредственно в коде. Это делает разработку более прозрачной для всех участников процесса разработки.
  • Гибкость и адаптивность: Отделение бизнес логики от технологий и фреймворков позволяет быстро адаптироваться к изменениям требований заказчика и внедрять новые фичи без значительных рисков.

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

  • Domain - предметная область, совокупность проблем и целей бизнеса. Предметная область выраженная в коде называется Domain Model. Здесь происходит отражение бизнес логики и моделирование правил и ограничений.
  • Ubiquitous Language - самый важный и ключевой, на мой взгляд, принцип. Единый язык и единая терминология, который применяется повсеместно - в коде, документах, обсуждениях.
  • Bounded Context - Определенная область в системе, в рамках которой существует единый язык (Ubiquitous language). Вся система разбивается на ограниченные области (контексты), которые имеют четкие границы между собой.
  • Aggregate - это группа объектов, обрабатывающиеся как единое целое, объединенных общими характеристиками и поведением. Если говорить в терминах транзакционности, то в рамках одной транзакции существует один аггрегат. Обычно управление частями составных объектов производится через единый корень - Aggregate Root, который является единой точкой входа и содержит в себе бизнес правила. Аггрегат - входная точка для взаимодействия, в рамках которого существуют границы согласованности данных. Также он является единицей атомарности и управляет своим внутренним состоянием.
  • Domain Events - события, которые возникают в доменной области и имеют значение для бизнеса. Первоначально в книге Эрика Эванса они не были описаны и появились гораздо позже. Стоит понимать, что это не архитектурный паттерн, и не обязывают реализовывать их явно в асинхронном или синхронном виде. Domain Events - это отражение бизнес событий, которые происходят с аггрегатами и сущностями. С помощью них происходит интеграция контекстов - информирование других компонентов системы о значимых события.

Основные преимущества использования подхода DDD

  • Повышение качества и читаемости кода благодаря четкому разделению зон ответственности.
  • Уменьшение сложности написания тестов на бизнес логику.
  • Улучшенная коммуникация между командой разработки и бизнесом.
  • Уменьшение риска ошибок и несогласованности между частями системы.
  • Упрощение поддержки и расширения функционала.

DDD - это прежде всего философия построения сложных систем. Этот подход особенно эффективен в крупных проектах со сложной логикой, плотно связанной с бизнес-процессами. Конечно, при всех своих преимуществах DDD имеет и множество недостатков (о них мы поговорим в следующих постах). Тем не менее, данный подход успешно применяется во многих программных системах. А что вы думаете по поводу DDD? Применяли ли в своей работе данный подход?

Подписывайся на мой канал :) telegram

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