Setter'larla Doğrulama
Coddy'nin GDScript Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 27 / 65.
Bir setter, özelliğine her değer atandığında çalışır; bu da onu yeni değeri denetlemek için uygun yer hâline getirir. Python, geçersiz bir değer için hata verir. GDScript'te istisnalar olmadığı için setter bunun yerine şunlardan birini yapar: değeri aralığa sığacak şekilde sınırlar ya da eski değeri koruyup neyin yanlış gittiğini kaydeder.
# character.gd
class_name Character
extends RefCounted
var last_error: String = ""
var hp: int = 100:
set(value):
hp = clampi(value, 0, 100)
var nickname: String = "Player":
set(value):
if value.length() < 3:
last_error = "Name too short"
return
last_error = ""
nickname = valueclampi(value, 0, 100), value değerini 0 ile 100 aralığına taşır. nickname ayarlayıcısında return, atamadan önce çıkılmasını sağlar; böylece eski ad kalır ve last_error bunun nedenini açıklar:
# main.gd
var hero := Character.new()
hero.hp = 250
print(hero.hp) # 100
hero.nickname = "Al"
print(hero.nickname) # Player
print(hero.last_error) # İsim çok kısa
hero.nickname = "Alice"
print(hero.nickname) # AliceAyarlayıcı, sınıf içindeki atamalarda da, _init() içinde ve her yöntemde çalışır. Yapıcının argümanlarını özellik üzerinden atayın; onlar da denetlenir:
func _init(start_hp: int) -> void:
hp = start_hp # setter'ı çalıştırır: Character.new(500) 100 ile başlarSetter'ın içinde, hp atamak, setter'ı yeniden çağırmadan değeri kaydeder. Setter'ı atlayan tek atama, tanımlamadaki başlangıç değeridir (= 100); bu nedenle bu değer kendi başına geçerli olmalıdır.
Görev
Kolaythermostat.gd dosyasındaki Thermostat sınıfına setter'lar ekleyerek doğrulama uygulayın:
target(20ile başlar) yalnızca10ile30arasındaki değerleri kabul eder. Diğer tüm değerlerde eski hedefi korur velast_errordeğeriniTarget must be between 10 and 30olarak ayarlar.mode(offile başlar) yalnızcaheat,coolveoffdeğerlerini kabul eder. Diğer tüm metinlerde eski modu korur velast_errordeğerini, ardından metin gelecek şekildeUnknown mode:olarak ayarlar.- Geçerli bir atama,
last_errordeğerini boş bir dizgeye döndürür. _init(start_target),start_targetdeğerinitargetdeğişkenine atar; böylece setter bunu denetler.
Verilen kod başlangıç hedefini, ardından komut sayısını ve sonra her satırda bir komutu okur (target 25 veya mode cool). Termostatı oluşturduktan sonra ve her komutun ardından, last_error boş değilse Rejected: ifadesini ve hatayı, ardından da durumu yazdırır. Başlangıç değeri 22 ve komutlar target 35 ile mode cool olduğunda şu çıktıyı verir:
Target 22, mode off
Rejected: Target must be between 10 and 30
Target 22, mode off
Target 22, mode coolKodunuzu thermostat.gd dosyasına yazın. main.gd, verilen girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
extends Node
func _ready():
# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
var thermostat := Thermostat.new(int(OS.read_string_from_stdin()))
report(thermostat)
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
if parts[0] == "target":
thermostat.target = int(parts[1])
else:
thermostat.mode = parts[1]
report(thermostat)
func report(thermostat: Thermostat) -> void:
if thermostat.last_error != "":
print("Rejected: " + thermostat.last_error)
print("Target %d, mode %s" % [thermostat.target, thermostat.mode])
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
1Nesne Yönelimli Programlamanın Temelleri
Harici DosyalarNesne Yönelimli Programlamaya GirişSınıflar ve Nesnelerself Anahtar KelimesiMetotlarÖzelliklerKurucu (_init)Tekrar - Basit Hesap Makinesi4Çok Biçimlilik
Metot Ezme Konusuna Yeniden BakışÖrdek TiplemesiSoyut Sınıflar ve MetotlarArayüz TasarımıÖzet - Şekil Hesaplayıcı7Sinyaller
Sinyal Nedir?Tanımlama ve Sinyal GöndermeSinyallere BağlanmaArgümanlı SinyallerTekrar - Sağlık Sistemi10Tasarım Kalıpları 2. Bölüm
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıBileşik Kalıp2Sınıf Özellikleri
Örnek ve Statik DeğişkenlerStatik FonksiyonlarÖzellik AyarlayıcılarıÖzellik AlıcılarıGeleneksel Olarak ÖzelTekrar - Banka Hesabı Yöneticisi5Kapsülleme
Public ve Private ÜyelerSetter'larla DoğrulamaBilgi GizlemeSalt Okunur ÖzelliklerTekrar - Öğrenci Kayıt SistemiKendi başına pratik yap: Online GDScript derleyicisi