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