Doğrulama Mantığı
Coddy'nin Lua Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 47 / 70.
Şimdiye kadar verileri korumanın farklı yollarını inceledik: adlandırma kuralları amacı belirtir, closure'lar değişkenleri tamamen gizler ve salt okunur tablolar tüm değişiklikleri önler. Ancak çoğu zaman arada bir şeye ihtiyaç duyarsın: değişikliklere izin vermek, ama yalnızca geçerli olanlara.
Setter metotlarının güçlü hâle geldiği yer burasıdır. Bir setter yalnızca bir değer atamak yerine, kabul etmeden önce yeni değerin anlamlı 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, yöntem geçersiz girdiyi yakalar ve güncelleme yapmayı reddeder. Nesnenin durumu tutarlı kalır. Bu koruma olmadan, hatalı veriler programınızı sessizce bozabilir: negatif bir yaşla emeklilik ödemelerini hesapladığınızı düşünün.
Doğrulama, gerektiği kadar basit veya karmaşık olabilir. Aralıkları kontrol edebilir, türleri doğrulayabilir veya değerlerin beklenen biçimlerle eşleştiğinden emin olabilirsiniz. Temel ilke, setter'ın bir bekçi görevi görerek yalnızca makul verilerin nesnenize girmesini sağlamasıdır.
Görev
KolaySetter metotlarındaki doğrulama mantığını kullanarak health ve level özelliklerini koruyan bir Player sınıfı oluşturalım! Bu, oyun karakterlerinin hiçbir zaman mümkün olmayan istatistiklere sahip olmamasını sağlar.
Kodunuzu iki dosya arasında düzenleyeceksiniz:
Player.lua: Bir player'ın istatistiklerini uygun doğrulamayla yöneten bir sınıf oluşturun. Constructor:new(name), player'ı bir adla,_healthdeğeri100ve_leveldeğeri1olacak şekilde başlatmalıdır. Aşağıdaki metotları ekleyin::getName(): player'ın adını döndürür:getHealth(): mevcut health değerini döndürür:getLevel(): mevcut level değerini döndürür:setHealth(value): health değerini yalnızca value 0 ile 100 (inclusive) arasındaysa günceller. GeçersizseError: Health must be between 0 and 100yazdırın ve değeri değiştirmeyin.:setLevel(value): level değerini yalnızca value 1 veya daha büyükse günceller. GeçersizseError: Level must be at least 1yazdırın ve değeri değiştirmeyin.
main.lua: Player modülünü require edin ve bir player adı, ardından setter'ları test etmek için iki value okuyun. Bir player oluşturun, health değerini ilk value olarak ayarlamayı deneyin, level değerini ikinci value olarak ayarlamayı deneyin, ardından player'ın son istatistiklerini yazdırın.
Üç input alacaksınız:
- Player'ın adı
- Ayarlanmaya çalışılacak bir health değeri (bir number; geçerli veya geçersiz olabilir)
- Ayarlanmaya çalışılacak bir level değeri (bir number; geçerli veya geçersiz olabilir)
Çıktınız, geçersiz denemelerden kaynaklanan hata mesajlarını ve ardından player'ın son istatistiklerini göstermelidir:
Name: {name}
Health: {finalHealth}
Level: {finalLevel}Örneğin input'lar Hero, -20 ve 5 ise çıktı şöyle olmalıdır:
Error: Health must be between 0 and 100
Name: Hero
Health: 100
Level: 5health setter'ı -20 değerini reddetti (health değerini 100'de tuttu), level setter'ı ise 5 değerini geçerli olarak kabul etti.
Input'lar Warrior, 75 ve 0 ise çıktı şöyle olmalıdır:
Error: Level must be at least 1
Name: Warrior
Health: 75
Level: 1Kendin dene
-- Player modülünü yükle
local Player = require('Player')
-- Girdileri oku
local name = io.read()
local healthValue = tonumber(io.read())
local levelValue = tonumber(io.read())
-- TODO: Verilen isimle yeni bir oyuncu oluştur
-- TODO: Oyuncunun sağlığını healthValue değerine ayarlamayı dene
-- TODO: Oyuncunun seviyesini levelValue değerine ayarlamayı dene
-- TODO: Oyuncunun son istatistiklerini şu formatta yazdır:
-- İsim: {name}
-- Sağlık: {finalHealth}
-- Seviye: {finalLevel}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama 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şisiKendi başına pratik yap: Online Lua derleyicisi