0Pricing
Lua Academy · Ders

Oluşturucular ve new()

Örnekleri oluşturan ve başlatan oluşturucu işlevler yazın.

Oluşturucular ve new(), CoddyKit'te ücretsiz bir Lua Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Lua Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Lua Academy kursu toplamda 4 dersten oluşur.

Yapıcının Sorumluluğu

Bir yapıcı, bir örnek oluşturur ve başlatır. Başlangıç değerlerini alır, bunları doğrular, eksik alanlar için varsayılan değerleri ayarlar ve yeni örneği döndürür. İyi tasarlanmış bir yapıcı, her örneğin geçerli bir durumda başlamasını sağlar.

local Player = {}
Player.__index = Player

function Player.new(name, hp, mp)
  assert(type(name)=="string" and name~="","need name")
  return setmetatable({
    name = name,
    hp   = hp or 100,
    mp   = mp or 50,
    alive = true,
    items = {},
  }, Player)
end

local p = Player.new("Hero")
print(p.name, p.hp, p.mp)  -- Hero  100  50

Akıcı Yapıcı

Akıcı bir yapıcı, ayarlayıcı yöntemlerden self döndürerek oluşturma sırasında yöntem zincirlemesini mümkün kılar. Bu, Lua'daki bir oluşturucu kalıbıdır.

local Config = {}
Config.__index = Config

function Config.new()
  return setmetatable({_data={}}, Config)
end

function Config:set(k,v) self._data[k]=v; return self end
function Config:build() return self._data end

local cfg = Config.new()
  :set("host","localhost")
  :set("port",8080)
  :set("debug",true)
  :build()

print(cfg.host, cfg.port)

Kopya Yapıcı

Bir kopya yapıcı, mevcut bir örnekle aynı değerlere sahip yeni bir örnek oluşturur. Önemli: İç içe tabloların paylaşılması mı yoksa bağımsız olması mı gerektiğine bağlı olarak sığ veya derin kopya kullanın.

local function deepCopy(orig)
  if type(orig)~="table" then return orig end
  local copy = {}
  for k,v in pairs(orig) do copy[deepCopy(k)]=deepCopy(v) end
  return setmetatable(copy, getmetatable(orig))
end

local Item = {}
Item.__index = Item

function Item.new(name, stats)
  return setmetatable({name=name, stats=stats or {}}, Item)
end

function Item:clone()
  return deepCopy(self)
end

local sword = Item.new("Sword",{damage=50})
local clone = sword:clone()
clone.stats.damage = 30
print(sword.stats.damage)  -- 50 (unchanged)

Doğrulamalı Yapıcı

Yapıcı girdilerini her zaman doğrulayın. 2. düzeyde (çağıranı sorumlu tutarak) geçersiz girdiler için açıklayıcı hatalar oluşturun. Bu, hataları erkenden yakalar ve yararlı hata iletileri üretir.

local Rectangle = {}
Rectangle.__index = Rectangle

function Rectangle.new(w, h)
  assert(type(w)=="number" and w>0,"width must be positive number")
  assert(type(h)=="number" and h>0,"height must be positive number")
  return setmetatable({width=w, height=h}, Rectangle)
end

function Rectangle:area() return self.width * self.height end
function Rectangle:perimeter() return 2*(self.width+self.height) end

local r = Rectangle.new(5, 3)
print(r:area(), r:perimeter())  -- 15  16

Varsayılan Değerler Kalıbı

İsteğe bağlı yapıcı parametrelerini temiz bir şekilde işlemek için bir varsayılanlar tablosu kullanın. Bu, uzun x = x or default zincirlerini önler ve varsayılanları açıkça görünür ve kolayca değiştirilebilir hâle getirir.

local Sprite = {}
Sprite.__index = Sprite

local DEFAULTS = {x=0,y=0,rotation=0,scale=1,visible=true,alpha=1}

function Sprite.new(image, opts)
  local cfg = opts or {}
  local self = {image=image}
  for k,v in pairs(DEFAULTS) do
    self[k] = cfg[k] ~= nil and cfg[k] or v
  end
  return setmetatable(self, Sprite)
end

local s = Sprite.new("hero.png",{x=100,y=200})
print(s.x,s.y,s.scale)  -- 100 200 1

Statik Fabrika Yöntemleri

Bir sınıf, farklı oluşturma senaryoları için birden çok fabrika yöntemine sahip olabilir. Bu, tek bir yapıcıyı birçok isteğe bağlı parametreyle aşırı yüklemekten daha temizdir.

local Color = {}
Color.__index = Color

function Color.fromRGB(r,g,b)
  return setmetatable({r=r,g=g,b=b}, Color)
end

function Color.fromHex(hex)
  hex = hex:gsub("#","")
  return setmetatable({
    r=tonumber(hex:sub(1,2),16),
    g=tonumber(hex:sub(3,4),16),
    b=tonumber(hex:sub(5,6),16),
  }, Color)
