Помогите определить совокупные корни - PullRequest
2 голосов
/ 09 сентября 2011

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

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

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

, если кто-то может пролить свет, я был бы очень благодарен.

спасибо

1 Ответ

1 голос
/ 09 сентября 2011

Вы задали очень похожий вопрос как минимум три раз . Домен всегда один и тот же: спортивные команды, лиги и игроки, но предоставленные вами данные всегда разные, поэтому вы получаете и принимаете разные ответы. Вы явно в состоянии анализа паралича. Существует очень мало шансов, что вы придумали идеальную модель в первый раз. Начните писать код и тесты, и вы получите немедленную обратную связь. Ищите запахи кода, появится рефакторинг, и появится лучшая модель.

По поводу этой версии вопроса. Агрегат определение :

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

И классический пример - это «Порядок в качестве совокупного корня» и «Порядок линий в качестве сущностей», которые являются частью «Порядка совокупности». Обратите внимание, что строки заказа не имеют смысла вне заказа.

В вашем случае правило «команда не может существовать без лиги» отличается. Недостаточно объявить Команду частью Агрегата Лиги. Это похоже на «Заказ не может существовать без Клиента». Это не означает, что Клиент является частью Агрегата заказа. Клиент - это собственный агрегат, он имеет смысл сам по себе. Так же, как команда имеет смысл сама по себе, у нее есть своя история, фанаты и т. Д.

К этой проблеме также можно подходить с позиции «обмена данными». В примере Эвана весь Орден блокируется, чтобы можно было применять внутренние инварианты. Если вы вносите изменения в Лигу, хотите ли вы, чтобы все команды и игроки также были заблокированы?

Итак, на основании информации, которую вы предоставили на этот раз, вам нужно два Агрегата: Лига и Команда. Имейте в виду, что агрегаты могут ссылаться друг на друга.

...