Gegenstand-Kopie

Eine Gegenstand-Kopie ist eine Handlung in der Computerwissenschaft, wo ein Datengegenstand seine Attribute zu einem anderen Gegenstand desselben Datentyps kopieren ließ. Ein Gegenstand ist ein zerlegbarer Datentyp auf objektorientierten Programmiersprachen. Das Kopieren von Daten ist eines der allgemeinsten Verfahren, das in Computerprogrammen vorkommt. Ein Gegenstand kann kopiert werden, um alle oder einen Teil seiner Daten in einem neuen Zusammenhang wiederzuverwenden.

Methoden zu kopieren

Die Designabsicht von den meisten Gegenständen ist, den Anschein zu geben, aus einem monolithischem Block gemacht zu werden, wenn auch die meisten nicht sind. Da Gegenstände aus mehreren verschiedenen Teilen zusammengesetzt werden, wird das Kopieren nicht trivial. Mehrere Strategien bestehen, um dieses Problem anzugreifen.

Denken Sie zwei Gegenstände, A und B, den jeder auf zwei Speicherblöcke x und y (ich = 1, 2...) verweist. Denken Sie an A und B als Schnuren und x und y (ich = 1, 2...) als die Charaktere, die sie enthalten. Es gibt verschiedene Strategien, für in B zu kopieren.

Seichte Kopie

Eine Methode, einen Gegenstand zu kopieren, ist die seichte Kopie. In diesem Prozess wird B demselben Speicherblock wie A beigefügt. Das ist als Adresskopie sonst bekannt.

Das läuft auf eine Situation hinaus, in der dieselben Daten zwischen A geteilt wird und B, so denjenigen modifizierend, den anderen verändern wird. Auf den ursprünglichen Speicherblock von B wird jetzt von überall her nicht mehr verwiesen. Wenn die Sprache automatische Müll-Sammlung nicht hat, ist der ursprüngliche Speicherblock von B wahrscheinlich durchgelassen worden.

Der Vorteil von seichten Kopien besteht darin, dass ihre Ausführungsgeschwindigkeit schnell ist und von der Größe der Daten nicht abhängt.

Kopien von Bitwise von Gegenständen, die aus einem monolithischen Block nicht zusammengesetzt werden, sind seichte Kopien.

Tiefe Kopie

Eine Alternative ist eine tiefe Kopie. Hier werden die Daten wirklich kopiert. Das Ergebnis ist vom Ergebnis verschieden, das eine seichte Kopie gibt. Der Vorteil besteht darin, dass A und B von einander, aber auf Kosten einer langsameren teureren Kopie nicht abhängen.

Faule Kopie

Eine faule Kopie ist eine Kombination von beiden Strategien oben. Wenn man einen Gegenstand am Anfang kopiert, wird eine (schnelle) seichte Kopie verwendet. Ein Schalter wird auch verwendet, um zu verfolgen, wie viele Gegenstände die Daten teilen. Wenn das Programm einen Gegenstand modifizieren will, kann es bestimmen, ob die Daten (durch das Überprüfen des Schalters) geteilt werden und eine tiefe Kopie nötigenfalls tun können.

Faule Kopie achtet auf die Außenseite ebenso eine tiefe Kopie, aber nutzt die Geschwindigkeit einer seichten Kopie wann immer möglich aus. Die Kehrseite ist ziemlich hohe, aber unveränderliche Grundkosten wegen des Schalters. Außerdem in bestimmten Situationen können kreisförmige Verweisungen auch Probleme verursachen.

Faule Kopie ist mit copy-write verbunden.

Durchführung

Fast alle objektorientierten Programmiersprachen stellen eine Weise zur Verfügung, Gegenstände zu kopieren. Als die Mehrheit von Sprachen stellen die meisten Gegenstände selbst nicht zur Verfügung, der Programmierer muss definieren, wie ein Gegenstand kopiert werden sollte, gerade als er oder sie definieren muss, wenn zwei Gegenstände identisch oder sogar an erster Stelle vergleichbar sind. Viele Sprachen stellen etwas Verzug-Verhalten zur Verfügung.

Wie das Kopieren gelöst wird, ändert sich von der Sprache bis Sprache, und welches Konzept eines Gegenstands es hat. Die folgenden Geschenk-Beispiele für zwei der am weitesten verwendeten objektorientierten Sprachen, C ++ und Java, das fast jede Weise bedecken sollte, wie eine objektorientierte Sprache dieses Problem angreifen kann.

In C ++

