Le associazioni rappresentano le relazioni strutturali tra gli oggetti di classi differenti; esse
rappresentano le connessioni tra istanze di due o più classi che esistono per un determinato periodo. Confrontare
questa situazione con i collegamenti transitori che esistono, ad esempio, solo per la durata di un'operazione. Queste
ultime situazioni possono essere, invece, modellate utilizzando delle collaborazioni, in cui i collegamenti esistono
solo in particolari contesti limitati.
E' possibile utilizzare le associazioni per mostrare
che gli oggetti hanno delle informazioni relative ad altri oggetti. A volte, è necessario che gli oggetti mantengano
riferimenti reciproci per potere interagire, ad esempio, inviandosi reciprocamente dei messaggi; così, in alcuni casi,
le associazioni possono derivare da modelli di interazione nei diagrammi di sequenze o di comunicazioni.
La maggior parte delle associazioni sono binarie (esistono tra due classi) e sono create come percorsi solidi che
collegano coppie di simboli. Un'associazione o i ruoli di tale associazione possono avere dei
nomi. I nomi dei ruoli sono preferibili, perché forniscono ulteriori informazioni. Nei casi in cui è possibile
specificare un solo ruolo, i ruoli sono comunque preferibili ai nomi di associazioni poiché è previsto che
l'associazione sia unidirezionale, a partire dall'oggetto a cui è associato il nome ruolo.
Le associazioni vengono, spesso, specificate durante l'analisi, perché esistono sufficienti informazioni per
specificare i ruoli. Laddove utilizzati, i nomi di associazioni dovrebbero rispecchiare lo scopo della relazione ed
essere una frase di verbi. Il nome dell'associazione è inserito o è adiacente al percorso dell'associazione.
Esempio
In uno sportello automatico, il bancomat fornisce l'importo dispensato dal Dispenser di contanti. Per
poter dispensare fondi, il Dispenser di contanti deve conservare un riferimento all'oggetto Bancomat;
nello stesso modo, se il Bancomat esaurisce i fondi, occorre notificarlo al Dispenser di contanti, quindi
il Bancomat deve conservare un riferimento al Dispenser di contanti. Un'associazione modella tale
riferimento.
Un'associazione tra il Dispenser di contanti e il Bancomat, denominata valore fornito.
I nomi associazione, se vengono scelti male, possono provocare confusione e fraintendimenti. Il seguente esempio
illustra le denominazioni giuste e sbagliate. Nel primo diagramma, vengono utilizzati i nomi associazione che, sebbene
siano sintatticamente corretti (utilizzando frasi di verbi), non forniscono molte informazioni sulla relazione. Nel
secondo diagramma, vengono utilizzati i nomi ruolo, che forniscono molte più informazioni sulla natura della
partecipazione nell'associazione.
Esempi di un buon e un cattivo utilizzo dei nomi associazione e ruolo
Ogni fine di un'associazione è un ruolo che specifica la funzione di una classe nell'associazione. Ogni
ruolo deve avere un nome e i nomi ruolo opposti a una classe devono essere univoci. Il nome ruolo dovrebbe essere un
sostantivo che esprima il ruolo dell'oggetto associato in relazione all'oggetto associante. Un nome ruolo adatto per un
Insegnante in un'associazione con una Sezione del corso potrebbe essere, ad esempio, Lettore;
evitare nomi del tipo "ha" e "contiene", poiché non aggiungono alcuna informazione alle relazioni tra le
classi.
Tenere presente che l'uso di nomi associazione e ruolo si escludono reciprocamente: non è possibile utilizzare l'uno
e l'altro. I nomi ruolo sono preferibili ai nomi associazione eccetto che nei casi in cui esistono informazioni
insufficienti per denominare correttamente il ruolo (come avviene spesso nell'analisi; nel ruolo di progettazione, si
consiglia sempre l'utilizzo dei nomi). La mancanza di un nome ruolo suggerisce un modello incompleto o non formato
correttamente.
Il nome ruolo viene collocato alla fine della linea di associazione.
Esempio
Considerare le relazioni tra classi in un sistema di immissioni di ordini. Un cliente può avere differenti tipi di
indirizzi: uno a cui vengono inviate le fatture e alcuni a cui è possibile inviare gli ordini. Come risultato, sono
disponibili due associazioni tra il Cliente e l'Indirizzo, come mostrato di seguito. Le associazioni vengono
etichettate con il ruolo che ha l'indirizzo associato per il Cliente.
Associazioni tra Cliente, Indirizzo e Ordine, che mostrano sia i nomi ruolo che le molteplicità
Per ogni ruolo, è possibile specificare la molteplicità della relativa classe, il numero di oggetti della classe
che è possibile associare con un oggetto dell'altra classe. La molteplicità viene indicata da un'espressione di testo
sul ruolo. L'espressione è un elenco di intervalli di numeri interi, separati da virgole. Un intervallo viene indicato
da un numero intero (il valore più basso), due punti e un numero intero (il valore più alto); un singolo numero intero
è un intervallo valido e il simbolo '*' indica "molti", ossia un numero illimitato di oggetti. Il simbolo '*' in se
stesso equivale a '0..*', ossia a qualsiasi numero compreso "nessuno", che è il valore predefinito. Un ruolo scalare
facoltativo ha la molteplicità 0..1.
Esempio
Nel precedente esempio, sono state mostrate le molteplicità per le associazioni tra Ordine e Cliente e tra Cliente e
Indirizzo. Interpretando il diagramma, viene indicato che un Ordine deve disporre di un Cliente associato (la
molteplicità è 1..1 all'estremità Cliente), ma è possibile che un Cliente non disponga di alcun Ordine (la molteplicità
è 0..* all'estremità Ordine). Inoltre, il Cliente dispone di un indirizzo di fatturazione, ma di uno o più indirizzi di
spedizione. Per ridurre la confusione notazionale, se vengono omesse delle molteplicità, si presuppone che il relativo
valore sia 1..1.
La proprietà navigabilità su un ruolo indica che è possibile andare da una classe di associazione alla classe di
destinazione utilizzando l'associazione. Ciò potrebbe essere implementato in diversi modi: tramite riferimenti diretti
agli oggetti, schiere associative, tabelle hash o qualsiasi altra tecnica di implementazione che consenta a un oggetto
di fare riferimento a un altro. La navigabilità viene indicata da una freccia aperta, collocata sull'estremità di
destinazione della linea di associazione, accanto alla classe di destinazione (quella esplorata). Il valore predefinito
della proprietà di navigabilità è true.
Esempio
Nell'esempio di immissione ordini, l'associazione tra Ordine e Cliente è navigabile in entrambe le
direzioni: un Ordine deve sapere quale Cliente ha eseguito l'Ordine e il Cliente deve
sapere quali Ordini ha eseguito. Quando non sono presenti frecce, si presuppone che l'associazione sia
navigabile in entrambe le direzioni.
Nel caso delle associazioni tra Cliente e Indirizzo il Cliente deve sapere i relativi
Indirizzi, ma gli Indirizzi non hanno alcuna nozione relativa a quali Clienti (o altre classi, dal
momento che diversi elementi dispongono di indirizzi) sono associati all'indirizzo. Come risultato, la proprietà di
navigabilità dell'estremità Cliente dell'associazione viene disattivata, dando come risultato il seguente
diagramma:
Classi del sistema di immissione ordini aggiornate, visualizzando la navigabilità delle associazioni.
A volte, una classe presenta di un'associazione in se stessa. Ciò non significa necessariamente che un'istanza di tale
classe dispone di un'associazione in se stessa; più spesso, significa tale istanza se la classe dispone di associazioni
con le altre istanze della stessa classe. Nel caso delle associazioni in se stesse, i nomi ruolo sono essenziali per
distinguere lo scopo dell'associazione.
Esempio
Considerare la seguente associazione in se, che include la classe Impiegato:
In questo caso, è possibile che un impiegato presenti un'associazione con altri impiegati; in tal caso, è un
responsabile e gli altri impiegati sono membri del suo staff. L'associazione è navigabile in entrambe le direzioni
poiché gli impiegati conoscono il proprio responsabile e viceversa.
La presenza di associazioni tra classi indica che gli oggetti sono doppiamente correlati; uno specifico oggetto può
essere collegato a oggetti differenti tramite ogni associazione. Ogni associazione è indipendente e viene distinta in
base al nome ruolo. Come mostrato in precedenza, un Cliente può presentare associazioni a diverse istanze della stessa
classe, ognuna con nomi ruolo differenti.
Quando la molteplicità di un'associazione è superiore a uno, è possibile ordinare le istanze associate. La
proprietà ordinata su un ruolo indica che le istanze che partecipano a tale associazione vengono ordinate; per
impostazione predefinita, sono una serie non ordinata. Il modello non specifica in che modo viene mantenuto
l'ordine; le operazioni che aggiornano un'associazione ordinata devono specificare dove vengono inseriti gli elementi
aggiornati.
Le singole istanze di un'associazione vengono chiamate collegamenti; un collegamento è, quindi, una relazione
tra istanze. E' possibile inviare i messaggi sui collegamenti e i collegamenti possono denotare i riferimenti e le
aggregazioni tra oggetti. Per ulteriori informazioni, consultare Tecnica:
Diagramma di comunicazione.
Una classe di associazioni è un'associazione che dispone anche di proprietà della classe (ad esempio, attributi,
operazioni e associazioni). Viene mostrata tracciando una linea tratteggiata dal percorso di associazione a un simbolo
della classe che contiene gli attributi, le operazioni e le associazioni dell'associazione stessa. Gli attributi, le
operazioni e le associazioni si applicano all'associazione originale. Ogni collegamento nell'associazione dispone delle
proprietà indicate. L'uso più comune delle classi di associazioni è la riconciliazione di relazioni "molti a molti"
(vedere l'esempio riportato di seguito). Nel principio, il nome dell'associazione e quello della classe dovrebbero
essere uguali, ma sono consentiti nomi separati, se necessario. Una classe di associazioni corrotta contiene solo
attributi per l'associazione; in questo caso, è possibile omettere il nome di tale classe per de-enfatizzarne la
separazione.
Esempio
Espandendo il suddetto esempio dell'Impiegato, considerare il caso in cui un Impiegato (una persona dello staff) lavora
per un altro impiegato (un responsabile). Il responsabile esegue una valutazione periodica del membro dello staff,
riflettendone le prestazioni in un periodo di tempo specifico.
La valutazione non può essere soltanto un attributo del responsabile o del membro dello staff, ma è possibile associare
le informazioni con l'associazione stessa, come mostrato di seguito:
La classe di associazione Valutazione acquisisce le informazioni relative all'associazione stessa
I qualificatori vengono utilizzati per restringere e definire ulteriormente una serie di istanze associata a un'altra
istanza; un oggetto e un valore qualificatore identificano una serie di oggetti univoca attraverso l'associazione,
formando una chiave composita. La qualificazione, generalmente, riduce la molteplicità del ruolo opposto; la
molteplicità di rete di solito mostra il numero di istanze della classe correlata, associate alla prima classe e a un
valore di qualificatore specificato. I qualificatori vengono rappresentati come piccole caselle alla fine
dell'associazione, allegate alla classe qualificante. Essi fanno parte dell'associazione, non della classe. Una casella
del qualificatore può contenere diversi valori di qualificatore; la qualifica si basa sull'intero elenco di valori.
Un'associazione qualificata è una forma di variante dell'attributo di associazione.
Esempio
Considerare il seguente miglioramento dell'associazione tra Voce della riga e Prodotto: una Voce della
riga presenta un'associazione al Prodotto ordinato. Ogni voce della riga si riferisca a un unico prodotto,
mentre è possibile ordinare un prodotto su più Voci della riga. Qualificando l'associazione con il qualificatore
Codice prodotto, si indica, inoltre, che ogni prodotto presenta un codice di prodotto univoco e che le Voci
della riga vengono associate ai Prodotti utilizzando tale codice.
L'associazione tra Voce della riga e Prodotto dispone del qualificatore Codice prodotto.
Un'associazione n-aria è un'associazione tra tre o più classi, in cui una singola classe può comparire più volte. Le
associazioni n-arie vengono riprodotte come rombi di grandi dimensioni con un percorso di associazione a ogni classe
partecipante. Questo è il simbolo del modello di relazione di entità tradizionale per un'associazione. Il formato
binario viene tracciato senza rombo per maggiore compattezza, dal momento che si tratta di volumi di associazioni in un
modello reale. Le associazioni n-arie sono piuttosto rare e possono essere modellate promuovendole in classi. Le
associazioni n-arie possono avere una classe di associazione, che viene rappresentata tracciando una linea tratteggiata
dal rombo al simbolo della classe. I ruoli possono avere dei nomi, ma la molteplicità è più complicata e viene
specificata meglio elencando le chiavi candidate. Se fornita, la molteplicità rappresenta il numero di istanze
corrispondenti a una tupla degli altri oggetti N-1. La maggior parte di usi delle associazioni n-arie possono essere
eliminate utilizzando associazioni qualificate o classi di associazioni. Possono anche essere sostituite da classi
ordinarie, sebbene in questo modo si perde il vincolo che può verificarsi un solo collegamento per una determinata
tupla di oggetti partecipanti.
|