← Назад к вопросам

Что такое "единый язык" (Ubiquitous Language) в DDD?

3.0 Senior🔥 152 комментариев
#Архитектура и паттерны

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Ubiquitous Language (единый язык) в DDD?

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

Основная цель единого языка

Единый язык создается для устранения барьера между техническими специалистами и экспертами предметной области. В традиционных проектах часто возникает ситуация, где разработчики создают свою собственную «техническую» терминологию (например, UserDAO, OrderService), которая плохо отражает реальные бизнес-процессы. Эксперты же используют свои профессиональные термины («клиент», «заявка», «активация договора»). Это приводит к:

  • Непониманию требований.
  • Ошибкам в реализации.
  • Дорогостоящим изменениям в будущем.

Как формируется единый язык?

Процесс построения единого языка является коллективным и непрерывным. Он происходит во время регулярных встреч команды разработки и экспертов предметной области (domain experts). На этих встречах:

  1. Обсуждаются бизнес-процессы и правила. Эксперты описывают, как работает бизнес.
  2. Термины явно фиксируются. Каждое понятие, которое важно для предметной области, записывается и получает четкое определение.
  3. Термины напрямую отражаются в коде. Имена классов, методов, полей и даже модулей берутся из единого языка.

Пример формирования термина:

  • Эксперт говорит: «Когда клиент подает заявку, мы проводим её валидацию и затем создаём договор».
  • Команда вместе определяет ключевые термины: Заявка (Application), Клиент (Client), Валидация (Validation), Договор (Contract).
  • Эти термины становятся основой для модели и кода.

Пример воплощения единого языка в коде

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

<?php

// Сущность (Entity), отражающая бизнес-термин "Заявка"
class Application
{
    private ApplicationId $id;
    private Client $client;
    private ApplicationStatus $status;

    // Метод, название которого взято из единого языка
    public function validate(): void
    {
        // Бизнес-правила валидации, о которых говорил эксперт
        if ($this->client->isBlacklisted()) {
            throw new ValidationException('Клиент находится в черном списке');
        }
        $this->status = ApplicationStatus::VALIDATED;
    }

    // Другой метод, соответствующий бизнес-процессу
    public function createContract(): Contract
    {
        if ($this->status !== ApplicationStatus::VALIDATED) {
            throw new DomainException('Нельзя создать договор из невалидированной заявки');
        }
        return new Contract($this->id, $this->client);
    }
}

// Еще одна сущность из единого языка
class Client
{
    private ClientId $id;
    private string $fullName;
    private bool $isBlacklisted = false;

    public function isBlacklisted(): bool
    {
        return $this->isBlacklisted;
    }
}

В этом примере:

  • Классы Application, Client, Contract — это прямые отражения терминов предметной области.
  • Методы validate() и createContract() соответствуют действиям бизнес-процесса.
  • Исключения ValidationException и DomainException также используют язык домена.

Преимущества использования единого языка

  • Улучшенная коммуникация: Все участники проекта говорят «на одном языке», что снижает риски ошибок.
  • Более точная модель: Программная модель становится близким отражением реального бизнеса.
  • Снижение сложности: Код становится более читаемым и понятным, так как не требует «перевода» технических терминов.
  • Эффективная эволюция: Когда бизнес-правила меняются, изменения в коде становятся более очевидными, потому что термины остаются теми же.

Важные принципы

  1. Единый язык должен быть живым. Он постоянно обсуждается и совершенствуется вместе с развитием проекта и бизнеса.
  2. Язык должен быть точным. Каждый термин должен иметь одно четкое значение, избегая двусмысленности.
  3. Код — это часть языка. Дизайн системы (имена классов, методов, модулей) должен строго соответствовать единому языку. Если в языке появился новый термин, он должен появиться в коде.

Проблемы и вызовы

Создание и поддержание единого языка требует дисциплины и времени. Это процесс, который нельзя автоматизировать. Основные трудности:

  • Необходимость постоянного вовлечения экспертов предметной области.
  • Риск «размывания» языка, когда разработчики начинают использовать технические синонимы.
  • Сложность в больших организациях с множеством независимых команд.

Ubiquitous Language — это не просто список слов. Это практика коммуникации и моделирования, которая лежит в основе успешного применения DDD. Она превращает разработку программного обеспечения из чисто технической задачи в совместное с бизнесом построение точной и эффективной модели предметной области, что в конечном итоге приводит к созданию более ценного и устойчивого продукта.

Что такое "единый язык" (Ubiquitous Language) в DDD? | PrepBro