C ++ wird entworfen, so dass benutzerbestimmte Typen im Stande sein sollten, genau wie heimische Typen wie Rotforelle und interne Nummer zu fungieren. Ein Weg, auf den C ++ das erreicht, ist, indem er jeder Klasse erlaubt wird, einen Kopie-Konstrukteur und einen Anweisungsmaschinenbediener zu definieren. C ++ stellt Verzug-Versionen von diesen zur Verfügung, die eine Memberwise-Kopie durchführen, aber jede Klasse ist frei, das Kopieren unbrauchbar zu machen oder sein eigenes Kopie-Verhalten zu definieren.

In Java

Unterschiedlich in C ++ wird auf Gegenstände in Java immer indirekt durch Verweisungen zugegriffen. Gegenstände werden implizit nie geschaffen, aber werden immer stattdessen passiert oder durch eine Bezugsvariable zugeteilt. (Methoden in Java sind immer gehen an Wert jedoch vorbei, es ist der Wert der Bezugsvariable, die passiert wird.) Java führt Virtuelle Maschine Müll-Sammlung, so dass Gegenstände aufgeräumt werden, nachdem sie nicht mehr erreichbar sind. Es gibt keine automatische Weise, jeden gegebenen Gegenstand in Java zu kopieren.

Das Kopieren wird gewöhnlich von einem Klon Methode einer Klasse durchgeführt. Diese Methode nennt gewöhnlich abwechselnd den Klon Methode seiner Elternteilklasse, eine Kopie zu erhalten, und tut dann irgendwelche kundenspezifischen kopierenden Verfahren. Schließlich bekommt das dem Klon Methode dessen (die oberste Klasse), der ein neues Beispiel derselben Klasse wie der Gegenstand schafft und alle Felder zum neuen Beispiel (eine "seichte Kopie") kopiert. Wenn diese Methode verwendet wird, muss die Klasse die Anschreiber-Schnittstelle durchführen, oder es CloneNotSupportedException werfen wird. Nach dem Erreichen einer Kopie von der Elternteilklasse ein eigener Klon einer Klasse kann Methode dann kundenspezifische Klonen-Fähigkeit, wie das tiefe Kopieren zur Verfügung stellen (d. h. einige der Strukturen kopieren, die auf durch den Gegenstand verwiesen sind), oder das Geben des neuen Beispiels ein neuer einzigartiger Personalausweis.

Ein Nachteil ist, dass der Rücktyp des Klons ist, und zurück in den passenden Typ (technisch ein kundenspezifischer Klon ausführlich geworfen werden muss , konnte Methode einen anderen Typ des Gegenstands zurückgeben; aber das ist allgemein nicht ratsam). Ein Vorteil, Klon zu verwenden, besteht darin, dass, da es eine overridable Methode ist, wir Klon auf jedem Gegenstand nennen können, und es den Klon Methode seiner wirklichen Klasse ohne den Benennen-Code verwenden wird, der wissen muss, was diese Klasse ist (der mit einem Kopie-Konstrukteur notwendig sein würde).

Ein anderer Nachteil ist, dass man häufig auf den Klon Methode auf einem abstrakten Typ nicht zugreifen kann. Die meisten Schnittstellen und abstrakte Klassen in Java geben keinen öffentlichen Klon Methode an. Infolgedessen häufig die einzige Weise, den Klon zu verwenden, besteht Methode darin, wenn die wirkliche Klasse eines Gegenstands bekannt ist, der gegen den Abstraktionsgrundsatz ist, den allgemeinsten möglichen Typ zu verwenden. Zum Beispiel, wenn man eine Listenverweisung in Java hat, kann man nicht Klon auf dieser Verweisung anrufen, weil Liste keinen öffentlichen Klon Methode angibt. Wirkliche Durchführungen der Liste wie ArrayList und LinkedList alle haben allgemein Klon Methoden selbst, aber es ist ungünstige und schlechte Abstraktion, um um den wirklichen Klassentyp eines Gegenstands zu tragen.

Eine andere Weise, Gegenstände in Java zu kopieren, soll sie durch die Schnittstelle in Fortsetzungen veröffentlichen. Das wird normalerweise für die Fortsetzung und Leitungsprotokoll-Zwecke verwendet, aber sie schafft wirklich Kopien von Gegenständen und, verschieden vom Klon ist eine tiefe Kopie, die anmutig periodisch wiederholte Graphen von Gegenständen behandelt, mit der minimalen Anstrengung vom Programmierer sogleich verfügbar.

Beide dieser Methoden leiden unter einem bemerkenswerten Problem: Der Konstrukteur wird für Gegenstände nicht verwendet, die mit dem Klon oder der Anordnung kopiert sind. Das kann zu Programmfehlern mit unpassend initialisierten Daten führen, verhindert den Gebrauch von Mitglied-Feldern, und macht das Wartungsherausfordern. Einige Dienstprogramme versuchen, diese Probleme durch das Verwenden des Nachdenkens zu überwinden, um Gegenstände, wie allgemeine tiefe Kopie und die tief klonende Bibliothek tief zu kopieren.

