Ассоциация диаграмм классов UML - как, когда и почему? - PullRequest
4 голосов
/ 02 января 2009

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

interface IAnimal {
    void Feed(Food food);
}

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

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

  • Я предполагаю, что мне следует использовать связь между IAnimal и Food или Cat and Food. Должна ли быть стрелка на одной стороне линии ассоциации, если да, то на какой стороне и почему?

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

  • самое важное: должна ли быть связь между животным и пищей, кошкой и пищей или и тем, и другим?

Ответы [ 5 ]

14 голосов
/ 02 января 2009

UML определяет количество типов отношений .

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

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

Графический

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

              |

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

То есть:

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

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

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

0 голосов
/ 02 января 2009

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

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

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

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

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

0 голосов
/ 02 января 2009

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

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

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

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

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

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

С это вступительное произведение:

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

0 голосов
/ 02 января 2009

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

class Animal
{
   Food foodEaten;
}

class Food
{
 //Implementation code
}

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

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

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

0 голосов
/ 02 января 2009

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

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