Являются ли совокупные корни просто сущностями с инвариантами своего содержимого?

Network состоит из Node, связанных с Fiber. Network отвечает за то, чтобы:

  1. оба конца любого волокна подключены к Node;
  2. что никакие два конца не соединены с одним и тем же Node;
  3. что никакие два узла не могут находиться в одном и том же месте (x, y);
  4. сеть имеет ограничение в 10 узлов и 10 волокон.

И Network, и Node, и Fiber богаты информацией (у них есть имя, дата развертывания и т. д.), и мне кажется, что Network является сводным корнем (поскольку он содержит как Node, так и Fibers и принудительные инварианты между ними).

На данный момент я также уверен, что Node и Fiber являются сущностями и что они, вероятно, также являются совокупными корнями.

Одна из возможных реализаций класса Network может быть следующей:

class Network {
  private final NetworkId id;
  private String name;
  private Location location;
  ...
  private final Map<FiberId, Fiber> fibers = new HashMap<FiberId, Fiber>();
  private final Map<NodeId, Fiber> nodes = new HashMap<NodeId, Node>();
}

что создает большую проблему, если мой вариант использования — просто отредактировать местоположение или имя файла Network. В этом случае я просто не забочусь о волокнах и узлах, и на самом деле ожидается, что их число вполне возможно, чтобы их количество было порядка 10-100 тысяч узлов/волокон! Как мне подойти к этому вопросу? Должен ли я отделить определение Network (содержащее fibers и nodes и их инварианты) от остальных полей?

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

Следуя этой философии, я обычно склонен решать, является ли некоторая концепция предметной области значением, сущностью, значением или событием, а затем является ли она сущностью или совокупным корнем. Мое предположение ошибочно?

Спасибо


person devoured elysium    schedule 15.04.2014    source источник
comment
Я не согласен с тем, как вы отличаете совокупные корни от сущностей. Существуют не только инварианты уровня агрегата, но также инварианты уровня объекта, даже в простых сущностях или даже в объектах-значениях. Мы заботимся о состоянии их атрибутов, которые, согласно некоторым философским школам DDD, всегда должны оставаться неизменными. См. codebetter.com/gregyoung/2009/05/22/always-valid< /а>   -  person guillaume31    schedule 18.04.2014


Ответы (2)


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

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

Кроме того, имеет значение ограниченный контекст, концепция Сети специфична для одного контекста, в другом контексте она может выглядеть немного иначе. Не существует единой Модели, применимой везде. Итак, в каком контексте вы определяете Сеть? Вам нужно определить только то, что имеет отношение к ЭТОМУ контексту, а не все, что может быть частью сети в какой-то момент.

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

Как правило, AR не является контейнером, это по-прежнему предметная концепция, которая выступает в качестве фасада для других связанных концепций.

person MikeSW    schedule 16.04.2014
comment
что домен понимает под сетью? Является ли он контейнером узлов или волокон или сам является логической единицей? С моей точки зрения, сеть — это контейнер, да. Я не понял, что вы имеете в виду под логической единицей. - person devoured elysium; 17.04.2014
comment
Можете ли вы иметь сеть без Node или Fibe? Может в домене существует пустая Сеть? Да. Я бы сказал, что аналогией может быть проект Photoshop без текста или изображений. Это все еще фотошоп проект. - person devoured elysium; 17.04.2014
comment
Вы должны определить, действительно ли совокупность Node или Fibe определяет сеть, т. е. у вас просто не может быть действующей концепции сети без этих концепций. Сеть — это просто набор волокон и узлов, плюс несколько ограничений на то, как узлы и волокна могут взаимодействовать. Я не верю, что из этого есть выход. - person devoured elysium; 17.04.2014
comment
Я отредактировал OP и добавил еще одно ограничение. Хотя теория ваших постов интересна, мне интересно, как можно было бы реализовать ее в коде. Не могли бы вы сделать набросок того, как это сделать? С моей точки зрения, невозможно обойти тот факт, что в каком-то месте у меня будет контейнер как волокон, так и узлов, и что этот контейнер должен иметь правила/ограничения относительно того, как волокнам и узлам разрешено взаимодействовать (это то, что сеть является). - person devoured elysium; 17.04.2014
comment
С утилитарной точки зрения я мог бы, возможно, отделить контейнерную часть сети от других общих атрибутов (может быть, создать класс NetworkProperties? Мне действительно не нравится эта идея ..), тем самым освободив себя от необходимости загружать все узлы и волокна каждый раз, когда я хочу изменить простой атрибут, такой как имя или автор из сети. - person devoured elysium; 17.04.2014
comment
Контейнер Fibe и Node обычно называют репозиторием. Может быть, вы хотите, чтобы Сеть была определена просто как концепция и применяла бизнес-правила для Fibe и Node. Сделайте так, чтобы соответствующее поведение сети использовало репозиторий для Node и Fibe в качестве зависимости и применяло ограничения. Или поместите это обеспечение в службу. Я недостаточно знаю Домен, чтобы придумать что-то более конкретное. Однако я не думаю, что Сеть должна выступать в качестве контейнера для других концепций. - person MikeSW; 17.04.2014

Как насчет делегирования инвариантной защиты меньшему совокупному корню?

1.оба конца любого волокна подключены к узлу;
2.никакие два конца не подключены к одному и тому же узлу;

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

3. что никакие два узла не могут находиться в одном и том же месте (x, y).

Тогда сеть — это просто совокупный корень с идентификатором и некоторой информацией.

person Yugang Zhou    schedule 15.04.2014
comment
Да, я согласен с 1) и 2), и именно так я это и делал. Но я все еще в недоумении с сетью и (x, y) расположением узлов. Не могли бы вы более подробно описать, как бы вы на самом деле моделировали класс Network? Должна ли сеть по-прежнему содержать все узлы и все волокна? - person devoured elysium; 15.04.2014
comment
Я, вероятно, не стал бы моделировать сеть как контейнер, поскольку Fiber и Node могли бы сами защищать инварианты. Волокно и узел имеют NetworkId для поддержания своих отношений. Единственная проблема заключается в том, что использование ограничения уникальности базы данных делает правило 3 неявным. - person Yugang Zhou; 15.04.2014
comment
Но должен ли мой доменный код предполагать, что база данных будет иметь это неявное ограничение? - person devoured elysium; 17.04.2014
comment
Я бы позволил базе данных делать то, в чем она хороша, особенно когда нет требований к переносимости базы данных. Не могли бы вы проверить, является ли дубликат идентичности в вашем коде :) Я думаю, достаточно объявить, что NodeRepository выдает исключение DuplicateLocationException. - person Yugang Zhou; 17.04.2014
comment
Что делать, если сеть имеет ограничение в 10 узлов и 10 волокон. ограничение, например? Разве это не обяжет вас иметь узлы и волокна в сети? - person devoured elysium; 17.04.2014
comment
@devouredelysium Как насчет того, чтобы служба домена возвращала объект спецификации, содержащий узлы и волокна данной сети (делегировать совокупное извлечение в NodeRepository и FiberRepository). Пусть спецификация проверяет инвариант. - person Yugang Zhou; 17.04.2014