Проблема понимания ассоциации UML - PullRequest
8 голосов
/ 17 июля 2009

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

1

//a field of OtherClass
    public class MainClass
    {
        private OtherClass other;
    }

2

//method argument
    public class MainClass
    {
        public void Action(OtherClass other)
        { }
    }

3.

//method return value
    public class MainClass
    {
        public OtherClass Action()
        { }
    }

4

//used inside a method
    public class MainClass
    {
        private Something something;

        public void Action()
        {
            OtherClass other = something.GetOtherClass();
        }
    }

Ответы [ 4 ]

6 голосов
/ 18 июля 2009

Прежде всего, стрелка представляет навигацию ассоциации. Одиночная стрелка означает однонаправленное отношение , в этом случае только целевой класс знает о целевом классе. Стрелка на обоих концах означает двунаправленное отношение, где оба класса знают друг о друге. Если стрелки отсутствуют, связь может быть либо двунаправленной по умолчанию, либо подавлена ​​для удобства чтения. На практике вы должны рисовать стрелки только тогда, когда вы хотите подчеркнуть направление ассоциации.

Когда речь идет о вашем втором вопросе, только первый случай описывает (однонаправленную) связь между MainClass и OtherClass. Ни аргументы, ни возвращаемые значения не подразумевают ассоциацию в смысле UML (хотя оба подразумевают зависимость). В последнем примере есть связь между MainClass и Something классом через атрибут something. Как правило, вы должны искать ассоциации в атрибутах.

Обратите внимание, что в UML есть понятие dependency, и оно представлено пунктирной линией.

Pozdrowienia!

4 голосов
/ 17 июля 2009

Редактировать: Переписал ответ после обсуждения в комментариях (спасибо Шимпанзе за указание на то, что я пропустил в Примере 4)

Пример 1: OtherClass является атрибутом MainClass и, таким образом, моделируется как ассоциация.

Примеры 2 и 3: OtherClass упоминается в определении класса, хотя и не хранится в атрибуте, поэтому является зависимостью.

Пример 4. Класс Something является атрибутом и, следовательно, ассоциацией, а ссылается на OtherClass, который не хранится в атрибуте, и поэтому является зависимостью.

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

Ассоциации обозначены линией между двумя классами с кратностями на каждом конце. Навигация обозначена стрелками, показывающими, какой класс знает о каком (например, класс A ___> Класс B означает, что A осведомлен о B, но не наоборот). Там, где стрелок нет, обычно безопаснее не делать предположений о судоходстве, если не указано иное.

Зависимости обозначены пунктирной линией со стрелкой от зависимого класса (клиента) до класса, от которого зависит (поставщик) (например, A ----> B означает, что A зависит от B). Зависимости показывают, что на класс ссылаются в какой-то момент, и поэтому клиент зависит от операций, предоставляемых поставщиком, но не указывает, как на него ссылаются (в отличие от ассоциации, которая предлагает ссылку, сохраненную в атрибуте). 1017 *

1 голос
/ 20 июля 2009

Ассоциация представляет два или более связанных свойства.

В примере 1 MainClass имеет свойство типа OtherClass. Если OtherClass имеет явное свойство типа MainClass, то между классом будет двунаправленная связь; если у OtherClass есть неявное свойство типа MainClass (т. е. нет атрибута, но связь может быть получена путем работы в другом направлении), то будет иметь место однонаправленная связь от MainClass к OtherClass.

В примерах 2, 3 и 4 MainClass не имеет каких-либо свойств типа OtherClass. Однако он зависит от OtherClass, поэтому между MainClass и OtherClass могут существовать отношения зависимости. В коде это обозначается с использованием или # include .

0 голосов
/ 17 июля 2009

Я обычно использую два разных соединителя в UML:

  1. Когда класс зависит от реализации другого. Это будет означать, что класс создает или обрабатывает экземпляр другого. Таким образом, вызывающий класс зависит от класса реализации. Это было бы очевидно во всех ваших примерах.

  2. Когда класс расширяет или реализует другой.

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