Deep Copy vs Shallow Copy
Gün 2: Nesne Yönelimli Programlama (OOP) | Derin kopya ve sığ kopya arasındaki farklar
Kaynak Kod
// =============================================================================
// GUN 2 - Konu 7: Derin Kopya (Deep Copy) vs Sig Kopya (Shallow Copy)
// =============================================================================
class Payload;
int data [$];
function new();
data = {};
endfunction
function void add(int val);
data.push_back(val);
endfunction
function void display(string prefix = "");
$display(" %sPayload: %p", prefix, data);
endfunction
endclass
class Packet;
int id;
string name;
Payload payload; // Baska bir nesneye referans (handle)
function new(int id, string name);
this.id = id;
this.name = name;
this.payload = new();
endfunction
// Sig Kopya: Ic nesneler kopyalanmaz, referanslar paylasilir
function Packet shallow_copy();
Packet p = new(this.id, this.name);
p.payload = this.payload; // AYNI nesneye referans
return p;
endfunction
// Derin Kopya: Ic nesneler de kopyalanir
function Packet deep_copy();
Packet p = new(this.id, this.name);
p.payload = new(); // YENI nesne olustur
foreach (this.payload.data[i])
p.payload.add(this.payload.data[i]);
return p;
endfunction
function void display(string prefix = "");
$display(" %sPacket: id=%0d, name=%s", prefix, id, name);
payload.display({prefix, " "});
endfunction
endclass
module deep_copy_vs_shallow_copy;
initial begin
Packet original, shallow, deep;
$display("=== Deep Copy vs Shallow Copy ===\n");
// --- Orijinal nesne ---
original = new(1, "orijinal");
original.payload.add(10);
original.payload.add(20);
original.payload.add(30);
$display("--- Orijinal ---");
original.display();
// --- Sig Kopya ---
$display("\n--- Sig Kopya (Shallow Copy) ---");
shallow = original.shallow_copy();
shallow.id = 2;
shallow.name = "sig_kopya";
$display("Kopyalama sonrasi:");
shallow.display(" Shallow: ");
original.display(" Original: ");
// Shallow kopyanin payload'ini degistir
shallow.payload.add(999);
$display("\nShallow payload'a 999 eklendi:");
shallow.display(" Shallow: ");
original.display(" Original: ");
$display(" ^^^ ORIJINAL DE DEGISTI! (Ayni referans)");
// --- Derin Kopya ---
$display("\n--- Derin Kopya (Deep Copy) ---");
original = new(1, "orijinal");
original.payload.add(10);
original.payload.add(20);
original.payload.add(30);
deep = original.deep_copy();
deep.id = 3;
deep.name = "derin_kopya";
$display("Kopyalama sonrasi:");
deep.display(" Deep: ");
original.display(" Original: ");
// Deep kopyanin payload'ini degistir
deep.payload.add(888);
$display("\nDeep payload'a 888 eklendi:");
deep.display(" Deep: ");
original.display(" Original: ");
$display(" ^^^ ORIJINAL ETKILENMEDI! (Bagimsiz kopya)");
// --- Handle atamasi (kopya degil!) ---
$display("\n--- Handle Atamasi (Kopya Degil!) ---");
begin
Packet a, b;
a = new(10, "A");
a.payload.add(100);
b = a; // Handle kopyalanir, nesne DEGIL
b.name = "B";
b.payload.add(200);
$display(" a ve b AYNI nesne:");
a.display(" a: ");
b.display(" b: ");
$display(" a === b ? %s", (a == b) ? "EVET (ayni referans)" : "HAYIR");
end
$display("\n=== Deep vs Shallow Copy Sonu ===");
$finish;
end
endmodule