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?
Odpowiedz
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.
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. –
Jak podoba mi się moja odpowiedź na http://stackoverflow.com/a/12187738/363751 na podobne pytanie? – supercat
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 ..
- 1. Dlaczego jQuery Extend Deep Copy nie rekursywnie kopiuje obiekt?
- 2. Obiekty głębokiego kopiowania w Angular
- 3. Jaki jest najłatwiejszy sposób głębokiego klonowania (kopiowania) zmiennego obiektu Scala?
- 4. Jak zmusić JavaScript do głębokiego kopiowania ciągu znaków?
- 5. Tablica do głębokiego kopiowania obiektów zagnieżdżonych w javascript
- 6. Kto jest właścicielem elementów sterujących?
- 7. Czy NSArray kopiuje obiekty?
- 8. Czy destruktor może rekursywnie?
- 9. Czy Java obsługuje zmienne zmienne?
- 10. Czy operacja numeryczna jest dozwolona w CSS?
- 11. Android UserManager: Sprawdź, czy użytkownik jest właścicielem (admin)
- 12. Jak ustalić, czy język jest rekurencyjny czy rekursywnie przeliczalny?
- 13. Czy istnieją platformy, dla których separatorem plików nie jest "/"?
- 14. Google Credential: to konto programisty nie jest właścicielem aplikacji
- 15. chown polecenia powrocie operacja nie jest dozwolone
- 16. Czy install_github rekursywnie instaluje zależności?
- 17. sendfile nie kopiuje zawartości pliku
- 18. Operacja context.getImageData() jest niezabezpieczona
- 19. Dependency Injection - Kto jest właścicielem interfejsu?
- 20. MSTest.exe nie kopiuje wszystkich potrzebnych bibliotek projektu?
- 21. Czy foreach kopiuje każdy element, jeśli jest to tablica struktur?
- 22. TeamCity nie kopiuje wszystkich bibliotek z odniesieniami
- 23. Czy literalne liczby są zmienne czy nie?
- 24. Ant - tylko plik kopiowania, nie katalog
- 25. Czy konieczne jest zmienne zmienne pętli zakresu w CFScript?
- 26. BCP nie zwraca błędów, ale także nie kopiuje żadnych wierszy.
- 27. C++: Czy wskaźnik char do konwersji std :: string kopiuje zawartość?
- 28. SecurityError: Operacja jest niezabezpieczona - window.history.pushState()
- 29. Unikanie powtarzania za pomocą soczewek podczas głębokiego kopiowania na Mapie wartości
- 30. Operacja Crossthread jest niepoprawna ... - VB.NET
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. –
@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ę". –