Linea guida: Associazione
Un'associazione rappresenta una relazione strutturale tra gli oggetti. Questa linea guida descrive come utilizzare questa relazione.
Relazioni
Descrizione principale

Associazioni

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.

Nomi di associazioni

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 esempio di nome di associazione

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.

Diagramma descritto nel testo di accompagnamento.

Esempi di un buon e un cattivo utilizzo dei nomi associazione e ruolo

Ruoli

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.

Esempi di associazioni

Associazioni tra Cliente, Indirizzo e Ordine, che mostrano sia i nomi ruolo che le molteplicità

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.

Navigabilità

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:

Esempi di navigabilità nelle associazioni

Classi del sistema di immissione ordini aggiornate, visualizzando la navigabilità delle associazioni.

Associazioni in se stesse

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:

Esempio di un'associazione in se

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.

Associazioni multiple

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.

Ordine di ruoli

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.

Collegamenti

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.

Classi di associazioni

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:

Esempio di una classe di associazione

La classe di associazione Valutazione acquisisce le informazioni relative all'associazione stessa

Associazioni qualificate

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.

Un'associazione qualificata

L'associazione tra Voce della riga e Prodotto dispone del qualificatore Codice prodotto.

Associazioni N-arie

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.