Назовите и опишите три основных принципа DDD (Domain-Driven Design).

Ответ

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


  1. Фокус на основной доменной логике. Главный приоритет — это бизнес-логика и бизнес-процессы. Архитектура приложения строится вокруг доменной модели, а не технических аспектов (базы данных, фреймворки). Доменные объекты должны точно отражать сущности и правила реального мира.



  2. Разделение на Ограниченные Контексты (Bounded Contexts). Сложная доменная модель разбивается на несколько независимых, более мелких моделей — ограниченных контекстов. У каждого контекста есть свои четкие границы, своя модель и своя терминология. Это позволяет избежать создания единой, громоздкой и противоречивой модели для всей системы.



  3. Создание Единого Языка (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
}