Отношения в диаграмме классов UML - PullRequest
3 голосов
/ 01 октября 2009

У меня есть приложение, которое моделирует дерево с классами Tree, Node и Edge (мне нужен класс Edge!), И я не уверен, как для этого представить отношения в диаграмме классов. Я читал об этом другие посты, но все еще сомневаюсь.

Объект Tree имеет указатель на узел (его корень), который, как я считаю, определяет одностороннюю связь (Tree -> Node) с кратностью 1..1 в обоих концах. Это правильно?

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

Но тогда у меня в каждом объекте Edge указатель на целевой узел края. Как я могу представить эти отношения, учитывая, что у меня уже есть состав Node -> Edge, описанный выше?

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

Спасибо за любую помощь.

Ответы [ 4 ]

1 голос
/ 01 октября 2009

Из того, что вы описываете, это звучит так, как если бы диаграмма UML class должна иметь:

Tree -> Node, aggregation, 1..0-1
Node -> Edge, aggregation, 1..*
Edge -> Node, composition, 1..2 (an edge exists only if it connects 2 nodes)
Node -> Node, aggregation, 1..1 (would be composition, except the root node doesn't point to a node.

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

1 голос
/ 01 октября 2009

- у объекта Tree есть указатель на узел (его корень), который, как я считаю, определяет односторонний --association (Tree -> Node) с кратностью 1..1 в обоих концах. Это правильно?

Нет, кратность должна быть 0..1 - 1 (не все узлы будут корнем дерева)

Вам также следует подумать, действительно ли Edge является классом или нет. Если вам не нужно хранить какую-либо информацию о ребрах (то есть они не помечены), я бы просто смоделировал ребра как двоичные ассоциации между узлами

1 голос
/ 01 октября 2009

Я бы сказал, что:

  • Дерево имеет корневой узел
  • Узлы имеют дочерние узлы
  • Узлы могут иметь родительский узел

Примечание:

  • Возможно, вы захотите провести различие между диаграммой классов UML и диаграммой объектов UML
  • Я не знаю, являются ли корневой узел и дочерний узел одним и тем же классом (дочерний узел может быть подклассом корневого узла, поскольку оба типа узлов имеют дочерние, но только дочерние узлы имеют родительский узел)

Edge может вообще не быть классом: вместо этого Edge может быть просто экземпляром Node.

0 голосов
/ 05 октября 2009

Обработка древовидной структуры в ОО решается с помощью Composite Design Pattern .

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

...