Forum Informatica Unict

LAUREA TRIENNALE (D.M. 270/04) => Programmazione 1, 9 CFU => Topic started by: Giovi89 on 28-01-2009, 14:22:56



Title: aggragazione e composizione
Post by: Giovi89 on 28-01-2009, 14:22:56
Salve a tutti,
volevo essere chiarito la differenza tra aggregazione e composizione applicate ai diagramimi uml.....come si implementano nella stesura del codice? come se fossero delle classi normali oppure mettendo qualche parola chiave come extends o altro...???? Grazie anticipate..


Title: Re:aggragazione e composizione
Post by: Fr3d3R!K on 28-01-2009, 15:55:48
http://forum.sdai.unict.it/index.php?topic=1058.msg6306#msg6306


Title: Re:aggragazione e composizione
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 28-01-2009, 18:21:31
Ah, ok. Sisi, ora ricordo cosa sia l'aggregazione (grazie al tuo post in questo forum).

E mi ricordo anche dove è che avevo appreso per primo il significato dei termini aggregazione e composizione.
Purtropo in Java, per gli oggetti, non esiste il concetto di composizione.

È più facile vederlo in C++, dove una variabile può essere vista come di tipo istanza di qualcosa oppure puntatore/riferimento a istanza di qualcosa, ove qualcosa è un'area di memoria adibita a un certo scopo.

In questo codice si vede bene la differenza:
Code:
typedef class CMiaAltraClasse
{
private:
int m_valori [];
public:
//dichiarazione di costruttore
CMiaAltraClasse (int a, int b, int c);
} CMiaAltraClasse, * PCMiaAltraClasse;

//definizione del costruttore di CMiaAltraClasse
CMiaAltraClasse::CMiaAltraClasse (int a, int b, int c)
{
m_valori [0] = a;
m_valori [1] = b;
m_valori [2] = c;
}

typedef class CMiaClasse
{
public:
int m_a;
CMiaAltraClasse  m_classe_composta (1, 2, 3); //quest'oggetto esiste da questo istante e coincide col suo nome (m_classe_composta non è un riferimento che può essere assegnato a una nuova istanza di CMiaAltraClasse)
CMiaAltraClasse* m_classe_aggregata; //è solo un puntatore: l'oggetto vero non esiste finché non si fa un "new" oppure a m_classe_aggregata non si assegna un riferimento ad altra CMiaAltraClasse
//dichiarazione di costruttore
CMiaCLasse ();
} CMiaClasse, * PCMiaClasse;

//definizione del costruttore di CMiaClasse
CMiaClasse::CMiaClasse ()
{
m_classe_aggregata = new CMiaClasse (4, 5, 6);
}

Il tempo di vita di m_classe_aggregata (che è appunto aggregata) dipenderà da quando noi richiameremo una certa istruzione precisa delete di C++ che elimina fisicamente l'oggetto e rilascia la memoria allocata per esso, mentre il tempo di vita di m_classe_composta (che non è una variabile che punta a un oggetto CMiaAltraClasse, ma è proprio lei stessa un oggetto CMiaAltraClasse!) coincide col tempo di vita della classe che la contiene.

In parole povere, un oggetto che è "aggregato" nell'istanza di un oggetto di classe (anche diversa), vive indipendentemente dall'oggetto a cui è aggregato, ma è comunque "referenziata" (diciamo così) dalla prima.

