Универсальный язык (Ubiquitous Language) в DDD

Начало и оглавление здесь

Универсальный язык (Ubiquitous Language) — это один из ключевых концептов Domain-Driven Design, который подразумевает создание общего, точного и однозначного языка между разработчиками и экспертами предметной области (domain experts). Этот язык используется на всех этапах работы: от обсуждения требований до проектирования и реализации кода.

Зачем нужен Ubiquitous Language?

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

Пример проблемы без Ubiquitous Language:

  • Бизнес говорит: “Клиент может оформить заказ”.
  • Разработчик понимает: “Пользователь может создать запись в таблице Orders”.
  • Но на самом деле “оформить заказ” включает: проверку доступности товара, резервирование, создание заявки в CRM, отправку уведомления и т. д.

Решение: создать единый словарь терминов, который будет:

  • Точно описывать бизнес-процессы.
  • Использоваться в коде (названия классов, методов, переменных).
  • Быть понятным и разработчикам, и бизнесу.

Как формируется Ubiquitous Language?

  • Выявление ключевых понятий – совместная работа разработчиков и экспертов домена.
  • Уточнение терминов – избегание двусмысленностей, устранение синонимов.
  • Фиксация в документации – глоссарий, диаграммы, пользовательские истории.
  • Отражение в коде – классы, методы, база данных называют вещи так же, как и в бизнес-логике.

Преимущества Ubiquitous Language

  • Уменьшает недопонимание – все говорят на одном языке.
  • Упрощает рефакторинг – код отражает бизнес-логику.
  • Помогает в проектировании – четкие границы моделей (Bounded Context).
  • Делает документацию полезной – она остается актуальной, так как термины используются в коде.

Проблемы и антипаттерны

  • Разные термины в коде и документации – если разработчики используют свои названия, язык перестает быть универсальным.
  • Слишком технические термины – бизнес не должен разбираться в “DTO”, “репозиториях” и “фасадах”.
  • Игнорирование изменений – если домен эволюционирует, язык тоже должен обновляться.

Главное правило

Если бизнес называет это “Заказом”, то в коде это должно быть Order, а не PurchaseRequest или UserTransaction.