2009-07-17 3 views
8

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

ответ

0

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

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

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

+0

Итак, какие разъемы вы используете в каждом случае? –

4

Edit: переписаны ответ следующее обсуждение в комментариях (спасибо Chimp за указание, что я проглядел в примере 4)

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

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

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

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

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

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

+0

ok, но не класс, осведомленный о классах, предоставляемых в качестве аргументов? и вы уверены в том, что вы говорите, потому что я ищу ответ «это то, что говорит теория, конец темы»? – agnieszka

+0

Хмм, я мог бы, вероятно, перефразировать это немного: путешествие от ума к клавиатуре не всегда легкое, и я думаю, что я потерял определенный смысл на этом пути. Ассоциации выражаются в качестве атрибутов. Допустимо отображать ассоциации в UML так же, как и примитивные типы данных, но использование соединительных линий обычно более информативно. Боюсь, я не могу придумать объяснение, чтобы показать, почему аргументы методов не являются ассоциацией (кроме «потому что они не являются», что не является объяснением вообще). Но, независимо от того, я уверен, что это правильно. – chrisbunney

+0

Кстати, я всегда держу копию UML Distilled to hand при работе с UML, я считаю, что это очень хорошая ссылка: http://www.martinfowler.com/books.html#uml – chrisbunney

6

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

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

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

Pozdrowienia!

+0

Это в значительной степени суммирует его , +1 – Randolpho

1

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

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

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