Adlandırma Kuralları
Coddy'nin Lua Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 43 / 70.
Lua'da, tüm tablo alanları varsayılan olarak herkese açık bir şekilde erişilebilirdir. Herkes self.health değerini doğrudan okuyabilir veya değiştirebilir. Lua gizliliği zorunlu kılmasa da, programcılar niyetlerini belirtmek için isimlendirme kuralları kullanırlar; bu, hangi alanların dahili uygulama detayları olarak ele alınması gerektiğini işaret eder.
Standart kural, özel alanların önüne bir alt çizgi getirmektir:
local Player = {}
Player.__index = Player
function Player:new(name)
local obj = {
name = name, -- Public: doğrudan erişmekte sorun yok
_health = 100, -- Private: bunun yerine metotları kullanın
_score = 0 -- Private: dahili takip
}
setmetatable(obj, Player)
return obj
end
function Player:getHealth()
return self._health
end
function Player:takeDamage(amount)
self._health = self._health - amount
endAlt çizgi Lua'nın çalışma şeklini değiştirmez—player._health teknik olarak hala erişilebilirdir. Ancak, diğer programcılara (ve gelecekteki kendinize) açık bir uyarı niteliği taşır: "Bu alanın özel olması amaçlanmıştır. Bunun yerine metotlar aracılığıyla erişin."
Bu kural önemlidir çünkü arayüzü (başkalarının kullanması gerekenleri) uygulamadan (dahili olarak nasıl çalıştığından) ayırır. Daha sonra doğrulama eklemeniz veya sağlığın nasıl saklandığını değiştirmeniz gerekirse, yalnızca metotları değiştirirsiniz; :getHealth() kullanan kod değişmeden çalışmaya devam eder.
Görev
KolayAlt çizgi adlandırma kuralını kullanarak hangi alanların özel (private) olması gerektiğini düzgün bir şekilde belirten bir BankAccount sınıfı oluşturalım!
Kodunuzu iki dosya halinde düzenleyeceksiniz:
BankAccount.lua: Hesap bilgilerini yöneten bir sınıf oluşturun. Yapıcı metot (constructor):new(ownerName, initialBalance), sahibin adını genel bir alan (owner) olarak ve bakiyeyi özel bir alan (_balance) olarak saklamalıdır. Üç metot ekleyin::getBalance()— mevcut bakiyeyi döndürür:deposit(amount)— miktarı_balancealanına ekler:getOwner()— sahibin adını döndürür
main.lua: BankAccount modülünüzü dahil edin (require), girdiden sahibin adını, başlangıç bakiyesini ve para yatırma miktarını okuyun. Bir hesap oluşturun, para yatırma işlemini gerçekleştirin, ardından sahibini ve son bakiyeyi yazdırın.
Üç girdi alacaksınız:
- Sahibin adı
- Başlangıç bakiyesi (bir sayı)
- Yatırılacak miktar (bir sayı)
Çıktınız, para yatırma işleminden sonra sahibini ve son bakiyeyi gösteren iki satır olmalıdır:
Owner: {ownerName}
Balance: {finalBalance}Örneğin, girdiler Maria, 500 ve 150 ise çıktı şu şekilde olmalıdır:
Owner: Maria
Balance: 650Unutmayın: _balance üzerindeki alt çizgi öneki, diğer programcılara bu alana doğrudan değil, :getBalance() ve :deposit() gibi metotlar aracılığıyla erişilmesi gerektiğini belirtir. Alt çizgi içermeyen owner alanı, genel olarak erişilmesinde bir sakınca olmadığını gösterir.
Kopya kağıdı
Lua'da, tüm tablo alanları varsayılan olarak herkese açıktır. Hangi alanların dahili uygulama ayrıntıları olarak ele alınması gerektiğini belirtmek için, özel (private) alanların önüne bir alt çizgi (_) ekleyerek alt çizgi adlandırma kuralını kullanın.
Alt çizgi gizliliği zorunlu kılmaz; diğer programcılara, alana doğrudan erişmek yerine metotlar aracılığıyla erişilmesi gerektiğine dair bir sinyaldir.
local Player = {}
Player.__index = Player
function Player:new(name)
local obj = {
name = name, -- Genel: doğrudan erişilebilir
_health = 100, -- Özel: bunun yerine metotları kullanın
_score = 0 -- Özel: dahili takip
}
setmetatable(obj, Player)
return obj
end
function Player:getHealth()
return self._health
end
function Player:takeDamage(amount)
self._health = self._health - amount
endBu kural, arayüzü (başkalarının ne kullanması gerektiğini) uygulamadan (dahili olarak nasıl çalıştığını) ayırarak, değişiklikler gerektiğinde kodun daha sürdürülebilir olmasını sağlar.
Kendin dene
-- BankAccount modülünü dahil et
local BankAccount = require('BankAccount')
-- Girdileri oku
local ownerName = io.read()
local initialBalance = tonumber(io.read())
local depositAmount = tonumber(io.read())
-- YAPILACAK: ownerName ve initialBalance ile yeni bir BankAccount oluşturun
-- YAPILACAK: depositAmount kullanarak bir para yatırma işlemi gerçekleştirin
-- YAPILACAK: Sahibi ve son bakiyeyi istenen formatta yazdırın
-- Format:
-- Sahibi: {ownerName}
-- Bakiye: {finalBalance}
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