Doğrulama Mantığı
Coddy'nin Lua Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 47 / 70.
Şu ana kadar verileri korumanın farklı yollarını inceledik; isimlendirme kuralları niyeti belirtir, closure'lar değişkenleri tamamen gizler ve salt okunur tablolar tüm değişiklikleri engeller. Ancak çoğu zaman ikisinin arasında bir şeye ihtiyaç duyarsınız: değişikliklere izin veren, ancak sadece geçerli olanlara.
Setter metotlarının güçlü hale geldiği yer burasıdır. Sadece bir değer atamak yerine, bir setter yeni değerin kabul edilmeden önce mantıklı olup olmadığını kontrol edebilir:
local Person = {}
Person.__index = Person
function Person:new(name, age)
local obj = {
_name = name,
_age = age
}
setmetatable(obj, Person)
return obj
end
function Person:setAge(newAge)
if newAge < 0 then
print("Error: Age cannot be negative")
return
end
self._age = newAge
endBirisi person:setAge(-5) çağırdığında, metot geçersiz girdiyi yakalar ve güncellemeyi reddeder. Nesnenin durumu tutarlı kalır. Bu koruma olmadan, hatalı veriler programınızı sessizce bozabilir; negatif bir yaşla emeklilik haklarını hesapladığınızı hayal edin.
Doğrulama, gerektiği kadar basit veya karmaşık olabilir. Aralıkları kontrol edebilir, türleri doğrulayabilir veya değerlerin beklenen formatlarla eşleştiğinden emin olabilirsiniz. Temel ilke, setter'ın bir bekçi görevi görerek nesnenize yalnızca mantıklı verilerin girmesini sağlamasıdır.
Görev
KolaySetter metotlarındaki doğrulama mantığını kullanarak sağlık ve seviye özniteliklerini koruyan bir Player sınıfı oluşturalım! Bu, oyun karakterlerinin asla imkansız istatistiklere sahip olmamasını sağlar.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
Player.lua: Bir oyuncunun istatistiklerini uygun doğrulama ile yöneten bir sınıf oluşturun. Yapıcı metot (constructor):new(name), oyuncuyu bir isimle,_healthdeğeri100ve_leveldeğeri1olarak başlatmalıdır. Şu metotları dahil edin::getName()— oyuncunun ismini döndürür:getHealth()— mevcut sağlığı döndürür:getLevel()— mevcut seviyeyi döndürür:setHealth(value)— sağlığı yalnızca değer 0 ile 100 (dahil) arasındaysa günceller. Geçersizse,Error: Health must be between 0 and 100yazdırın ve değeri değiştirmeyin.:setLevel(value)— seviyeyi yalnızca değer 1 veya daha büyükse günceller. Geçersizse,Error: Level must be at least 1yazdırın ve değeri değiştirmeyin.
main.lua: Player modülünüzü dahil edin (require) ve bir oyuncu ismi, ardından setter'ları test etmek için iki değer okuyun. Bir oyuncu oluşturun, sağlığını ilk değere ayarlamaya çalışın, seviyesini ikinci değere ayarlamaya çalışın ve ardından oyuncunun son istatistiklerini yazdırın.
Üç girdi alacaksınız:
- Oyuncunun ismi
- Ayarlanmaya çalışılacak bir sağlık değeri (geçerli veya geçersiz olabilen bir sayı)
- Ayarlanmaya çalışılacak bir seviye değeri (geçerli veya geçersiz olabilen bir sayı)
Çıktınız, geçersiz denemelerden kaynaklanan hata mesajlarını ve ardından oyuncunun son istatistiklerini göstermelidir:
Name: {name}
Health: {finalHealth}
Level: {finalLevel}Örneğin, girdiler Hero, -20 ve 5 ise çıktı şöyle olmalıdır:
Error: Health must be between 0 and 100
Name: Hero
Health: 100
Level: 5Sağlık setter'ı -20 değerini reddetti (sağlığı 100'de tuttu), seviye setter'ı ise 5 değerini geçerli olarak kabul etti.
Girdiler Warrior, 75 ve 0 ise çıktı şöyle olmalıdır:
Error: Level must be at least 1
Name: Warrior
Health: 75
Level: 1Kopya kağıdı
Setter metotları, nesne özelliklerini güncellemeden önce verileri doğrulamanıza olanak tanıyarak yalnızca geçerli değerlerin kabul edilmesini sağlar.
Doğrulama içeren temel bir setter:
function Person:setAge(newAge)
if newAge < 0 then
print("Error: Age cannot be negative")
return
end
self._age = newAge
endSetter bir bekçi görevi görür; dahili özelliği güncellemeden önce yeni değerin geçerli olup olmadığını kontrol eder. Doğrulama başarısız olursa, bir hata yazdırır ve veriyi değiştirmeden erkenden döner.
Doğrulama şunları içerebilir:
- Aralık kontrolleri (örneğin, age >= 0)
- Sınır limitleri (örneğin, 0 <= health <= 100)
- Tür doğrulama
- Format doğrulaması
Bu, geçersiz verilerin nesnenizin durumunu bozmasını önler ve programınızın tutarlı kalmasını sağlar.
Kendin dene
-- Player modülünü dahil et
local Player = require('Player')
-- Girdileri oku
local name = io.read()
local healthValue = tonumber(io.read())
local levelValue = tonumber(io.read())
-- YAPILACAK: Verilen isimle yeni bir oyuncu oluştur
-- YAPILACAK: Oyuncunun canını healthValue değerine ayarlamaya çalış
-- YAPILACAK: Oyuncunun seviyesini levelValue değerine ayarlamaya çalış
-- YAPILACAK: Oyuncunun son istatistiklerini şu formatta yazdır:
-- Name: {name}
-- Health: {finalHealth}
-- Level: {finalLevel}
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