end

function Color:toHex()
  return string.format("#%02X%02X%02X",self.r,self.g,self.b)
end

local red = Color.fromHex("#FF0000")
print(red:toHex())  -- #FF0000

Yapıcı Kayıt Defteri

Tüm örnekleri izlemek için bir kayıt defteri kullanın. Bu, "tümünü yok etme" veya bir türdeki tüm nesneler üzerinde yineleme yapma gibi genel işlemlere olanak tanır.

local Enemy = {}
Enemy.__index = Enemy
Enemy._all = {}

function Enemy.new(name, hp)
  local self = setmetatable({name=name, hp=hp}, Enemy)
  Enemy._all[#Enemy._all+1] = self
  return self
end

function Enemy.destroyAll()
  for _, e in ipairs(Enemy._all) do
    print("Destroying:", e.name)
  end
  Enemy._all = {}
end

Enemy.new("Goblin",30)
Enemy.new("Orc",80)
print("Count:", #Enemy._all)  -- 2
Enemy.destroyAll()

Tembel Başlatma

Bazı alanların hesaplanması maliyetlidir. Bunları ilk erişimde hesaplayıp önbelleğe almak için __index işlevini kullanın.

local BigData = {}
BigData.__index = function(t, k)
  if k == "processed" then
    print("Computing processed...")
    local result = {}
    for i,v in ipairs(rawget(t,"raw")) do result[i]=v*2 end
    rawset(t,"processed",result)
    return result
  end
end

function BigData.new(raw)
  return setmetatable({raw=raw}, BigData)
end

local d = BigData.new({1,2,3,4,5})
print(d.processed[3])  -- Computing...  6
print(d.processed[3])  -- 6 (cached, no recompute)

Örnekten Prototip

Aynı temel değerlere sahip başka bir örnek oluşturmak için bir örneği klonlayın. Klon, aynı üst veri tablosunu (aynı sınıfı) ve örnek verilerinin bir kopyasını alır. "Şablon" nesneler için kullanışlıdır.

local Unit = {}
Unit.__index = Unit

function Unit.new(t)
  return setmetatable({name=t.name,hp=t.hp,atk=t.atk}, Unit)
end

function Unit:clone()
  return Unit.new({name=self.name,hp=self.hp,atk=self.atk})
end

function Unit:__tostring()
  return self.name.."(HP:"..self.hp..",ATK:"..self.atk..")"
end

local template = Unit.new({name="Soldier",hp=100,atk=10})
local u1 = template:clone(); u1.name="Alpha"
local u2 = template:clone(); u2.name="Beta"
print(tostring(u1),tostring(u2))

Yapıcı Hatalarına Karşı Güvenlik

Oluşturma işlemi yarıda başarısız olursa (ör. kaynak ayırma sırasında), kısmen oluşturulmuş nesnelerin dışarı sızmadığından emin olun. Oluşturma hatalarını yakalamak ve gerekirse kaynakları temizlemek için pcall kullanın.

local FileHandle = {}
FileHandle.__index = FileHandle

function FileHandle.new(path, mode)
  local f, err = io.open(path, mode or "r")
  if not f then
    return nil, "cannot open " .. path .. ": " .. err
  end
  return setmetatable({_f=f, path=path}, FileHandle)
end

function FileHandle:read(fmt) return self._f:read(fmt) end
function FileHandle:close() self._f:close() end

local fh, err = FileHandle.new("data.txt")
if not fh then print("Error:", err)
else print(fh:read("l")); fh:close()
end

Hızlı Kontrol

Lua OOP'de bir yapıcının (new()) rolü nedir?

Özet: Yapıcılar

Özet:

  • Yapıcı doğrulama ve başlatma işlemlerini yapar ve setmetatable'ı çağırır
  • Temiz isteğe bağlı parametreler için varsayılanlar tablosu kullanın
  • Farklı oluşturma senaryoları için birden çok fabrika yöntemi kullanın
  • Şablon nesneler için klon yapıcı kullanın
  • Maliyeti yüksek alanlar için __index aracılığıyla tembel başlatma kullanın
  • Başarısızlık durumunda (kaynak ayırma) yapıcıdan nil+err döndürün

Sıkça Sorulan Sorular

“Oluşturucular ve new()” dersi ücretsiz mi?

Evet — “Oluşturucular ve new()” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Lua Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Lua Academy kursu toplamda 4 dersten oluşur.

“Oluşturucular ve new()” dersinde ne öğreneceğim?

Örnekleri oluşturan ve başlatan oluşturucu işlevler yazın. Lua Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Lua Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Lua Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Oluşturucular ve new()” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Lua Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Lua Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Üst Tablolarla Sınıflar
  2. Oluşturucular ve new()
  3. Örnek Yöntemleri ve self
  4. Kapanışlarla Kapsülleme
← Lua Academy Sayfasına Dön