Ответ
DDD (Domain-Driven Design) — это подход к разработке ПО, который фокусируется на предметной области. Ключевые принципы:
Фокус на основной доменной логике. Главный приоритет — это бизнес-логика и бизнес-процессы. Архитектура приложения строится вокруг доменной модели, а не технических аспектов (базы данных, фреймворки). Доменные объекты должны точно отражать сущности и правила реального мира.
Разделение на Ограниченные Контексты (Bounded Contexts). Сложная доменная модель разбивается на несколько независимых, более мелких моделей — ограниченных контекстов. У каждого контекста есть свои четкие границы, своя модель и своя терминология. Это позволяет избежать создания единой, громоздкой и противоречивой модели для всей системы.
Создание Единого Языка (Ubiquitous Language). Это общий язык, который используется всеми участниками проекта: разработчиками, бизнес-аналитиками, экспертами предметной области. Термины из этого языка используются как в обсуждениях, так и непосредственно в коде (названия классов, методов, переменных). Это устраняет недопонимание и делает код самодокументируемым.
Пример на Go:
// Order — это Агрегат (Aggregate Root), ключевая сущность в нашем домене.
// Он гарантирует целостность всех своих внутренних частей (Items).
type Order struct {
ID uuid.UUID
Items []Item
Status OrderStatus
}
// MarkAsPaid — метод, инкапсулирующий бизнес-правило.
// Логика изменения статуса находится внутри самой сущности, а не во внешних сервисах.
func (o *Order) MarkAsPaid() error {
if o.Status != OrderStatusPending {
return errors.New("заказ может быть оплачен только из статуса 'в ожидании'")
}
o.Status = OrderStatusPaid
// Здесь могут быть и другие доменные события, например, OrderPaidEvent
return nil
}