Что такое Domain-Driven Design (DDD)?

«Что такое Domain-Driven Design (DDD)?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Ключевые концепции DDD:

  • Домен (Domain) — основная бизнес-проблема, которую решает система.
  • Модель предметной области (Domain Model) — абстракция, отражающая ключевые бизнес-правила, процессы и сущности.
  • Ограниченный контекст (Bounded Context) — четко определенная граница, внутри которой модель домена имеет конкретное, непротиворечивое значение. Например, сущность Customer может иметь разные атрибуты и поведение в контекстах "Продажи" и "Техподдержка".
  • Универсальный язык (Ubiquitous Language) — общий язык для общения между разработчиками и экспертами предметной области, используемый в коде и документации.

Основные строительные блоки модели:

  1. Сущность (Entity) — объект, имеющий уникальный идентификатор, который отличает его от других объектов, даже если их атрибуты совпадают (например, User с полем id).
  2. Объект-значение (Value Object) — объект, не имеющий идентификатора; определяется исключительно своими атрибутами (например, Money с полями amount и currency). Два Value Object считаются равными, если равны все их поля.
  3. Агрегат (Aggregate) — кластер связанных сущностей и объектов-значений, рассматриваемых как единое целое. Имеет корень (Aggregate Root), через который происходит все взаимодействие.

Пример на Java:

// Value Object (неизменяемый, определяется атрибутами)
public record Address(String street, String city, String postalCode) {}

// Entity (имеет идентификатор)
public class Customer {
    private CustomerId id; // Value Object для ID
    private Address address;
    private String name;
    // Бизнес-методы, инварианты...
}

DDD помогает создавать гибкие, поддерживаемые и тесно связанные с бизнес-требованиями системы.