UML ассоциация и зависимость - PullRequest
5 голосов
/ 11 октября 2011

В чем разница между ассоциацией и зависимостью?Можете ли вы привести примеры кода?Какая связь между классом A и B?

class A
{
    B *b;

    void f ()
    {
        b = new B ();
        b->f();
        delete b;
    }
}

Ответы [ 5 ]

12 голосов
/ 11 октября 2011

Короткий ответ таков: как любая конкретная конструкция исходного языка должна быть представлена ​​в UML, не является строго определенной.Это было бы частью стандартизированного профиля UML для рассматриваемого языка, но, к сожалению, их мало и они далеко друг от друга.Далее следует длинный ответ.

В вашем примере, я боюсь, мне пришлось бы сказать «ни», просто чтобы быть трудным.A имеет переменную-член типа B, поэтому отношение на самом деле является агрегацией или композицией ... или направленной ассоциацией.В UML направленная ассоциация с именованной целевой ролью семантически эквивалентна атрибуту с соответствующим именем.

enter image description here

Как правило, это агрегация, если bинициализируется в конструкторе A;это композиция, если она также уничтожается в деструкторе B (общий жизненный цикл).Если ни то, ни другое не применимо, это атрибут / направленная ассоциация.

Если b не был переменной-членом в A, а локальная переменная b не была задействована (для нее не было вызвано никаких методов)тогда я представлял бы это как зависимость: A нуждается в B, но у него нет атрибута этого типа.

Но f() фактически вызывает метод, определенный в B.Для меня это делает правильное отношение <<use>>, которое является более специализированной формой зависимости.

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

4 голосов
/ 11 октября 2011

Может быть полезно увидеть этот вопрос, который я задал: подразумевает ли ассоциация зависимость в 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();
    }

}
1 голос
/ 25 сентября 2012

Получите это от Wiki: Зависимость - более слабая форма отношений, которая указывает, что один класс зависит от другого, потому что он использует это в некоторый момент времени.Один класс зависит от другого, если последний является переменной параметра или локальной переменной метода первого.Это отличается от ассоциации, где атрибут первого является экземпляром второго.

Поэтому я считаю, что в данном случае речь идет об ассоциации, если B является переменной параметра или локальной переменной метода Aтогда они и есть зависимость.

1 голос
/ 11 октября 2011

Если вы хотите увидеть разницу на «уровне кода» в ассоциации между A и B, реализация A (или B или обоих в зависимости от количества элементов, навигации и т. Д.) В OO lang будет включать атрибут типа B.

Вместо этого в зависимости у A, вероятно, будет метод, в котором один из параметров имеет тип B. Таким образом, A и B не связаны, но изменение B повлияет на зависимый класс A, поскольку, возможно, способ, которым метод A управляет объектом B больше не действителен (например, B изменил сигнатуру метода, и это вызывает ошибку компиляции в классе A)

0 голосов
/ 11 октября 2011

Зависимость действительно очень слабо определена. Так что не было бы представления кода.

Wiki: Зависимость - это семантическая связь, в которой изменение входящего или независимого элемента моделирования может повлиять на семантику зависимого элемента моделирования. [1]

Из спецификации OMG: Зависимость - это отношение, которое означает, что для одного или нескольких элементов модели требуются другие элементы модели для их спецификации или реализации. Это означает, что полная семантика зависимых элементов либо семантически, либо структурно зависит от определения элемента (ов) поставщика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...