Spiegazione di associazione, aggregazione e composizione in OOP

Unified Modeling Language (UML) è uno standard de facto per la modellazione di sistemi orientati agli oggetti. In UML esistono cinque diversi tipi di relazioni: associazione, aggregazione, composizione, dipendenza ed ereditarietà. Questo articolo presenta una discussione dei primi tre di questi concetti, lasciando i restanti a un altro post del blog.

Associazione nella programmazione orientata agli oggetti

L'associazione è una relazione semanticamente debole (una dipendenza semantica) tra oggetti altrimenti non correlati. Un'associazione è una relazione di "utilizzo" tra due o più oggetti in cui gli oggetti hanno una propria durata e non vi è alcun proprietario.

Ad esempio, immagina la relazione tra un medico e un paziente. Un medico può essere associato a più pazienti. Allo stesso tempo, un paziente può visitare più medici per cure o consulti. Ciascuno di questi oggetti ha il proprio ciclo di vita e non esiste un "proprietario" o un genitore. Gli oggetti che fanno parte della relazione di associazione possono essere creati e distrutti in modo indipendente.

In UML una relazione di associazione è rappresentata da una singola freccia. Una relazione di associazione può essere rappresentata come uno-a-uno, uno-a-molti o molti-a-molti (nota anche come cardinalità). In sostanza, una relazione di associazione tra due o più oggetti denota un percorso di comunicazione (chiamato anche collegamento) tra di loro in modo che un oggetto possa inviare un messaggio a un altro. Il frammento di codice seguente illustra come due classi, BlogAccount e BlogEntry, sono associate l'una all'altra.

public class BlogAccount

   {

       blogEntry privato [] blogEntries;

       // Altri membri della classe BlogAccount

   }

classe pubblica BlogEntry

   {

       Int32 blogId;

       didascalia stringa;

       testo della stringa;

       // Altri membri della classe BlogEntry

   }

Aggregazione nella programmazione orientata agli oggetti

L'aggregazione è una forma specializzata di associazione tra due o più oggetti in cui ogni oggetto ha il proprio ciclo di vita ma esiste anche una proprietà. L'aggregazione è una tipica relazione intera / parte o genitore / figlio, ma può denotare o meno contenimento fisico. Una proprietà essenziale di una relazione di aggregazione è che il tutto o il genitore (cioè il proprietario) può esistere senza la parte o il figlio e viceversa.  

Ad esempio, un dipendente può appartenere a uno o più reparti di un'organizzazione. Tuttavia, se il reparto di un dipendente viene eliminato, l'oggetto dipendente non verrà distrutto ma continuerà a vivere. Si noti che le relazioni tra gli oggetti che partecipano a un'aggregazione non possono essere reciproche, ovvero un dipartimento può "possedere" un dipendente, ma il dipendente non possiede il reparto. Nell'esempio di codice seguente è evidente una relazione di aggregazione tra le classi BlogAuthor e BlogAccount.

public class BlogAuthor

   {

       private Int32 authorId;

       firstName stringa privata;

       lastName stringa privata;

       // Altri membri della classe BlogAuthor

   }

public class BlogAccount

   {

       blogEntry privato [] blogEntries;

       // Altri membri della classe BlogAccount

   }

L'aggregazione è solitamente rappresentata in UML utilizzando una linea con un diamante vuoto. Come l'associazione, l'aggregazione può coinvolgere una relazione uno-a-uno, uno-a-molti o molti-a-molti tra gli oggetti partecipanti. Nel caso di una relazione uno-a-molti o molti-a-molti, possiamo dire che è una relazione ridondante.

Composizione nella programmazione orientata agli oggetti

La composizione è una forma specializzata di aggregazione. Nella composizione, se l'oggetto genitore viene distrutto, anche gli oggetti figlio cessano di esistere. La composizione è in realtà un tipo forte di aggregazione e talvolta viene definita relazione di "morte". Ad esempio, una casa può essere composta da una o più stanze. Se la casa viene distrutta, vengono distrutte anche tutte le stanze che fanno parte della casa. Lo snippet di codice seguente illustra una relazione di composizione tra due classi, House e Room.

classe pubblica House

{

   stanza della stanza privata;

   casa pubblica()

   {

       stanza = nuova stanza ();

   }

}

Come l'aggregazione, anche la composizione è una relazione intera / parte o genitore / figlio. Tuttavia, nella composizione il ciclo di vita della parte o del bambino è controllato dall'intero o dal genitore che lo possiede. Va notato che questo controllo può essere diretto o transitivo. Cioè, il genitore può essere direttamente responsabile della creazione o della distruzione del figlio oppure il genitore può utilizzare un figlio che è già stato creato. Allo stesso modo, un oggetto genitore potrebbe delegare il controllo a un altro genitore per distruggere l'oggetto figlio. La composizione è rappresentata in UML utilizzando una linea che collega gli oggetti con un diamante pieno all'estremità dell'oggetto che possiede l'altro oggetto.

Spero che questa discussione sulle relazioni di associazione, aggregazione e composizione ti abbia aiutato a capire come differiscono questi tre concetti. Ricorda che l'aggregazione e la composizione sono entrambi sottoinsiemi di associazione. Sia nell'aggregazione che nella composizione, un oggetto di una classe può essere il proprietario di un oggetto di un'altra classe. E sia nell'aggregazione che nella composizione, gli oggetti figli appartengono a un singolo oggetto genitore, cioè possono avere un solo proprietario.

Infine, in una relazione di aggregazione, i cicli di vita degli oggetti padre e degli oggetti figlio sono indipendenti. In una relazione di composizione, la morte di un oggetto genitore significa anche la morte dei suoi figli.