Точное совокупное определение, управляемое доменом

заполнитель

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

При чтении книги DDD Quickly, это было предложенное определение совокупности. Однако, как я анализировал некоторые видео на YouTube, в частности:

DDD & REST - доменные API-интерфейсы для Интернета - Оливер Гирке

Он определил совокупность следующим образом:

Entity + Repository = Aggretate

Он также рекомендовал, чтобы мы подклассировали строку для каждого атрибута, что, по моему мнению, противоречило цели DDD по решению проблемы сложности. Что делать, если у нас есть 100 атрибутов?

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

2 ответа

Совокупность - это все о предметной области: она представляет то, что является предметно-специфическим для данной области знаний.

Напротив, хранилище - это техническая вещь, которая заботится о постоянстве. Таким образом, хранилище не принадлежит домену, это утилита для возможности использования агрегатов.

Итак, нет, хранилище не принадлежит к совокупности. Вы также можете быть заинтересованы в этом вопросе для деталей об этом.

Относительно вашего второго вопроса: это существенно зависит от вашего приложения и от языка программирования, который вы используете... если вы используете динамически типизированный язык, такой как JavaScript, вы все равно можете использовать DDD, но вы не сможете подклассы (оставив ES2015 class кроме ключевого слова, так как оно не приносит реального объектно-ориентированного программирования в ES).

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

Поскольку создание подклассов является технической проблемой, оно не связано с DDD. Если вообще, это связано с тем, как реализовать модель, созданную с использованием DDD, но это не зависит от самого DDD.

Возможно, вас заинтересует моделирование с вашей командой из документации по wolkenkit, в которой описывается, как делать DDD, и на что обращать внимание.

Обратите внимание, что я являюсь одним из авторов wolkenkit, CQRS и фреймворка для обработки событий для Node.js и JavaScript. Поэтому, пожалуйста, возьмите последний абзац с зерном соли.

Является ли репозиторий частью агрегата

Нет, совершенно отдельно

средство, с помощью которого сохраняется совокупность, которая относится к уровню инфраструктуры?

Не совсем это тоже.

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

Во-вторых, целесообразно ли повысить сложность и ремонтопригодность программного обеспечения для достижения читабельности, или это противоречит цели DDD в целом?

Не "читабельность", а "общение"; см. главу 2 синей книги

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

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

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

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

Чтобы выбрать наивный пример, Time не Moneyдаже в тех случаях, когда основным представлением обоих является long,

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

Эта "сложность" на самом деле просто приводит в соответствие артефакты кода с вездесущим языком экспертов в предметной области.

Теперь, в зависимости от того, в каком Blub вы кодируете, могут возникнуть дополнительные сложности в артефактах вашего кода для создания этих отдельных имен; как показывает Скотт, в F# это действительно прямолинейно, но на обычном рабочем языке это может быть не так просто. Я чувствую, что если ваш выбор языка вносит сложности в ваше моделирование, то, возможно, вам следует сначала посмотреть, есть ли другой язык, лучше подходящий для этой задачи.

Другие вопросы по тегам