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ı: 5Her 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.
Görev
KolayAynı 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) deseniyleWalletsınıfınızı tanımlayın. Her cüzdan kendibalancedeğ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
- Cüzdanı verilen miktarla başlatan bir
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:
- Cüzdan A için başlangıç bakiyesi
- Cüzdan B için başlangıç bakiyesi
- Cüzdan A'ya eklenecek miktar
- Cüzdan B'den harcanacak miktar
Ana dosyanızda (main file):
- İlk başlangıç bakiyesi ile
walletAnesnesini oluşturun - İkinci başlangıç bakiyesi ile
walletBnesnesini oluşturun - Belirtilen miktarı
walletAnesnesine ekleyin - Belirtilen miktarı
walletBnesnesinden harcayın - 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: 40Cü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ı: 5Her 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]"
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
1'Self' Kavramı
Fonksiyonlu TablolarAçık 'self'İki Nokta SözdizimiNokta vs İki NoktaÖzet - Hareket Eden Nokta4Proje: Dijital Banka
Proje KurulumuPara Yatırma Metodu7Çok Biçimlilik ve Geçersiz Kılma
Metotları Geçersiz KılmaÜst Sınıf Metotlarını ÇağırmaDuck TypingOrtak ArayüzTür KontrolüÖzet - Çalışan Rolleri2Sınıf Prototip Kalıbı
Prototip Kavramı__index ile Bağlama:new() KurucusuÖznitelikleri BaşlatmaBağımsız ÖrneklerÖzet - Araba Fabrikası5OOP'de Operatör Aşırı Yükleme
Nesneleri ToplamaNesneleri ÇıkarmaNesneleri BirleştirmeNesneleri Karşılaştırma (<, >)Özet - Cüzdan Matematiği8Kapsülleme
Adlandırma KurallarıGizlilik için Closure'larClosure'lar Aracılığıyla ErişimSalt Okunur TablolarDoğrulama MantığıÖzet - Güvenli Kasa11Tasarım Kalıpları (Lite)
Fabrika FonksiyonlarıSingleton TablosuIterator KalıbıObserver (Dinleyici)Özet - Logger Fabrikası3Nesne Durumu ve Davranışı
Örnek DeğişkenleriGetter MetotlarıSetter MetotlarıHesaplanmış ÖzelliklerString BiçimlendirmeEşitlik KontrolleriÖzet - Öğrenci Notu6Kalıtımın Temelleri
Kalıtım KurulumuMetot KalıtımıConstructor'ı GenişletmeAlt Sınıf Metotları EklemePaylaşılan ve BenzersizÖzet - Şekil Hiyerarşisi