Обзор DDD проектирования, управляемого доменом

Дизайн, управляемый доменом

Вы чувствуете, что вы просто бизнес-CRUD Boy после многих лет разработки и думаете, что бизнес не имеет большого технического содержания. Не попадете ли вы в трясину бизнеса?Из-за различных сложных и переплетающихся бизнес-правил код начинает гнить и начинает выходить из-под контроля, проект становится сложно поддерживать, а итерация затруднительна. Если вы начнете осознавать эту проблему, то я настоятельно рекомендую вам начать изучать проектирование, управляемое предметной областью, подход к проектированию, ориентированный на моделирование предметной области.

Что такое ДДД?

DDD — это дизайн, управляемый доменом.В переводе на китайский язык это дизайн, управляемый доменом.Прежде всего, мы должны сначала понять, что здесь означает домен? Предположим, компания разрабатывает платформу электронной коммерции, и платформа электронной коммерции включает в себя основные виды деятельности, такие как запасы, заказы и товары. Эта основная бизнес-логика фактически представляет собой область платформ электронной коммерции. Популярное понимание состоит в том, что набор бизнес-знаний о системе представляет собой поле. Так же, как онлайн-образовательная платформа, она должна иметь систему бизнеса, включая регистрацию, онлайн-обучение, курсы и другой контент. Мы абстрагируем эти предприятия от модели предметной области, и эти модели предметной области выражают бизнес-требования, сформулированные менеджером по продукту. Мы неоднократно используем эти модели предметной области для обсуждения и общения с менеджером по продукту для окончательной доработки предварительной модели предметной области. Затем используйте предварительную модель предметной области для управления дизайном и разработкой кода.

В двух словах:

Бизнес-знания --> Модель предметной области --> Дизайн проекта и разработка кода

Основная бизнес-логика различных платформ электронной коммерции в основном схожа.Эта часть знаний предметной области может быть повторно использована.Разница заключается в разных языках программирования, интерфейсных средах управления и структурах баз данных, используемых разными компаниями. Преимущество использования доменно-ориентированного дизайна заключается в том, что проект использует модель предметной области в качестве ядра, в то время как интерфейсные среды управления, такие как Spring MVC и Struts или среды объектных баз данных Hibernate и Mybatis, относятся к основе периферийных технологий. Модель предметной области на самом деле не связана с этими базовыми технологиями, поэтому в предметной области с той же моделью мы можем легко заменить нашу инфраструктуру.

Значит, наша предыдущая разработка тоже поддерживалась этой бизнес-логикой? Тогда почему нашу традиционную модель разработки нельзя назвать дизайном, ориентированным на предметную область? Вспомните нашу предыдущую разработку кода, такую ​​как функция реализации корзины покупок для размещения заказа. Мы используем поля таблицы заказов, чтобы собрать воедино запись в таблице заказов с полем продукта, полем суммы, полем пользователя и т. д. д., а затем напишите его в форму заказа. На самом деле мы разрабатываем под БД, ориентируемся на БД, а бизнес-логика разбросана по каждому сервису, используется процессно-ориентированный метод программирования вместо объектно-ориентированного, и органической бизнес-логики нет.

Дизайн, ориентированный на домен, отличается: он фокусируется на домене, взяв в качестве примера функцию заказа корзины покупок. В DDD бизнес-логика, связанная с корзиной покупок, инкапсулирована в объект ShoppingCart, а метод размещения заказа напрямую вызывается shoppingCart.takeOrder().Фокус кода переносится с записей в сгенерированной таблице заказов на сам объект корзины покупок, в то время как создание этой записи в конкретной базе данных не относится к нашей основной бизнес-логике.Это делегировано уровню инфраструктуры, а объекты взаимодействия с данными, такие как репозиторий или Dao, отвечают за сохранение сгенерированных изменений базы данных по инструкции выдаем на модель домена.

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

Сводная информация о модели предметной области

  • Резюмировать основные понятия в этой области и установить отношения между понятиями;
  • Модель предметной области поддерживает согласованность между данными в предметной области, то есть нашими бизнес-правилами;

Зачем нам ДДД

  1. Благодаря единому языку наши разработчики и эксперты в предметной области (менеджеры по продуктам) могут лучше общаться. Более точное представление нашего бизнеса, и эти бизнес-коды работают так, как думают эксперты в предметной области.
  2. Сосредоточьте бизнес-знания с помощью тактического проектирования и сконцентрируйте их в модели предметной области.
  3. В прошлом бизнес-коде нам всегда нужно было встраивать много комментариев, потому что способность процедурного кода к самообъяснению очень плоха, а лучший дизайн — это сам код. Знания в предметной области представлены через сам код.
  4. Деконструируйте и упрощайте сложные бизнес-системы с помощью стратегического проектирования.

Тактический дизайн и стратегический дизайн являются локальными и общими рекомендациями DDD по дизайну.

Анемия и амнезия

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

На самом деле это то, что Эванс называет анемией, потому что данные и бизнес-поведение изолированы, образуя неорганическую композицию кода. На самом деле это не объектно-ориентированный метод кодирования, когда мы видим объект Order, мы просто не знаем, что он содержит бизнес-логику для расчета конечной суммы, что на самом деле является так называемой амнезией, вызванной анемией. Данные и поведение не тесно связаны.

public static void buyProduct(Long orderId, Double price, Long productId, Float discount) {

        Order order = new Order();

        order.setOrderId(orderId);
        order.setProductId(productId);
        order.setDiscount(discount);
        order.setPrice(price);

        // 计算最终付款金额
        if(discount == 0) {
            throw new RuntimeException("折扣不可为0!");
        }

        Double paid = price * discount;
        order.setPaid(paid);

        OrderDao.save(order);

}

