Menu
Coddy logo textTech

Ö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)
end

Anahtar 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ı: 1

Her 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.

challenge icon

Görev

Kolay

Her 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) kendi products tablosuna sahip olduğu ShoppingCart sı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
  • 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:

  1. Sepet A'ya eklenecek ilk ürün
  2. Sepet A'ya eklenecek ikinci ürün
  3. Sepet B'ye eklenecek ilk ürün
  4. Sepet B'ye eklenecek ikinci ürün

Ana dosyanızda (main file):

  1. İki alışveriş sepeti oluşturun: cartA ve cartB
  2. İlk iki ürünü cartA sepetine ekleyin
  3. Son iki ürünü cartB sepetine ekleyin
  4. Cart A: yazdırın ve ardından sepet A'nın ürünlerini listeleyin
  5. Cart 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
Eggs

Unutmayı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)
end

Anahtar 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ı: 1

Her ö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
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