Отношения UML - пунктирная линия против сплошной линии
В чем разница между этими двумя отношениями?
Изменить: Также, если бы вы могли предоставить простой пример кода, иллюстрирующий разницу, это было бы очень полезно!
6 ответов
Я пытаюсь привести простые примеры двух типов линий.
На первой диаграмме сплошной линией показана связь:
Если бы классы были объявлены в Java, это было бы как ClassA
хранение ссылки на ClassB
в качестве атрибута (его можно передать конструктору, создать и т. д.). Итак, вы можете увидеть что-то вроде:
public class ClassA {
ClassB theClassB = ...
...
}
На второй диаграмме показана зависимость:
Зависимость намного слабее, чем ассоциация. Цитировать из UML Distilled:
В случае классов зависимости существуют по разным причинам: один класс отправляет сообщение другому; один класс имеет другой как часть своих данных; один класс упоминает другой как параметр операции. [...] Вы используете зависимости всякий раз, когда хотите показать, как изменения в одном элементе могут изменить другие элементы.
Опять же, используя Java, существует пара примеров: аргумент типа ClassB
передается методу, или метод объявляет локальную переменную типа ClassB
:
public class ClassA {
...
public void someMethod(ClassB arg1) {...}
...
public void someOtherMethod() {
ClassB localReferenceToClassB = ...
}
...
}
Другие способы ClassA
может зависеть от ClassB
без ассоциации (не исчерпывающий список):
ClassB
имеет статический метод, которыйClassA
звонкиClassA
ловит исключения типаClassB
- Всякий раз, когда
ClassB
модифицируется,ClassA
также должен быть изменен (например, некоторая логика является общей)
Ваш вопрос дал мне хороший шанс узнать себя, вот что я нашел -
Ассоциация: право собственности другого типа (например, "А" владеет "В")
//@assoc The Player(A) has some Dice(B)
class Player {
Dice myDice;
}
Зависимость: использование другого типа (например, "C" использует "D")
//@dep The Player(C) uses some Dice(D) when playing a game
class Player {
rollYahtzee(Dice someDice);
}
Вот свежая ссылка, которую я нашел - Ассоциация против Зависимости
На этой веб-странице написано достаточно, я думаю: http://www.classdraw.com/help.htm Следующий текст взят из него, но должно быть достаточно, чтобы понять разницу, я думаю.
Таким образом, сплошная линия - это связь, а пунктирная / пунктирная линия - это зависимость.
Ассоциации также могут быть однонаправленными, когда один класс знает о другом классе и отношениях, а другой - нет. Такие ассоциации требуют, чтобы открытая стрелка указывала на известный класс, и только известный класс может иметь имя роли и множественность. В этом примере класс Customer знает о любом количестве приобретенных продуктов, но класс Product ничего не знает ни о каком клиенте. Кратность "0..*" означает ноль или более.
Зависимость - это слабая связь между двумя классами, которая представлена пунктирной линией. В этом примере существует зависимость между Point и LineSegment, потому что операция draw() LineSegment использует класс Point. Это указывает на то, что LineSegment должен знать о Point, даже если у него нет атрибутов этого типа. В этом примере также показано, как используются диаграммы классов, чтобы сосредоточиться на том, что важно в контексте, так как обычно вы не хотите показывать такие подробные зависимости для всех ваших операций класса.
Поскольку моя репутация всего 8, я не могу разместить изображения сам, но они все еще могут быть найдены на веб-странице, которую я упомянул в начале.
[РЕДАКТИРОВАТЬ]
У меня нет примеров кода прямо здесь, но как я лично объясню это так же просто, как машина и дверь.
Когда у машины есть дверь (или больше), это просто машина
Car --- has a --> Door
Но когда у вас есть дверь, которую можно открыть, класс двери будет иметь такую функцию
public void openDoor(){
this.open();
}
Для использования функции над автомобилем придется создать экземпляр двери
Class Car(){
Door door1 = new Door();
door1.open();
}
Таким образом, вы создали зависимость.
Таким образом, сплошная линия просто указывает объект (1) на другой объект (2), но когда вы начинаете использовать объект (1), это становится зависимостью.
Я надеюсь, что это будет делать;)
Хорошо, так как вы не приняли первый ответ; Дай мне попробовать.
Стрелка 1: нормальная ассоциация
UML имеет разные типы линий и стрелок. Выше находится простая стрелка ассоциации, которая означает, что один класс может иметь ссылку на другой класс. Ниже я объясню каждый тип С примерами кода.
- В первом примере вы можете видеть, что на самом деле не указано, кто знает, кто (кто является владельцем отношений). Животное МОЖЕТ знать человека, а человек МОЖЕТ знать животного. Это не указано и, следовательно, не очень полезно для программиста.
- Во втором примере у исполнителя МОЖЕТ быть гитара. Поскольку есть стрелка, а на другой ее нет, мы знаем, что гитара не знает исполнителя. Гитара - это объект, который может полностью существовать сам по себе и никому не нужен.
- В третьем примере вы видите брак. Действительно просто; муж знает жену, а жена знает ее мужа. В нашей ситуации у мужа есть только одна жена и наоборот.
Как мы выполняем это ОБЫЧНО в коде?
class Husband{
Wife bestWomanInTheWorld;
public Husband(Wife theWife){
this.bestWomanInTheWorld = theWife;
}
}
Поскольку муж ВСЕГДА нуждается в жене, мы помещаем ТРЕБУЕМЫЕ отношения в конструктор. Поскольку у художника МОЖЕТ быть гитара, мы бы оставили конструктор пустым, вот так:
class Artist{
List<Guitar> guitars;
public Artist(){
}
public AddGuitarToCollection(Guitar newGuitar){
Guitars.Add(newGuitar);
}
}
Итак, вот как мы выполняем это в коде (большую часть времени!). Обычно вам не нужны разные типы линий и стрелок, если вы новичок в программировании. Будь проще.
Стрелка 2: Зависимость
Итак, мы знаем о нормальных ассоциациях, которые мы будем использовать большую часть времени. Но когда мы будем использовать стрелку "зависимость"? Хорошо, давайте определим зависимость (википедия):
Dependency is a weaker form of bond which indicates that one class depends on
another because it uses it at some point in time. One class depends on
another if the independent class is a parameter variable or local variable of
a method of the dependent class. This is different from an association, where
an attribute of the dependent class is an instance of the independent class.
Sometimes the relationship between two classes is very weak. They are not
implemented with member variables at all. Rather they might be implemented as
member function arguments.
Если есть связь, отношение, ассоциация и т. Д., Которые должны присутствовать, к классу А для работы; это зависимость. Пример: Муж НУЖЕН, чтобы Жена существовала. Автомобилю НУЖНО колесо, чтобы быть машиной (и водить). Автозаводу нужен класс автомобилей, чтобы сделать из него предмет. Вашему классу RSSNewsItem НУЖЕН класс XMLReader, чтобы делать что-либо.
Когда использовать что?
Ну, это единственный действительный вопрос в моих глазах; так как гугл показывает много правильных ответов на ваш вопрос. Старайтесь никогда не использовать зависимости в диаграмме классов, потому что это обычно означает, что вы недостаточно конкретны. Всегда стремитесь к ассоциациям, реализациям и т. Д. Используйте реализации (на мой взгляд) только в том случае, если есть необходимость в использовании другого класса без сохранения отношений. Пример; Служебные классы (например, XMLReader).
Если у вас есть какие-либо вопросы после прочтения этого полного объяснения, не стесняйтесь спрашивать. :-)
Пунктирная линия указывает на зависимость (в направлении стрелки). Предполагая, что вы аккуратно собрали свой исходный код в отдельные файлы и заголовки для каждого класса - выгода в том, что код включает в себя строку #include ClassB.h.
ОДНАКО Дело в том, что все классовые отношения (обобщение, реализация, композиция, агрегация, ассоциация и т. Д.) Все наследуют отношения зависимости. По этой причине я никогда не использую пунктирные стрелки при документировании кода. Там, где это возможно, я хотел бы задокументировать отношения в более конкретных терминах, например. бриллианты, треугольники и т. д. Если я не знаю точных отношений, моей отправной точкой является сплошная линия со стрелками (ассоциация, с (неявной) зависимостью).
Несмотря на это, обозначение пунктирной стрелкой может быть полезным в других аспектах UML-моделирования, например. демонстрация зависимости от требований в анализе вариантов использования, например. П р и м е ч а н и е - Полиция Мысли заставила бы нас по мере возможности уменьшить связь и зависимости между классами с помощью интерфейсов (чисто виртуальных классов).
В то время как чисто виртуальные классы предлагают возможность множественного наследования и максимально тесную связь между классами, насколько это возможно. Преимущество интерфейсных классов в том, что они сделаны полностью из темной материи и поэтому совершенно невидимы для полиции. Имея это в виду, можно написать код на С ++ с практически нулевой связью между классами - которые они любят, потому что они так или иначе никогда не понимали все эти забавно выглядящие символы.
Точечные средние реализации (интерфейс) Твердые средние расширяет (базовый класс)