Nella programmazione orientata agli oggetti, un oggetto è legato ad un altro per usare le funzionalità e i servizi forniti da quell’oggetto. Questa relazione tra due oggetti è conosciuta come associazione nella progettazione generale del software orientata agli oggetti e rappresentata da una freccia nel linguaggio di modellazione unificato o UML. Sia la composizione che l’aggregazione sono forme di associazione tra due oggetti, ma c’è una sottile differenza tra composizione e aggregazione, che si riflette anche nella loro notazione UML. Ci riferiamo all’associazione tra due oggetti come Composizione, quando una classe possiede altre classi e le altre classi non possono significativamente esistere, quando il suo proprietario è distrutto, per esempio, la classe Umana è una composizione di diverse parti del corpo tra cui Mano, Gamba e Cuore. Quando l’oggetto umano muore, tutte le sue parti del corpo cessano di esistere in modo significativo, questo è un esempio di Composizione.
I programmatori spesso confondono tra Associazione, Composizione e Aggregazione nelle discussioni sul design orientato agli oggetti, questa confusione rende anche la differenza tra Associazione, Composizione e Aggregazione una delle domande popolari nelle interviste Java, solo dopo la differenza tra classe astratta e interfaccia.
Un altro esempio di Composizione è Auto e la sua parte per esempio motori, ruote, ecc Le singole parti dell’auto non possono funzionare quando l’auto viene distrutta. Mentre nel caso di Aggregazione, incluso l’oggetto che può esistere senza essere parte dell’oggetto principale come un giocatore che è parte di una squadra, può esistere senza una squadra e può diventare parte di altre squadre pure.
Un altro esempio di Aggregazione è Studente nella classe Scuola quando la scuola è chiusa, Studente esiste ancora e quindi può unirsi ad un’altra scuola o così. Nella notazione UML, una composizione è denotata da un diamante pieno, mentre l’aggregazione è denotata da un diamante vuoto, che mostra la loro ovvia differenza in termini di forza della relazione.
La composizione è più forte dell’aggregazione. In breve, una relazione tra due oggetti è chiamata associazione, e un’associazione è nota come composizione quando un oggetto ne possiede un altro mentre un’associazione è nota come aggregazione quando un oggetto usa un altro oggetto.
In questo tutorial OOPS, vedremo un paio di altri esempi per capire meglio la differenza tra Associazione, Composizione e Aggregazione.
Btw, se sei nuovo nel mondo della programmazione e della progettazione orientata agli oggetti allora ti suggerisco anche di seguire un corso pratico come UML and Object-Oriented Design Foundations di Karloy Neisztor su Udemy. È un ottimo corso per capire il processo completo di analisi e progettazione orientata agli oggetti per creare software di qualità.
Un esempio di associazione, composizione e aggregazione in Java
Ecco un esempio di composizione e aggregazione, in termini di codice Java. Guardando questo codice, si possono misurare le differenze tra questi due. A proposito, la composizione è anche molto preferita nel design orientato agli oggetti rispetto all’ereditarietà, anche Joshua Bloch ha dichiarato la sua importanza nel libro classico, Effective Java.
1. Composizione:
Siccome Engine is-part-of Car, la relazione tra loro è Composition. Ecco come sono implementati tra le classi Java.
public class Car {
2. Aggregazione:
Siccome Organizzazione ha Persona come dipendenti, la relazione tra loro è Aggregazione. Ecco come appaiono in termini di classi Java
public class Organization { private List employees;}
public class Person { private String name; }
DiagrammaUML di Associazione, Composizione, e Aggregazione
UML ha diverse notazioni per indicare aggregazione, composizione, e associazione. L’associazione è denotata dalla freccia semplice mentre l’aggregazione è denotata dalla freccia vuota a testa di diamante e la composizione è denotata da una freccia piena a testa di diamante.
Quando si disegna un diagramma UML per due classi correlate A e B, dove A è associato a B, allora è denotato da A -> B. Un modo simile è usato per mostrare l’aggregazione e la composizione tra due classi.
Ecco le notazioni UML per un diverso tipo di dipendenza tra due classi.
![](https://3.bp.blogspot.com/-4KAOtX0S5NU/UvJN_w4TCZI/AAAAAAAABCo/SKPKYaci8s0/s280/association+vs+composition+vs+aggregation.jpg)
Associazione vs Composizione vs Aggregazione
Ecco la lista delle differenze tra Composizione e Aggregazione in formato punto, per una rapida revisione. Come ho detto, la differenza chiave tra loro viene dal punto che nel caso della Composizione, un oggetto è PROPRIETARIO di un altro oggetto, mentre nel caso dell’aggregazione, un oggetto è solo un UTENTE o un altro oggetto.
1) Se A e B due classi sono legate tra loro in modo tale che, B ha cessato di esistere, quando A viene distrutto, allora l’associazione tra due oggetti è conosciuta come Composizione. Un esempio è Auto e Motore. Mentre se A e B sono associati tra loro, in modo tale che B può esistere senza essere associato ad A, allora questa associazione è conosciuta come Aggregazione.
Vedi Head First Object-Oriented Analysis and Design per altri esempi di Composizione e Associazione in OOP.
3) Nel diagramma UML l’Associazione è denotata da una normale punta di freccia, mentre la Composizione è rappresentata da una punta di freccia a diamante piena, e l’Aggregazione è rappresentata da una punta di freccia a diamante vuota, come mostrato nel diagramma sottostante e allegato nel terzo paragrafo.
Associazione A—->B
Composizione A—–<completo>B
Aggregazione A—–<>B
4) Aggregazione è una forma più leggera di Composizione, dove un oggetto sotto-parte può significativamente esistere senza gli oggetti principali.
5) In Java, è possibile utilizzare la parola chiave final per rappresentare la Composizione. Poiché in Composizione, l’oggetto proprietario si aspetta che un oggetto parte sia disponibile e funzioni, rendendolo finale, si fornisce la garanzia che, quando il proprietario sarà creato, questo oggetto parte esisterà. Questo è in realtà un idioma Java per rappresentare una forte forma di associazione, cioè la composizione tra due oggetti.
6) Un’altra parola interessante, che torna utile per capire la differenza tra Composizione e Aggregazione nella progettazione del software è “part-of” e “has”. Se un oggetto è parte di un altro oggetto, ad esempio Engine è parte di Car, allora l’associazione o la relazione tra loro è Composizione. D’altra parte, se un oggetto ha solo un altro oggetto, ad esempio Auto ha il conducente, allora è Aggregazione.
Questo è tutto sulla differenza tra Associazione, Composizione e Aggregazione in UML, Java e progettazione orientata agli oggetti. Dato che l’analisi orientata agli oggetti riguarda più la definizione della relazione tra gli oggetti, è importante sapere che tipo di relazione esiste tra loro, la composizione e l’aggregazione sono due modi di rappresentare la relazione tra due oggetti.
Altro apprendimento
Principi solidi di progettazione orientata agli oggetti
Introduzione assoluta alla programmazione orientata agli oggetti in Java
Java – Programmazione orientata agli oggetti
Pochi altri articoli per migliorare le tue capacità di programmazione e progettazione orientata agli oggetti
.orientata agli oggetti e le competenze di progettazione
Top 10 principi di progettazione orientata agli oggetti che il programmatore Java dovrebbe conoscere
Perché preferire la composizione all’ereditarietà in Java
Differenza tra overloading e overriding in Java
Top 10 domande di intervista su classi astratte e interfacce
20 domande su Java design pattern e Software Design