Ассоциация диаграмм классов UML - как, когда и почему?

StackOverflow https://stackoverflow.com/questions/406558

  •  03-07-2019
  •  | 
  •  

Вопрос

Обычно я сильно путаюсь в UML, и эта ситуация ничем не отличается.Допустим, у меня есть интерфейс IAnimal, класс Food и Cat:

interface IAnimal {
    void Feed(Food food);
}

class Cat : IAnimal {
    void Feed(Food food) {
        //code
    }
}

У меня есть 3 вопроса о рисовании диаграммы классов UML для этих 3 элементов:

  • Я предполагаю, что мне следует использовать ассоциацию между Животным и Едой или Кошкой и Едой.Должна ли быть стрелка с одной стороны ассоциативной линии, если да, то с какой стороны и почему именно там?

  • если я пишу Feed как метод IAnimal на диаграмме, должен ли я писать метод Feed внутри класса Cat или я пишу только дополнительные методы Cat?

  • самый важный:должна ли быть ассоциация между Животным и Едой, Кошкой и Едой или и тем, и другим?

Это было полезно?

Решение

UML определяет ряд отношения типы.

Отношения имеют несколько различных обозначений:

  • Ассоциативные отношения имеют базовую нотацию сплошного пути
  • Отношения зависимости имеют базовое обозначение в виде пунктирной стрелки
  • Отношения обобщения имеют базовое обозначение сплошного пути с треугольным наконечником стрелки
  • Отношения реализации имеют базовое обозначение в виде пунктирной стрелки с треугольным наконечником (сочетание зависимости и обобщения).

Наглядно

+---------------------------+
|       <<interface>>       |
|           IAnimal         |
+---------------------------+                        +--------+
| + Feed(food: Food) : void |- - - - <<use>> - - - ->|  Food  |
+---------------------------+                        +--------+
              ^
             /_\
              |

              |

              |
        +-----------+
        |    Cat    |
        +-----------+

Это:

  • Взаимосвязь между IAnimal и Food является использование отношения.Это проявляется как зависимость со стереотипом «использовать».
  • Взаимосвязь между IAnimal и Cat является осознание отношения.

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

Итак, ИМХО, отношения, которые вы описываете, не должны моделироваться как ассоциации.

Другие советы

Предполагая диаграмму классов, у вас должна быть ассоциация "использовать" между IAnimal и Едой и ассоциация "есть a" между Cat и IAnimal, Dog и IAnimal:

    IAnimal ----> Food
     ^   ^
    //   \\
   //     \\
 Cat      Dog

Насколько вы придирчивы к такого рода вещам, во многом зависит от того, для чего вы используете UML в первую очередь.

Если у вас есть какой-то универсальный переводчик UML-кода, то вам нужно быть разборчивым (но, похоже, вам удобнее работать с кодом, чем с блоками и строками - так зачем вам использовать такой инструмент?)

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

Крейг Ларман в книге "Применение UML и шаблонов" подчеркивает этот момент, включая диаграммы, которые выглядят так, как будто они были набросаны на белой доске.Сплошная линия, которая, согласно стандарту UML, должна быть пунктирной, вполне подходит для такого рода диаграмм.Так же и с наконечниками стрел и так далее.

Мне ясно, что линия должна идти от IAnimal Для Food.

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

От эта вводная часть:

"В однонаправленной ассоциации связаны два класса, но только один класс знает, что связь существует ".

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

По словам Мартина Фаулера, в UML существует две школы мышления.Есть "скетчеры", которые используют обозначения на белых досках и разрозненных листах бумаги, чтобы донести достаточное количество своих идей до коллег-разработчиков.

Кроме того, есть те, кто рассматривает UML как инженерные чертежи, где должна быть зафиксирована каждая мельчайшая деталь дизайна.

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

Если вы верите в последнее, пожалуйста, сделайте полный дизайн рабочего стола или веб-интерфейса с использованием UML и разместите его здесь.

1) Между интерфейсом IAnimal и типом Food не должно быть никаких ассоциаций.Ассоциации используются только для соединения типов с соответствующими параметрами внутри классов.Например,

class Animal
{
   Food foodEaten;
}

class Food
{
 //Implementation code
}

затем вы должны написать ассоциацию, указывающую на связь между этими двумя типами.

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

2) Нет, не пишите эти методы и не пишите зависимости.Оставьте все обозначения только в Интерфейсе IAnimal

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top