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.
