2010-07-28 12 views
5

Biorąc pod uwagę obiekt, który ma zmienną, której nie jest właścicielem; to znaczy, zmienna jest składana przez aggregation zamiast composition. Czy operacja kopiowania głębokiego skopiuje zmienną lub tylko link do niej?Czy operacja kopiowania głębokiego rekursywnie kopiuje zmienne, których nie jest właścicielem?

+0

Być może jest to wystarczająco głęboka/płytka kwestia pytań - chyba że jesteście gotowi do dokładniejszego zdefiniowania swoich warunków. –

+0

@Neil Butterworth: Właśnie tego chciałbym się nauczyć. Mam wrażenie, że głęboka i płytka kopia to luźno określone terminy. W odpowiedziach na moje oryginalne pytanie dotyczące [Copy constructor versus Clone] (http://stackoverflow.com/questions/3345389/copy-constructor-versus-clone) wszyscy zgodzili się, że jest to ważna różnica, chociaż myślę, że jest tylko jeden jeden sposób kopiowania obiektów, który jest ogólnie przydatny. Dlatego rozpocząłem małe śledztwo po tym, co powszechnie rozumiane jest przez "głęboką kopię" i "płytką kopię". –

Odpowiedz

4

Lubię rozróżnienie, że robisz tutaj między rolą kompozycji i sumowania w kontekście głębokiej kopii.

Mam zamiar pójść wbrew innej odpowiedzi i powiedzieć: nie, obiekt nie powinien głęboko kopiować innego obiektu, który nie jest jego własnością.

Można oczekiwać, że głęboka kopia obiektu będzie (przynajmniej początkowo) identyczna z oryginałem. Jeśli została sporządzona głęboka kopia odniesienia, której oryginał nie był właścicielem, pozostawia to otwartą kwestię tego, co jest właścicielem nowej kopii. Jeśli klon go posiada, to nie byłby identyczny z oryginalnym obiektem. Byłby to obiekt taki jak oryginał, z wyjątkiem tego, że posiada odniesienie do jednego z jego zagregowanych członków. To z pewnością doprowadziłoby do chaosu. Jeśli klon nie jest jego właścicielem, to kto to robi?

Ten problem własności jest szczególnie ważny w językach, które nie zbierają śmieci, ale stwarza również problemy nawet w przypadku garbage collectora. Na przykład, jeśli klon został wprowadzony, aby zezwolić na niezatwierdzone zmiany w obiekcie, czy dozwolone są zmiany na tym innym obiekcie, do którego się odnosi? Jeśli zmiany nie są dozwolone, nie było powodu, aby go kopiować. Jeśli zmiany są dozwolone, to w jaki sposób zmiany te mają zostać zatwierdzone, ponieważ modyfikowany obiekt nie steruje tym obiektem, do którego się odwołujemy? Jasne, mechanizm do tego może być wymyślony, ale byłoby to głupio oznaczać, że sklonowany obiekt przekracza swoje obowiązki, a program byłby koszmarem utrzymania.

Operacja głębokiego kopiowania obejmująca odjęte obiekty prowadzi również do problemów związanych z nieskończonymi (lub przynajmniej nadmiernymi) operacjami kopiowania. Załóżmy, że obiekt jest częścią kolekcji, a następnie przypuśćmy, że obiekt wymaga odwołania do kolekcji. Naiwna operacja kopiowania w tym obiekcie tworzyłaby wówczas nową kopię kolekcji i każdego z jej członków. Nawet zakładając, że unikamy problemu nieskończonej rekurencji i zachowujemy wszystkie odniesienia spójne w tym nowym zestawie obiektów, to nadal jest on nadmierny w większości celów, a w przypadkach, w których pożądana jest nowa kolekcja, nie miałby większego sensu do kopiowania samej kolekcji, a nie jednego z jej członków, w tym celu?

Uważam, że głęboka kopia, która obejmuje tylko posiadane przedmioty, jak sugerujesz, jest jedynym rozsądnym podejściem do większości celów.

+0

Dziękujemy za wspaniałą odpowiedź! Szczególnie podoba mi się twój przykład nieskończonej rekurencji podczas tworzenia głębokiego klonu. Jest to rzeczywiście przypadek, który wymaga rekursji głębokiego kopiowania, aby pominąć zagregowane obiekty. –

+0

Jak podoba mi się moja odpowiedź na http://stackoverflow.com/a/12187738/363751 na podobne pytanie? – supercat

1

Głębokie kopie w przeciwieństwie do płytkich powinny kopiować cały obiekt rekursywnie na ziemię i tworzyć całkowicie nową kopię obiektu i wszystkich zawartych obiektów.

Więc tak, należy skopiować zmiennych, nie tylko linki ..

Powiązane problemy