2009-07-17 2 views
8

Utilizzo UML da un po 'di tempo e ho letto pochi articoli, libri, forum su di esso ma ancora non capisco REALMENTE quando due classi dovrebbero essere connesse con la linea di associazione (una linea semplice o freccia (o questi non sono gli stessi?)). Fornirò tre esempi: puoi dirmi quale farà le due classi in questa relazione?Problema di comprensione dell'associazione 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(); 
     } 
    } 

risposta

0

Uso tipicamente due diversi connettori in UML:

  1. Quando una classe dipende dall'implementazione di un'altra. Ciò implicherebbe che una classe stia creando o gestendo un'istanza di un'altra. Quindi la classe chiamante dipende dalla classe di implementazione. Questo sarebbe evidente in tutti i tuoi esempi.

  2. Quando una classe estende o implementa un'altra.

+0

Quindi, quali connettori utilizzate in ciascun caso? –

4

Modifica: Riscritta seguente risposta di discussione nei commenti (grazie a Chimp per sottolineare ciò che ho trascurato nell'esempio 4)

Esempio 1: OtherClass è un attributo di MainClass, e quindi è modellata come un'associazione.

Esempi 2 e 3: OtherClass fa riferimento all'interno della definizione di classe, anche se non è memorizzato all'interno di un attributo, quindi è una dipendenza.

Esempio 4: la classe Something è un attributo, e quindi un'associazione, mentre il riferimento OtherClass, che non è memorizzato in un attributo, e quindi è dipendenza.

All'interno di UML, le dipendenze e le associazioni sono entrambi tipi di relazione e non sono strettamente correlati (eccetto che attraverso un supertipo comune), sebbene a mio avviso un'associazione implichi una dipendenza.

Le associazioni sono indicate da una linea tra le 2 classi con molteplicità a ciascuna estremità. La navigabilità è indicata da frecce che mostrano quale classe è a conoscenza di quale (es. Classe A ___> Classe B significa A è a conoscenza di B, ma non viceversa) la navigabilità in entrambe le direzioni è indicata da frecce ad entrambe le estremità. Dove non ci sono frecce, di solito è più sicuro non fare supposizioni sulla navigabilità se non indicato altrove.

Le dipendenze sono indicate da una linea tratteggiata con una freccia dalla classe dipendente (client) alla classe da cui dipende (fornitore) (ad esempio A ----> B significa A dipende da B). Le dipendenze mostrano che a un certo punto si fa riferimento a una classe e in quanto tale il client dipende dalle operazioni fornite dal fornitore, ma non indica come viene fatto riferimento (diversamente da un'associazione che suggerisce un riferimento memorizzato in un attributo).

+0

ok ma la classe non è a conoscenza delle classi fornite come argomenti? e sei sicuro di quello che stai dicendo, perché sto cercando una risposta "questo è ciò che la teoria dice, fine dell'argomento"? – agnieszka

+0

hmm, potrei probabilmente riformularlo un po ': il viaggio dalla mente alla tastiera non è sempre facile, e penso di aver perso un po' di significato sulla strada. Le associazioni sono espresse come attributi. È accettabile visualizzare le associazioni in UML allo stesso modo dei tipi di dati primitivi, ma l'uso delle linee di collegamento è solitamente più informativo. Temo di non poter pensare a una spiegazione per mostrare perché le argomentazioni ai metodi non costituiscono un'associazione (diversa da "perché non lo fanno" che non è affatto una spiegazione). Ma, a prescindere, sono sicuro che sia corretto. – chrisbunney

+0

A proposito, ho sempre una copia di UML Distilled a portata di mano quando lavoro con UML, trovo che sia un ottimo riferimento: http://www.martinfowler.com/books.html#uml – chrisbunney

6

Prima di tutto una freccia rappresenta navigabilità dell'associazione.Singola freccia significa unidirezionale relazione, in questo caso solo la classe sorgente conosce la classe di destinazione. Freccia su entrambe le estremità significa relazione bidirezionale, in cui entrambe le classi si conoscono reciprocamente. Se non sono presenti frecce, l'associazione può essere bidirezionale per impostazione predefinita o soppressa per motivi di leggibilità. In pratica dovresti disegnare delle frecce solo quando vuoi enfatizzare la direzione dell'associazione.

Quando si tratta della seconda domanda, solo il primo caso descrive un'associazione (unidirezionale) tra MainClass e OtherClass. Né gli argomenti né i valori di ritorno implicano l'associazione nel senso di UML (sebbene entrambi implichino dipendenza). Nell'ultimo esempio esiste un'associazione tra la classe MainClass e la classe Something tramite l'attributo something. Come regola generale, dovresti cercare associazioni negli attributi.

Si noti che esiste un concetto di dependency in UML ed è rappresentato da una linea tratteggiata.

Pozdrowienia!

+0

Questo praticamente lo riassume . +1 – Randolpho

1

Un'associazione rappresenta due o più proprietà correlate.

Nell'esempio 1, MainClass ha una proprietà di tipo OtherClass. Se OtherClass ha una proprietà esplicita di tipo MainClass, allora ci sarà un'associazione bidirezionale tra la classe; se OtherClass ha una proprietà implicita di tipo MainClass (cioè non esiste un attributo, ma la relazione può essere derivata lavorando nell'altra direzione), allora ci sarà un'associazione unidirezionale da MainClass ad OtherClass.

Negli esempi 2, 3 e 4, MainClass non ha proprietà di tipo OtherClass. Dipende comunque da OtherClass, quindi ci sarebbe una relazione di dipendenza da MainClass ad OtherClass. Nel codice questo è rappresentato da un utilizzando o #include.