Örnek Değişkenleri
Coddy'nin Lua Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 12 / 70.
Nesnelerin kendi iç verilerini nasıl yönettiğine odaklanan yeni bir bölüme hoş geldiniz. Sınıflar ve örnekler oluşturmayı öğrendiniz; şimdi her bir örneğin kendi benzersiz durumunu nasıl sakladığını ve yönettiğini keşfetme zamanı.
Örnek değişkenleri (instance variables), yalnızca tek bir nesneye ait olan alanlardır. Bir metot veya yapıcı (constructor) içinde self.something ifadesine bir değer atadığınızda, bu veri sadece o belirli örnekte bulunur. Aynı sınıfa ait diğer nesnelerin kendi ayrı kopyaları vardır.
Bu, tablolar gibi karmaşık verileri depolarken özellikle önemli hale gelir. Her karakterin farklı eşyalar taşıdığı bir envanter sistemini düşünün:
local Inventory = {}
Inventory.__index = Inventory
function Inventory:new()
local instance = {}
setmetatable(instance, self)
instance.items = {} -- Her örnek kendi boş tablosunu alır
return instance
end
function Inventory:addItem(item)
table.insert(self.items, item)
endAnahtar satır instance.items = {} satırıdır. Yapıcı (constructor) içinde yeni bir boş tablo oluşturarak, her envanter nesnesi kendi ayrı listesini alır. Bunun yerine items değişkenini sınıf tablosunun kendisinde tanımlasaydınız, tüm örnekler (instances) yanlışlıkla aynı tabloyu paylaşırdı; bir karaktere kılıç eklemek onu herkese verirdi!
local bag1 = Inventory:new()
local bag2 = Inventory:new()
bag1:addItem("Sword")
bag2:addItem("Potion")
print(#bag1.items) -- Çıktı: 1
print(#bag2.items) -- Çıktı: 1Her envanter kendi koleksiyonunu tutar. Bu desen, bir örneğin bağımsız olarak değişen verileri (listeler, sayaçlar veya o nesneye özgü herhangi bir değiştirilebilir durum) izlemesi gerektiği her durumda uygulanır.
Görev
KolayHer bir sepetin kendi ayrı ürün listesini tuttuğu bir ShoppingCart sistemi kuralım. Bu, örnek değişkenlerinin (instance variables) verileri nesneler arasında nasıl izole tuttuğunu gösterecek; bir sepete ürün eklemek diğerini etkilemeyecek!
Kodunuzu iki dosya halinde düzenleyeceksiniz:
ShoppingCart.lua: Her bir örneğin (instance) kendiproductstablosuna sahip olduğuShoppingCartsınıfınızı tanımlayın. Şunları içermelidir:- Her sepet için boş bir ürün listesi başlatan bir
:new()yapıcı metodu (constructor) - Bu sepetin listesine bir ürün ekleyen bir
:addProduct(productName)metodu - Her bir ürünü ayrı bir satıra yazdıran bir
:listProducts()metodu
- Her sepet için boş bir ürün listesi başlatan bir
main.lua: ShoppingCart modülünüzü dahil edin (require) ve iki ayrı sepet oluşturun. Bağımsız envanterler tuttuklarını kanıtlamak için her sepete farklı ürünler ekleyin.
Dört girdi alacaksınız:
- Sepet A'ya eklenecek ilk ürün
- Sepet A'ya eklenecek ikinci ürün
- Sepet B'ye eklenecek ilk ürün
- Sepet B'ye eklenecek ikinci ürün
Ana dosyanızda (main file):
- İki alışveriş sepeti oluşturun:
cartAvecartB - İlk iki ürünü
cartAsepetine ekleyin - Son iki ürünü
cartBsepetine ekleyin Cart A:yazdırın ve ardından sepet A'nın ürünlerini listeleyinCart B:yazdırın ve ardından sepet B'nın ürünlerini listeleyin
Örneğin, girdiler Apple, Bread, Milk ve Eggs ise çıktı şu şekilde olmalıdır:
Cart A:
Apple
Bread
Cart B:
Milk
EggsUnutmayın: İşin püf noktası, products tablosunu yapıcı metodun (constructor) içinde yeni bir boş tablo olarak başlatmaktır. Bu, her sepet örneğinin tüm sepetler arasında tek bir tabloyu paylaşmak yerine kendi ayrı listesine sahip olmasını sağlar.
Kopya kağıdı
Örnek değişkenleri (Instance variables), yalnızca tek bir nesneye ait olan alanlardır. Bir metot veya yapıcı (constructor) içinde self.something ifadesine bir değer atadığınızda, bu veri yalnızca o belirli örnekte (instance) yaşar.
Örnek değişkenleri oluşturmak için, her örnek için yeni bir tablo kullanarak bunları yapıcı içinde başlatın:
local Inventory = {}
Inventory.__index = Inventory
function Inventory:new()
local instance = {}
setmetatable(instance, self)
instance.items = {} -- Her örnek kendi boş tablosunu alır
return instance
end
function Inventory:addItem(item)
table.insert(self.items, item)
endAnahtar nokta instance.items = {} ifadesidir; yapıcı içinde yeni bir boş tablo oluşturmak, her nesnenin kendi ayrı verisini almasını sağlar. Eğer items değişkenini sınıf tablosunun kendisinde tanımlasaydınız, tüm örnekler aynı tabloyu paylaşırdı.
local bag1 = Inventory:new()
local bag2 = Inventory:new()
bag1:addItem("Sword")
bag2:addItem("Potion")
print(#bag1.items) -- Çıktı: 1
print(#bag2.items) -- Çıktı: 1Her örnek kendi koleksiyonunu bağımsız olarak sürdürür. Bu desen, bir nesneye özgü olan her türlü değiştirilebilir durum (mutable state) için geçerlidir; listeler, sayaçlar veya örnek başına değişen diğer veriler.
Kendin dene
-- ShoppingCart modülünü dahil et
local ShoppingCart = require('ShoppingCart')
-- Girdileri oku
local product1 = io.read()
local product2 = io.read()
local product3 = io.read()
local product4 = io.read()
-- YAPILACAK: İki alışveriş sepeti oluştur: cartA ve cartB
-- YAPILACAK: product1 ve product2'yi cartA'ya ekle
-- YAPILACAK: product3 ve product4'ü cartB'ye ekle
-- YAPILACAK: "Cart A:" yazdır, ardından cartA'nın ürünlerini listele
-- YAPILACAK: "Cart B:" yazdır, ardından cartB'nın ürünlerini listele
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