Gegeben ein Objekt, das eine Variable besitzt, die es nicht besitzt; Das heißt, die Variable besteht aus aggregation statt composition. Wird bei einem tiefen Kopiervorgang die Variable oder nur der Link zu ihr kopiert?Kopiert eine tiefe Kopieroperation Untervariablen rekursiv, die ihr nicht gehören?
Antwort
Ich mag die Unterscheidung, die Sie hier zwischen der Rolle der Zusammensetzung und Aggregation im Zusammenhang mit einer tiefen Kopie machen.
Ich werde gegen die andere Antwort gehen und sagen: Nein, ein Objekt sollte ein anderes Objekt, das es nicht besitzt, nicht tief kopieren.
Man würde erwarten, dass eine tiefe Kopie eines Objekts (zumindest anfänglich) mit dem Original identisch ist. Wenn eine tiefe Kopie einer Referenz erstellt wurde, die das Original nicht besaß, bleibt die Frage offen, was die neue Kopie besitzt. Wenn der Klon es besitzt, wäre es nicht identisch mit dem ursprünglichen Objekt. Es wäre ein Objekt wie das Original, außer dass es den Verweis auf eines seiner aggregierten Mitglieder besitzt. Dies würde sicherlich zu Chaos führen. Wenn der Klon es nicht besitzt, wer dann?
Dieses Problem der Eigentumsrechte ist besonders in Nicht-Garbage-Collected-Sprachen wichtig, verursacht aber auch Probleme mit einem Garbage Collector. Wenn der Klon beispielsweise nicht festgeschriebene Änderungen an einem Objekt zulässt, müssen Änderungen an diesem anderen Objekt zulässig sein, auf das es verweist? Wenn Änderungen nicht erlaubt sind, gab es keinen Grund, sie tief zu kopieren. Wenn Änderungen erlaubt sind, wie sollen diese Änderungen festgeschrieben werden, da das Objekt, das geändert wird, dieses referenzierte Objekt nicht steuert? Sicher, ein Mechanismus dafür könnte erfunden werden, aber es würde sicher bedeuten, dass das geklonte Objekt seine Verantwortung überschreitet, und das Programm wäre ein Wartungsalbtraum.
Ein Deep-Copy-Vorgang, der auch nicht zugeordnete Objekte enthält, führt ebenfalls zu Problemen mit unendlichen (oder zumindest übermäßigen) Kopiervorgängen. Angenommen, ein Objekt ist Teil einer Sammlung und nimmt ferner an, dass das Objekt eine Referenz auf die Sammlung benötigt. Eine naive Deep-Copy-Operation für dieses Objekt würde dann eine neue Kopie der Sammlung und jedes ihrer Mitglieder erstellen. Selbst unter der Annahme, dass wir das Problem der unendlichen Rekursion vermeiden und alle Verweise auf diese neue Gruppe von Objekten konsistent halten, ist es für die meisten Zwecke immer noch übertrieben, und für die Fälle, in denen eine neue Sammlung gewünscht wird, wäre es nicht sinnvoller die Sammlung selbst und nicht eines ihrer Mitglieder zu diesem Zweck zu vervielfältigen?
Ich denke, eine Deep-Kopie, die nur im Besitz befindliche Objekte enthält, wie Sie vorschlagen, ist der einzige vernünftige Ansatz für die meisten Zwecke.
Vielen Dank für Ihre tolle Antwort! Ich mag besonders dein Beispiel der unendlichen Rekursion, während du einen tiefen Klon machst. Dies ist in der Tat ein Fall, der erfordert, dass die Rekursion der tiefen Kopie aggregierte Objekte überspringt. –
Wie gefällt Ihnen meine Antwort auf http://StackOverflow.com/A/12187738/363751 auf eine ähnliche Frage? – supercat
Tiefe Kopie in Gegensatz zu flachen sollte das ganze Objekt rekursiv auf den Boden kopieren und eine komplett neue Kopie des Objekts und aller enthaltenen Objekte erstellen.
Also ja, sollte es Variablen kopieren, nicht nur Links ..
- 1. Rails gehören Javascripts Assets Ordner rekursiv
- 2. MySQL - Eine Baumstruktur rekursiv
- 3. Jsp gehören nicht funktioniert
- 4. NSIS - Wie wird rekursiv kopiert, während Dateien ausgeschlossen werden?
- 5. Wie kann ich die Farbe einer ungeordneten Liste ändern, die eine unbekannte Tiefe hat und rekursiv generiert wird?
- 6. jQuery Deep Clone ist nicht rekursiv
- 7. Deploy kopiert die Unterordner von app_data nicht
- 8. erstellen MSBuild-Aufgabe, die rekursiv kopiert einen Ordner mehrere Projekte in meiner Lösung
- 9. Facebook: Ihr Link nicht
- 10. Eine Baumansicht rekursiv erstellen
- 11. Ant Kompilierung kopiert nicht die Ressourcen
- 12. Rekursiv platzierte Komponenten, die
- 13. eine verkettete rekursiv reversed
- 14. wie Dateien im aktuellen Verzeichnis in s3 (und nicht rekursiv) enthalten und kopiert werden
- 15. die Pixel erhalten, die einer Form gehören,
- 16. OpenGL Framebuffer-Tiefe funktioniert nicht
- 17. eine Tiles Propagierung Attribut unten die Kette gehören
- 18. Finding Beitrag, die gehören nicht in den Rails auf Autor
- 19. Erhalten Datei Tiefe in Verzeichnisbaum
- 20. Warum hat die JVM eine maximale Inline-Tiefe?
- 21. angularjs - extend rekursiv
- 22. Wie erstelle ich eine tiefe, nicht veränderbare Sammlung?
- 23. Jitsi gehören externe Glas für die Anpassung
- 24. Erstellt Gorutine eine tiefe Kopie oder flache Kopie?
- 25. Einige Datacenter gehören nicht zur Preislokalisierungsgruppe
- 26. Wie testet ihr eine Zend_Form, die das CSRF-Formularelement enthält?
- 27. tiefe Kopie der Doktrin
- 28. Wie man manuell eine tiefe Kopie
- 29. PHP gehören nicht funktioniert - wegen der Serverkonfiguration?
- 30. Joomla gehören Datenbankfunktionen
Vielleicht sind das genug tiefe/flache Fragen - es sei denn, Sie sind bereit, Ihre Begriffe viel klarer zu definieren. –
@Neil Butterworth: Genau das würde ich gerne lernen. Ich habe den Eindruck, dass tiefe und oberflächliche Kopien lose definierte Begriffe sind. In den Antworten auf meine ursprüngliche Frage über [Konstruktor gegen Klon kopieren] (http://stackoverflow.com/questions/3345389/copy-constructor-versus-clone) stimmten alle zu, dass es ein wichtiger Unterschied ist, obwohl ich denke, dass es nur einen gibt Einfacher Weg zum Kopieren von Objekten, der allgemein nützlich ist. Deshalb habe ich nach dem, was man unter "Deep Copy" und "Shallow Copy" versteht, eine kleine Untersuchung gestartet. –