In Eiffel

Laufzeitgegenstände in Eiffel sind entweder indirekt durch Verweisungen oder als ausgebreitete Gegenstände zugänglich, deren Felder innerhalb der Gegenstände eingebettet werden, die sie verwenden. D. h. Felder eines Gegenstands werden entweder äußerlich oder innerlich versorgt.

Die Eiffel Klasse enthält Eigenschaften für das seichte und tiefe Kopieren und Klonen von Gegenständen. Alle Eiffel Klassen erben davon, so sind diese Eigenschaften innerhalb aller Klassen verfügbar und sind anwendbar, sowohl um Verweise anzubringen, als auch ausgebreitete Gegenstände.

Die Eigenschaft bewirkt eine seichte, Feld-für-Feld-Kopie von einem Gegenstand bis einen anderen. In diesem Fall wird kein neuer Gegenstand geschaffen. Wenn dazu kopiert wurden, dann wird in denselben Gegenständen, die durch vor der Anwendung dessen Verweise angebracht sind, auch dadurch Verweise angebracht, nachdem die Eigenschaft vollendet.

Um die Entwicklung eines neuen Gegenstands zu bewirken, der ein seichtes Duplikat dessen ist, wird die Eigenschaft verwendet. In diesem Fall wird ein einzelner neuer Gegenstand mit seinen zu denjenigen der Quelle identischen Feldern geschaffen.

Die Eigenschaft verlässt sich auf die Eigenschaft, die in Nachkommen nötigenfalls wiederdefiniert werden kann. Das Ergebnis dessen ist des verankerten Typs.

Tief können das Kopieren und das Schaffen tiefer Zwillinge mit den Eigenschaften getan und, wieder von der Klasse geerbt werden. Diese Eigenschaften haben das Potenzial, um viele neue Gegenstände zu schaffen, weil sie alle Gegenstände in einer kompletten Gegenstand-Struktur kopieren. Weil neue Doppelgegenstände geschaffen werden, anstatt einfach Verweisungen auf vorhandene Gegenstände zu kopieren, werden tiefe Operationen eine Quelle von Leistungsproblemen mehr sogleich werden als seichte Operationen.

Auf anderen Sprachen

In C Sharp (C#), anstatt die Schnittstelle zu verwenden, kann eine allgemeine Erweiterungsmethode verwendet werden, um eine tiefe Kopie mit dem Nachdenken zu schaffen. Das hat zwei Vorteile: Erstens stellt es die Flexibilität zur Verfügung, um jeden Gegenstand zu kopieren, ohne jedes Eigentum und manuell zu kopierende Variable angeben zu müssen. Zweitens, weil der Typ allgemein ist, stellt der Bearbeiter sicher, dass der Bestimmungsort-Gegenstand und der Quellgegenstand denselben Typ haben.

Im Ziel-C werden die Methoden und durch alle Gegenstände geerbt und beabsichtigt, um Kopien durchzuführen; der Letztere ist, für einen veränderlichen Typ des ursprünglichen Gegenstands zu schaffen. Diese Methoden rufen der Reihe nach und Methoden, beziehungsweise das Kopieren durchzuführen. Ein Gegenstand muss die entsprechende Methode durchführen, copyable zu sein.

In OCaml die Bibliotheksfunktion führt Oo.copy das seichte Kopieren eines Gegenstands durch.

In PHP führt das Schlüsselwort das seichte Kopieren object.http://www.php.net/manual/en/language.oop5.cloning.php durch Programmierer können eine spezielle Methode in einem Gegenstand definieren, kundenspezifische kopierende Durchführung zur Verfügung zu stellen.

In der Pythonschlange stellt das Kopie-Modul der Bibliothek seichte Kopie und tiefe Kopie von Gegenständen durch und Funktionen beziehungsweise zur Verfügung. Programmierer können spezielle Methoden und in einem Gegenstand definieren, kundenspezifische kopierende Durchführung zur Verfügung zu stellen.

Im Rubin erben alle Gegenstände zwei Methoden, um seichte Kopien, Klon und dup durchzuführen. Die zwei Methoden unterscheiden sich darin kopiert einen verdorbenen staatlichen, eingefrorenen Staat eines Gegenstands und irgendwelche Singleton-Methoden, die er, wohingegen Kopien nur sein verdorbener Staat haben kann. Tiefe Kopien können durch das Abladen und das Laden eines Byte-Stroms oder YAML eines Gegenstands serialization.http://www.ruby-doc.org/docs/ProgrammingRuby/html/classes.html#S5 erreicht werden

Siehe auch


Sittard / Der Garten von Cyrus
Impressum & Datenschutz