Menu
Coddy logo textTech

Bağımsız Örnekler

Coddy'nin Lua Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 10 / 70.

Nesne yönelimli programlamanın kritik bir yönü, her örneğin (instance) kendi ayrı durumunu (state) korumasıdır. Aynı sınıftan iki nesne oluşturduğunuzda, bunlar tamamen bağımsızdır; birini değiştirmek diğerini etkilemez.

Şu örneği inceleyin:

local Counter = {}
Counter.__index = Counter

function Counter:new(start)
    local instance = {}
    setmetatable(instance, self)
    instance.value = start or 0
    return instance
end

function Counter:increment()
    self.value = self.value + 1
end

-- İki ayrı sayaç oluşturun
local counterA = Counter:new(10)
local counterB = Counter:new(5)

counterA:increment()
counterA:increment()

print(counterA.value)  -- Çıktı: 12
print(counterB.value)  -- Çıktı: 5

Her iki sayaç da aynı Counter sınıfından gelse de, counterA değerini artırmanın counterB üzerinde hiçbir etkisi yoktur. Her nesnenin kendi örnek tablosunda saklanan kendi value alanı vardır.

Bu bağımsızlık, nesneleri kullanışlı kılan şeydir. Bir oyunda, her biri kendi canını ve puanını takip eden düzinelerce oyuncu oluşturabilirsiniz. Her biri farklı bir bakiyeye sahip birden fazla banka hesabını yönetebilirsiniz.

Sınıf yapıyı ve davranışı tanımlar, ancak her örnek kendi verileriyle kendi hayatını yaşar.

challenge icon

Görev

Kolay

Aynı sınıftan nesnelerin gerçekten bağımsız hayatlar sürdüğünü kanıtlayalım! Bir Wallet sınıfı oluşturacak ve iki ayrı cüzdan örneği (instance) yaratacaksınız, ardından birindeki değişikliklerin diğerini etkilemediğini göstermek için bunları bağımsız olarak değiştireceksiniz.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • Wallet.lua: Standart yapıcı (constructor) deseniyle Wallet sınıfınızı tanımlayın. Her cüzdan kendi balance değerini takip etmelidir. Şunları içermelidir:
    • Cüzdanı verilen miktarla başlatan bir :new(startingBalance) yapıcısı
    • Bakiyeyi artıran bir :add(amount) metodu
    • Bakiyeyi azaltan bir :spend(amount) metodu
  • main.lua: Wallet modülünüzü dahil edin (require) ve iki ayrı cüzdan örneği oluşturun. Bağımsız durumlarını koruduklarını göstermek için her biri üzerinde farklı işlemler gerçekleştirin.

Dört girdi alacaksınız:

  1. Cüzdan A için başlangıç bakiyesi
  2. Cüzdan B için başlangıç bakiyesi
  3. Cüzdan A'ya eklenecek miktar
  4. Cüzdan B'den harcanacak miktar

Ana dosyanızda (main file):

  1. İlk başlangıç bakiyesi ile walletA nesnesini oluşturun
  2. İkinci başlangıç bakiyesi ile walletB nesnesini oluşturun
  3. Belirtilen miktarı walletA nesnesine ekleyin
  4. Belirtilen miktarı walletB nesnesinden harcayın
  5. Her iki bakiyeyi de ayrı satırlara yazdırın

Final bakiyelerini tam olarak şu formatta yazdırın:

Wallet A: [balance]
Wallet B: [balance]

Örneğin, girdiler 100, 50, 25 ve 10 ise, çıktı şöyle olmalıdır:

Wallet A: 125
Wallet B: 40

Cüzdan A'ya ekleme yapmanın cüzdan B'yi değiştirmediğine ve cüzdan B'den harcama yapmanın cüzdan A'yı etkilemediğine dikkat edin; her örnek kendi ayrı bakiyesini korur.

Kopya kağıdı

Bir sınıfın her örneği (instance) kendi ayrı durumunu (state) korur. Aynı sınıftan birden fazla nesne oluşturmak, tamamen bağımsız örneklerle sonuçlanır; birini değiştirmek diğerlerini etkilemez.

Örnek bağımsızlığını gösteren örnek:

local Counter = {}
Counter.__index = Counter

function Counter:new(start)
    local instance = {}
    setmetatable(instance, self)
    instance.value = start or 0
    return instance
end

function Counter:increment()
    self.value = self.value + 1
end

-- İki ayrı sayaç oluştur
local counterA = Counter:new(10)
local counterB = Counter:new(5)

counterA:increment()
counterA:increment()

print(counterA.value)  -- Çıktı: 12
print(counterB.value)  -- Çıktı: 5

Her nesnenin kendi verilerini saklayan kendi örnek tablosu vardır. Sınıf, yapıyı ve davranışı tanımlar, ancak her örnek bağımsız bir durum sürdürür.

Kendin dene

-- Wallet modülünü dahil et
local Wallet = require('Wallet')

-- Girdileri oku
local startingA = tonumber(io.read())
local startingB = tonumber(io.read())
local addAmount = tonumber(io.read())
local spendAmount = tonumber(io.read())

-- TODO: İlk başlangıç bakiyesi ile walletA'yı oluşturun

-- TODO: İkinci başlangıç bakiyesi ile walletB'yi oluşturun

-- TODO: Belirtilen miktarı walletA'ya ekleyin

-- TODO: Belirtilen miktarı walletB'den harcayın

-- TODO: Nihai bakiyeleri gerekli formatta yazdırın
-- Format: "Wallet A: [balance]" ve "Wallet B: [balance]"
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Object Oriented Programming bölümündeki tüm dersler