Открыть сервисСервис

Domain-driven design

Domain-driven design (DDD, предметно-ориентированное проектирование) — подход к разработке программного обеспечения, при котором основное внимание уделяется моделированию бизнес-домена и его языку, а программная архитектура строится вокруг этой модели. Подход предложен Эриком Эвансом в 2003 году и получил развитие в работах Вонна Вернона, Мартина Фаулера и других авторов.

История

Термин «Domain-Driven Design» ввёл Эрик Эванс (Eric Evans) в одноимённой книге, опубликованной издательством Addison-Wesley в 2003 году. В ней он сформулировал принцип, согласно которому сложность программных систем должна управляться через создание богатой доменной модели, а не через технические абстракции. Книга Эванса стала одним из ключевых текстов по архитектуре ПО и была переведена на русский язык.

В 2010-х годах подход получил второе дыхание в связи с ростом популярности микросервисной архитектуры: границы доменов естественным образом легли в основу границ микросервисов. В 2015 году Вонн Вернон (Vaughn Vernon) опубликовал «Implementing Domain-Driven Design», посвящённый практическим аспектам внедрения DDD. В 2022 году вышла книга Эрика Эванса и Ричарда Пэйтона «Domain-Driven Design: The Core», уточняющая базовые концепции.

Основные понятия

Стратегический дизайн

Стратегический дизайн описывает крупномасштабные структуры системы:

  • Границы контекстов (bounded contexts) — автономные области модели, у каждой из которых есть собственная модель и язык. Один и тот же термин (например, «заказ») может означать разные вещи в разных контекстах.
  • Контекстная карта (context map) — документ, описывающий отношения между контекстами: «антикоррупционный слой», «общий ядро-сервис», «партнёрство» и другие паттерны интеграции.
  • Общий язык (ubiquitous language) — единый словарь, используемый разработчиками и экспертами домена без переводов. Язык кода должен совпадать с языком модели.

Тактический дизайн

Тактический дизайн описывает строение модели внутри одного контекста:

  • Сущность (Entity) — объект с идентичностью, сохраняемой во времени.
  • Значимый объект (Value Object) — объект, определяемый только своими атрибутами, не имеющий идентичности (например, «адрес» или «деньги»).
  • Агрегат (Aggregate) — кластер сущностей и значимых объектов с единым корнем (aggregate root), через который проходит весь доступ.
  • Репозиторий (Repository) — механизм доступа к агрегатам, скрывающий детали хранения.
  • Сервис домена (Domain Service) — операция, не принадлежащая ни одной сущности.
  • Фабрика (Factory) — механизм создания сложных агрегатов в корректном состоянии.

Архитектурные стили

С DDD связано несколько архитектурных стилей:

СтильАвторКлючевая идея
Слоистая архитектураЭрик ЭвансРазделение на доменный, прикладной и инфраструктурный слои
Шестиугольная (Ports and Adapters)Алехсандро МартиналиДомен в центре, инфраструктура — снаружи через порты и адаптеры
CQRSГрег ЯнгРазделение команд и запросов на разные модели
Event SourcingГрег ЯнгХранение состояния как последовательности событий

Применение

DDD широко используется в финансовых системах, страховых платформах, логистике и электронной коммерции — областях со сложной бизнес-логикой. В российской практике подход применяется при разработке банковских и учётных систем, где важна точная модель предметной области. Микросервисные платформы используют границы контекстов как основу для декомпозиции системы.

Критика

Критики DDD указывают на высокую стоимость внедрения: обучение команды, построение доменной модели и поддержание общего языка требуют постоянного участия экспертов домена. Подход считается избыточным для простых CRUD-приложений, где доменная логика минимальна. Также отмечается субъективность границ контекстов — их выделение во многом зависит от опыта проектировщика.

Источники

  • Evans E. Domain-Driven Design: Tackling Complexity in the Heart of Software. — Addison-Wesley, 2003.
  • Vernon V. Implementing Domain-Driven Design. — Addison-Wesley, 2013.
  • Fowler M. Patterns of Enterprise Application Architecture. — Addison-Wesley, 2002.
  • Evans E., Peyton R. Domain-Driven Design: The Core. — Addison-Wesley, 2022.
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru