Проблема понимания ассоциации UML

Я использую 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();
        }
    }

Ответ 1

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

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

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

Pozdrowienia!

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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