Un oggetto che invece "compone" l'oggetto di una classe necessariamente diversa, vive assieme all'oggetto in cui viene creato, o ancora meglio, vive nello "scope" (campo di visibilità) di codice in cui viene creato.
(se avessi creato un oggetto composto dentro un for, fuori dal for non sarebbe più esistito e si sarebbe proprio distrutto fisicamente, non come in Java in cui devo aspettare un fantomatico garbage collector  :nono, sempre che nessun'altro lo referenzi .whistling... -ancora peggio-).

Ciò che ha detto Fr3d3R!K vi è sufficiente per comprendere la differenza tra i due termini, ma non è esaustivo (non per colpa sua, ma proprio per la natura slegata degli oggetti in Java), poiché UML è "generale" e non language-dependant  :nono.

Spero di non aver ingenerato ulteriore confusione con questa breve deviazione sul linguaggio C++ .ciaociao.


Title: Re:aggragazione e composizione
Post by: Fr3d3R!K on 29-01-2009, 11:49:04
io non ho citato il C/C++ perchè in questo corso (purtroppo) non viene trattato, ho voluto fare un esempio semplice e chiaro considerando solo il java. Figurati che sono sempre stato contro la scelta di avere i puntatori "nascosti" in java, non studiarli non ha permesso ad un collega (non ricordo chi) di capire bene la differenza tra clonare un oggetto e copiare il riferimento. Insomma sono tra i fan del C! :yoh :boh :pray


Title: Re:aggragazione e composizione
Post by: Alex_47 on 01-02-2009, 11:43:48
Scusa una domanda quando dobbiamo implementare le classi in codice java a differenza se c'è composizione o aggregazione dobbiamo usare extends oppure non centra niente?


Title: Re:aggragazione e composizione
Post by: Blonic on 01-02-2009, 15:09:28
Penso che in entrambi i casi non centri nulla, qualcuno confermi.


Title: Re:aggragazione e composizione
Post by: ciccio on 01-02-2009, 15:14:34
Penso che in entrambi i casi non centri nulla, qualcuno confermi.
.quoto


Title: Re:aggragazione e composizione
Post by: Vivynz on 01-02-2009, 15:53:15
non centra niente  :[Emoticon] Asd: extends si utilizza quando una classe eredita da un'altra!


Title: Re:aggragazione e composizione
Post by: Blonic on 01-02-2009, 16:37:41
Con aggregazione e composizione si intende che una classe è "un pezzo" di un'altra

Vedi l'esempio della macchina: le classi "ruota", "motore", "sportello", "parabrezza" hanno tutte una relazione di aggregazione con la classe "Automobile".
La differenza fra aggregazione e composizione è che nella seconda si implica anche che se non esistesse la classe "automobile" (nell'esempio) non esisterebbe neanche la sottoclasse composta.

Se non sbaglio è così, qualcuno confermi.


Title: Re:aggragazione e composizione
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 02-02-2009, 01:33:05
La differenza fra aggregazione e composizione è che nella seconda si implica anche che se non esistesse la classe "automobile" (nell'esempio) non esisterebbe neanche la sottoclasse composta.
Correggo questa tua descrizione con:
Quote
La differenza fra aggregazione e composizione è che nella seconda si implica anche che in ogni relazione di composizione se non esistesse una istanza della classe "Automobile""ruota" (nell'esempio) non esisterebbe neanche una istanza della sottoclasse composta "Automobile" .
Ricordando che la sola differenza tra oggetto della classe componente e oggetto della classe composta è che (a meno di altre relazioni a noi non note) un oggetto della classe "componente" potrebbe esistere indipendentemente da un oggetto della classe "composta", mentre un oggetto della classe "composta" implica --> che esista un oggetto della classe "componente" (perché il "componente" appunto "la compone").
 .ciaociao


Title: Re:aggragazione e composizione
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 02-02-2009, 01:42:16
Un esempio migliore di quello dell'automobile (che si presta a facili ironie specie se si abita a Librino) poiché potrebbero esistere automobili senza parabrezza .whistling o senza ruote .huh, è quello di una parete di mattoni e i mattoni.

Considerando di descrivere i due oggetti con le classi rispettivamente PareteDiMattoni e Mattone risulta chiaro che una istanza della classe Mattone (cioè un "mattone") può esistere tranquillamente da qualsiasi parte nell'universo senza altre costrizioni, mentre una istanza della classe PareteDiMattoni (cioè una "parete di mattoni") non può esistere senza istanze della classe Mattone (cioè senza "mattoni").
In più (e questo mette in risalto la natura "componitiva" della relazione tra PareteDiMattoni e Mattone, piuttosto che di quella aggregativa), se ho una istanza della classe PareteDiMattoni (cio è una "parete di mattoni") ho sempre e sicuramente (costrizione "forte" che suggerisce l'implicazione) delle istanze della classe Mattoni (cioè dei "mattoni").