È sorprendente quanta confusione esista sulla distinzione tra la parte-tutto - aggregazione e composizione dei concetti di associazione . Il problema principale è il malinteso diffuso (anche tra sviluppatori di software esperti e tra gli autori di UML) che il concetto di composizione implichi una dipendenza del ciclo di vita tra il tutto e le sue parti tale che le parti non possono esistere senza il tutto. Ma questo punto di vista ignora il fatto che ci sono anche casi di associazioni parte-tutto con parti non condivisibili in cui le parti possono essere staccate e sopravvivere alla distruzione del tutto.
Nel documento di specifica UML, la definizione del termine "composizione" ha sempre implicato parti non condivisibili, ma non è stato chiaro quale sia la caratteristica che definisce la "composizione" e quale sia semplicemente una caratteristica opzionale. Anche nella nuova versione (a partire dal 2015), UML 2.5, dopo aver tentato di migliorare la definizione del termine "composizione", rimane ancora ambiguo e non fornisce alcuna guida su come modellare associazioni parte-tutto con non- parti condivisibili in cui le parti possono essere staccate e sopravvivere alla distruzione del tutto, a differenza del caso in cui le parti non possono essere staccate e vengono distrutte insieme al tutto. Dicono
Se un oggetto composto viene eliminato, tutte le sue istanze di parte che sono oggetti vengono eliminate con esso.
Ma allo stesso tempo dicono anche
Un oggetto parte può essere rimosso da un oggetto composito prima che l'oggetto composito venga eliminato e quindi non può essere eliminato come parte dell'oggetto composito.
Questa confusione indica un'incompletezza della definizione UML, che non tiene conto delle dipendenze del ciclo di vita tra componenti e compositi. È quindi importante capire come la definizione UML può essere migliorata introducendo uno stereotipo UML per composizioni << inseparabili >> in cui i componenti non possono essere staccati dal loro composito e, quindi, devono essere distrutti ogni volta che il loro composito viene distrutto.
1) Composizione
Come ha spiegato Martin Fowler , il problema principale per caratterizzare la composizione è che "un oggetto può essere solo la parte di una relazione di composizione". Ciò è spiegato anche nell'eccellente post sul blog UML Composizione vs Aggregazione vs Associazione di Geert Bellekens. Oltre a questa caratteristica distintiva di una composizione (avere parti esclusive o non condivisibili ), una composizione può anche avere una dipendenza dal ciclo di vita tra il composito e i suoi componenti. In effetti, esistono due tipi di tali dipendenze:
- Ogni volta che un componente deve essere sempre attaccato a un composto, o, in altre parole, quando ha un composto obbligatorio , come espresso dalla molteplicità "esattamente uno" sul lato composito della linea di composizione, allora deve essere riutilizzato in (o ricollegati a) un altro composito, o distrutto, quando il suo attuale composito viene distrutto. Ciò è esemplificato dalla composizione tra
Person
e Heart
, mostrata nel diagramma sottostante. Un cuore viene distrutto o trapiantato su un'altra persona, quando il suo proprietario è morto.
- Ogni volta che un componente non può essere staccato dal suo composto, o, in altre parole, quando è inseparabile , allora, e solo allora, il componente deve essere distrutto, quando il suo composto viene distrutto. Un esempio di una tale composizione con parti inseparabili è la composizione tra
Person
e Brain
.

In sintesi, le dipendenze del ciclo di vita si applicano solo a casi specifici di composizione, ma non in generale, non sono quindi una caratteristica determinante.
La specifica UML afferma: "Una parte può essere rimossa da un'istanza composita prima che l'istanza composita venga eliminata e quindi non essere eliminata come parte dell'istanza composita". Nell'esempio di Car
- Engine
composizione, come mostrato nello schema seguente, è chiaramente il caso che il motore può essere staccato dalla macchina prima che la macchina è distrutta, nel qual caso il motore non viene distrutta e può essere riutilizzato. Ciò è implicito dallo zero o da una molteplicità sul lato composito della linea di composizione.

La molteplicità dell'estremità dell'associazione di una composizione sul lato composito è 1 o 0..1, a seconda del fatto che i componenti abbiano o meno un composto obbligatorio (deve essere collegato a un composto). Se i componenti sono inseparabili , ciò implica che hanno un composto obbligatorio.
2) Aggregazione
Un'aggregazione è un'altra forma speciale di associazione con il significato inteso di una relazione parte-tutto, in cui le parti di un tutto possono essere condivise con altri interi. Ad esempio, possiamo modellare un'aggregazione tra le classi DegreeProgram
e Course
, come mostrato nel diagramma seguente, poiché un corso fa parte di un corso di laurea e un corso può essere condiviso tra due o più corsi di laurea (ad esempio una laurea in ingegneria potrebbe condividere un C corso di programmazione con laurea in informatica).

Tuttavia, il concetto di un'aggregazione con parti condivisibili non significa molto, in realtà, quindi non ha implicazioni sull'implementazione e molti sviluppatori quindi preferiscono non utilizzare il diamante bianco nei loro diagrammi di classe, ma modellano solo una semplice associazione anziché. La specifica UML dice: "La semantica precisa dell'aggregazione condivisa varia in base all'area di applicazione e al modellatore".
La molteplicità dell'associazione di un'aggregazione che termina al lato intero può essere un numero qualsiasi (*) perché una parte può appartenere a, o essere condivisa tra, un numero qualsiasi di interi.