Questa aggregazione o composizione è questa?

2

Per quanto riguarda la mia comprensione della composizione, i bambini non possono esistere senza il genitore. Ma il mio istruttore suggerisce che il seguente esempio è un'aggregazione, voglio solo un altro parere.

class ItemForKids { }
class ItemForMen { }
class ItemForWomen { }
class PageContent {
    private:
        ItemForKids* itemForKids = NULL;
        ItemForMen* itemForMen = NULL;
        ItemForWomen* itemForWomen = NULL;
    public:
        PageContent() {
            this->itemForKids = new ItemForKids();
            this->itemForMen = new ItemForMen();
            this->itemForWomen = new ItemForWomen();
        }
        ~PageContent() {
            delete this->itemForKids;
            delete this->itemForMen;
            delete this->itemForWomen;
        }
}

2 domande:

  1. È sopra l'aggregazione di esempio o è composizione?
  2. Il mio istruttore suggerisce che se cambiamo i puntatori alla variabile regolare non è necessario inizializzare l'oggetto nel costruttore e quindi diventerà la composizione, è vero?
posta sallushan 30.06.2018 - 11:43
fonte

2 risposte

1

La distinzione tra aggregazione e composizione non è particolarmente rilevante nella pratica. In C ++, è meglio parlare di proprietà : chi possiede un particolare oggetto ed è responsabile della sua distruzione?

La maggior parte degli oggetti C ++ viene utilizzata in base al valore e pertanto viene distrutta automaticamente. Questo codice è equivalente al codice che hai postato nella domanda:

class ItemForKids { };
class ItemForMen { };
class ItemForWomen { };
class PageContent {
    private:
        ItemForKids itemForKids;
        ItemForMen itemForMen;
        ItemForWomen itemForWomen;
    public:
        // PageContent() default constructor
        // ~PageContent() default destructor
};

Il codice C ++ moderno cerca di fare il maggior numero possibile di valore perché la distruzione automatica rende la vita molto più semplice (e sradica una fonte comune di errori). Se l'utilizzo di un valore non è possibile direttamente, utilizziamo puntatori intelligenti come std::unique_ptr che distruggono l'oggetto puntato quando vengono distrutti.

Nella tua domanda la classe PageContent è responsabile per deleting i suoi membri itemForX , quindi questo può essere caratterizzato come "aggregazione". Il tuo istruttore è quindi per lo più corretto in questo caso. Questo è un caso semplice perché la classe costruisce ed elimina i suoi membri. Se la proprietà dei membri viene trasferita nella classe, ad es.

ProductPage(ItemForKids* itemForKids) {
  this->itemForKids = itemForKids;
}

allora questo è un caso più borderline. Direi che questo sarebbe ancora meglio descritto come aggregazione perché c'è ancora la proprietà (la responsabilità di eliminare), ma vedo che potrebbe essere discusso in modo diverso.

Quindi, alla fine, fai ciò che il tuo istruttore si aspetta che tu faccia, e dimenticati di "aggregazione" dopo il corso. Non è utile per la maggior parte della programmazione, soprattutto rispetto a concetti come la proprietà.

Si noti che l'aggregazione ha un significato correlato ma distinto nei sistemi di database (relazionali).

    
risposta data 30.06.2018 - 13:02
fonte
0

Questo è il motivo per cui preferirei non usare il termine composizione in un contesto di ingegneria del software. Apparentemente confonde anche il tuo insegnante.

Non importa se i membri sono istanziati in modo implicito o esplicito. Si parla di aggregazione quando la classe non le possiede, anzi quando la loro esistenza non dipende dall'esistenza della classe che fornisce semplicemente l'accesso ad esse. Con l'aggregazione la classe è solo un portale per gli oggetti aggregati.

L'esempio che fornisci è un caso di contenimento .

    
risposta data 30.06.2018 - 12:51
fonte

Leggi altre domande sui tag