Что такое «единый язык» (Ubiquitous Language) в Domain-Driven Design (DDD)?

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

Ответ

Ubiquitous Language — это строго определённый набор терминов, общий для всех участников проекта (разработчиков, экспертов предметной области, аналитиков), который используется как в обсуждениях, так и в самом коде. Его цель — устранить неоднозначности и потери при переводе бизнес-требований в программную реализацию.

Как это работает на практике:

  • В коде: Имена классов, методов, переменных и модулей напрямую отражают термины предметной области.

    // Вместо общего CustomerService с методом process()
    public class ShoppingCart {
        private List<CartItem> items;
    
        // Термин из домена: "оформить заказ"
        public Order checkout(PaymentMethod method) { ... }
    
        // Термин из домена: "добавить товар"
        public void addProduct(Product product, Quantity quantity) { ... }
    }
  • В процессе: Если эксперт говорит "заказ подтверждён", в коде появляется метод Order.confirm(), а не Order.setStatus(1). Если в процессе обсуждения выясняется, что "корзина" и "черновик заказа" — это разные сущности, это немедленно отражается в модели.

Ключевые преимущества:

  1. Снижение когнитивной нагрузки: Разработчикам не нужно мысленно переводить "бизнес-слова" в "технические слова".
  2. Повышение качества дизайна: Модель становится более точным отражением реальных бизнес-процессов.
  3. Эффективная коммуникация: Обсуждения и документация становятся понятными для всех сторон.

Единый язык не статичен — он развивается вместе с углублением понимания домена и должен быть зафиксирован в глоссарии проекта.