UML ассоциация и зависимость
В чем разница между ассоциацией и зависимостью? Можете ли вы привести примеры кода? Какая связь между классом A и B?
class A
{
B *b;
void f ()
{
b = new B ();
b->f();
delete b;
}
}
5 ответов
Короткий ответ: как любая конкретная конструкция исходного языка должна быть представлена в UML, не является строго определенной. Это было бы частью стандартизированного профиля UML для рассматриваемого языка, но, к сожалению, их немного и они далеко друг от друга. Длинный ответ следует.
Боюсь, что в вашем примере мне пришлось бы сказать "ни", просто чтобы быть трудным. A
имеет переменную-член типа B
Таким образом, отношения на самом деле являются совокупностью или композицией... Или направленной ассоциацией. В UML направленная ассоциация с именованной целевой ролью семантически эквивалентна атрибуту с соответствующим именем.
Как правило, это агрегация, если b
инициализируется в A
конструктор; это композиция, если она также разрушается в B
Деструктор (общий жизненный цикл). Если ни то, ни другое не применимо, это атрибут / направленная связь.
Если b
не был переменной-членом в A
и локальная переменная b
не был задействован (никакие методы не были вызваны), тогда я представляю это как зависимость: A
потребности B
, но у него нет атрибута этого типа.
Но f()
на самом деле вызывает метод, определенный в B
, Это для меня делает правильное отношение <<use>>
, которая является более специализированной формой зависимости.
Наконец, (ненаправленная) связь является самой слабой формой связи между двумя классами, и по этой причине я склонен не использовать их при описании исходных конструкций. Когда я это делаю, я обычно использую их, когда нет прямых отношений исходного кода, но эти два класса все еще как-то связаны. Примером этого может быть ситуация, когда оба отвечают за разные части одного и того же более крупного алгоритма, но третий класс использует их оба.
Может быть полезно увидеть этот вопрос, который я задал: подразумевает ли связь зависимость в UML
Мое понимание таково:
ассоциация
public class SchoolClass{
/** This field, of type Bar, represents an association, a conceptual link
* between SchoolClass and Student. (Yes, this should probably be
* a List<Student>, but the array notation is clearer for the explanation)
*/
private Student[] students;
}
зависимость
public class SchoolClass{
private Timetable classTimetable;
public void generateTimetable(){
/*
* Here, SchoolClass depends on TimetableGenerator to function,
* but this doesn't represent a conceptual relationship. It's more of
* a logical implementation detail.
*/
TimetableGenerator timetableGen = new TimetableGenerator();
/*
* Timetable, however, is an association, as it is a conceptual
* relationship that describes some aspect of the data that the
* class holds (Remember OOP101? Objects consist of data and operations
* upon that data, associations are UMLs way or representing that data)
*/
classTimetable = timetableGen.generateTimetable();
}
}
Получите это от Wiki: Dependency - более слабая форма отношений, которая указывает, что один класс зависит от другого, потому что он использует это в некоторый момент времени. Один класс зависит от другого, если последний является переменной параметра или локальной переменной метода первого. Это отличается от ассоциации, где атрибут первого является экземпляром последнего.
Поэтому я думаю, что в данном случае речь идет об ассоциации, если B - переменная параметра или локальная переменная метода A, то это зависимость.
Если вы хотите увидеть разницу на "уровне кода" в ассоциации между A и B, реализация A (или B или обоих в зависимости от количества элементов, навигации,...) в OO lang будет включать атрибут тип Б.
Вместо этого в зависимости у A, вероятно, будет метод, в котором один из параметров имеет тип B. Таким образом, A и B не связаны, но изменение B повлияет на зависимый класс A, поскольку, возможно, метод, которым метод A манипулирует объектом B, не дольше действителен (например, B изменил сигнатуру метода, и это вызывает ошибку компиляции в классе A)
Зависимость действительно очень слабо определена. Так что не было бы представления кода.
Вики. Зависимость - это семантическая связь, в которой изменение входящего или независимого элемента моделирования может повлиять на семантику зависимого элемента моделирования. [1]
Из спецификации OMG: зависимость - это отношение, которое означает, что для отдельного или набора элементов модели требуются другие элементы модели для их спецификации или реализации. Это означает, что полная семантика зависимых элементов либо семантически, либо структурно зависит от определения элемента (ов) поставщика.