Лучше сделать так, чтобы они образовывали органичную композицию кода, интегрируя данные и бизнес-поведение в один объект. Один из принципов GRASP Object Responsibility заключается в том, что если объект обладает свойствами, требуемыми для метода, то лучше поместить метод в объект, а не где-либо еще.

 public static void buyProduct_(Long orderId, Double price, Long productId, Float discount) {

        Order order = new Order(orderId, price, productId, discount);

        order.calculatePaid();

        OrderDao.save(order);

}

Приведенный выше пример больше соответствует нашему описанию бизнеса, но недостаточно подчеркнуть только инкапсуляцию бизнес-логики в объекты данных, нам также необходимо выразить бизнес через взаимодействие между этими объектами. Очевидным примером является случай трансферов.

  public static void main(String[] args) {

        Account a = new Account(5);

        Account b = new Account(5);

        double transferMoney = 4;

        if (a.getMoney() < transferMoney) {
            throw new RuntimeException("余额不足!");
        }

        a.setMoney(a.getMoney() - transferMoney);

        b.setMoney(b.getMoney() + transferMoney);

    }

Для лучшего подхода мы должны извлечь уроки из объектно-ориентированного моделирования и инкапсулировать знания предметной области в модель учетной записи.

public void transfer(Account another, double transferMoney) {

        if (money < transferMoney) {
            throw new RuntimeException("余额不足!");
        }

        money = money - transferMoney;
        another.setMoney(another.getMoney() + transferMoney);

    }

Перевод со счета А на счет Б.

  public static void main(String[] args) {

        Account a = new Account(5);
        Account b = new Account(5);

        double transferMoney = 4;

        a.transfer(b, transferMoney);

    }

Благодаря сотрудничеству между моделями предметной области представленный код похож на местный. Есть объект-предикат субъекта. Субъектом является учетная запись A, предикатом является метод transfer(), а объектом является учетная запись B. Таким образом, самоочевидность кода также очень сильна. Даже если менеджер по продукту не знает языка программирования, видя наш код, он может понять бизнес-цель.

Применимые сценарии DDD

Итак, какие сценарии подходят для DDD?
В обозримом будущем бизнес-сложность проекта будет становиться все выше и выше, поэтому очень удобно использовать метод проектирования DDD. И если все проекты - это очень простые добавления, удаления и ревизии с небольшими знаниями в области бизнеса, то я действительно не могу подняться до D, потому что идея DDD состоит в том, чтобы выражать знания предметной области через модели, а само знание предметной области очень отсутствует. Если да, то нет способа выразить это.

Как сделать ДДД

Мы можем использовать один и тот же общий язык с экспертами в предметной области (менеджерами по продуктам), чтобы абстрагировать модель предметной области с помощью общего языка и разрабатывать код в соответствии с этими моделями предметной области, чтобы бизнес-сфера могла лучше отражаться в коде. Нам нужно изменить наши прежние привычки мышления, думая меньше с технического уровня, а больше с уровня бизнеса. Насколько я понимаю, DDD — это набор методологий объектно-ориентированного программирования, основанных на предметной области в качестве ядра. Он в основном реализует DDD в двух вариантах. Одним из них является тактический дизайн, который вы можете понимать как дизайн в рамках одного микросервиса. Одним из них является стратегическое проектирование, которое вы можете понять как взаимодействие нескольких микросервисов.

тактический дизайн

Тактический дизайн ориентирован на локальный дизайн, в основном включающий следующие концепции:

  • Сущность: имеет уникальный идентификатор и жизненный цикл, который можно понимать как запись, которая может соответствовать базе данных через сущность.
  • Объект-значение: свойство, используемое для описания сущности.
  • Агрегация: содержит объекты сущностей и значений и поддерживает согласованность транзакций.
  • Репозиторий: используется для получения или сохранения агрегатов.
  • Доменные службы: поместите некоторую бизнес-логику, которая не вписывается в агрегаты.

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

стратегическое моделирование

Стратегический дизайн фокусируется на разработке того, как различные части целого работают вместе, в основном включая следующие концепции:

  • Ограниченный контекст: класс контекста, в котором работает модель предметной области. Например, товарный модуль в электронной коммерции является ограниченным контекстом.
  • Карта контекста: как взаимодействуют разные классы моделей предметной области. Например, как модуль товаров взаимодействует с модулем инвентаризации на платформе электронной коммерции.

Ограниченный контекст — это концептуальная граница, в которой работает модель предметной области, то есть ограниченный контекст соответствует разрабатываемому нами микросервису. Что касается того, как общаться в разных контекстах, концепция контекстной карты используется для управления развитием.


Существует много дискуссий о DDD, и у всех разные мнения, что является одной из причин, почему DDD трудно завоевать. Но идея DDD по-прежнему очень достойна упоминания. Для изучения DDD настоятельно рекомендуется прочитать оригинальные DDD и IDDD.

Ниже приводится книга в формате PDF о DDD и IDDD, загруженная автором, и я надеюсь, что она поможет друзьям, которые хотят изучить DDD.

«Дизайн, ориентированный на предметную область: преодоление сложности в основе программного обеспечения»Код извлечения: 6290

Внедрение дизайна, управляемого доменомКод извлечения: xl3t

Существуют разные понимания DDD, и комментарии пользователей сети приветствуются для совместного обсуждения.

Перейдите на мой личный блог vc2x.com