2010-07-28 17 views
5

Dato un oggetto che ha una variabile che non possiede; ovvero, la variabile è composta da aggregation anziché da composition. Un'operazione di copia profonda copierà la variabile o solo il collegamento ad essa?Un'operazione di copia profonda copia ricorsivamente le sotto-variabili che non possiede?

+0

Forse è sufficiente una domanda di copia profonda/superficiale, a meno che non siate disposti a definire i termini in modo molto più chiaro. –

+0

@Neil Butterworth: In effetti, è proprio quello che mi piacerebbe imparare. Ho l'impressione che la copia profonda e superficiale siano termini definiti in modo approssimativo. Nelle risposte alla mia domanda iniziale su [Copia costruttore contro Clone] (http://stackoverflow.com/questions/3345389/copy-constructor-versus-clone) tutti hanno concordato che è una differenza importante, anche se penso che ci sia solo un unico modo per copiare oggetti che è generalmente utile. Ecco perché ho iniziato una piccola indagine dopo ciò che è comunemente inteso da "deep copy" e "shallow copy". –

risposta

4

mi piace la distinzione che si stanno facendo qui tra il ruolo di composizione e aggregazione nel contesto di una copia profonda.

Ho intenzione di andare contro l'altra risposta e di dire: no, un oggetto non deve copiare in profondità un altro oggetto che non possiede.

Ci si aspetterebbe che una copia profonda di un oggetto sia (almeno inizialmente) identica all'originale. Se una copia profonda era fatta di un riferimento che l'originale non possedeva, allora questo lascia aperta la domanda su cosa possiede la nuova copia. Se il clone lo possiede, non sarebbe identico all'oggetto originale. Sarebbe un oggetto come l'originale, tranne che possiede il riferimento a uno dei suoi membri aggregati. Questo sicuramente porterebbe al caos. Se il clone non lo possiede, allora chi lo fa?

Questo problema di proprietà è particolarmente importante nei linguaggi non recuperati, ma crea anche problemi con un garbage collector. Ad esempio, se il clone viene creato per consentire modifiche non vincolate a un oggetto, è consentito apportare modifiche su questo altro oggetto a cui fa riferimento? Se le modifiche non sono consentite, non c'era motivo di copiarlo in profondità. Se le modifiche sono consentite, come vengono commesse tali modifiche, poiché l'oggetto che si sta modificando non controlla questo oggetto di riferimento? Certo, un meccanismo per questo potrebbe essere inventato, ma significherebbe senz'altro che l'oggetto clonato sta oltrepassando le sue responsabilità, e il programma sarebbe un incubo di manutenzione.

Un'operazione di copia profonda che include oggetti non associati comporta anche problemi di operazioni di copia infinite (o almeno eccessive). Supponiamo che un oggetto sia parte di una collezione e supponiamo inoltre che l'oggetto richieda un riferimento alla collezione. Un'ingenua operazione di copia profonda su quell'oggetto creerebbe quindi una nuova copia della raccolta e ciascuno dei suoi membri. Anche supponendo di evitare il problema della ricorsione infinita e di mantenere tutti i riferimenti coerenti tra questo nuovo insieme di oggetti, è ancora eccessivo per la maggior parte degli scopi, e per quei casi in cui si desidera una nuova collezione, non avrebbe più senso copiare a fondo la raccolta stessa, piuttosto che uno dei suoi membri, per questo scopo?

Penso che un deep-copy che include solo oggetti di proprietà, come suggerisci tu, è l'unico approccio sano per la maggior parte degli scopi.

+0

Grazie per la tua grande risposta! Mi piace particolarmente il tuo esempio di ricorsione infinita mentre creo un clone profondo. Questo è davvero un caso che richiede la ricorsione della copia profonda per saltare gli oggetti aggregati. –

+0

Come ti piace la mia risposta su http://stackoverflow.com/a/12187738/363751 a una domanda simile? – supercat

1

La copia profonda in oposite in quella superficiale dovrebbe copiare l'intero oggetto in modo ricorsivo sul terreno e creare una copia completamente nuova dell'oggetto e di tutti gli oggetti contenuti.

Quindi sì, si deve copiare le variabili, non solo i link ..

Problemi correlati