Menu
CoddyTech

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 = value

clampi(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) # Alice

Ayarlayı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şlar

Setter'ı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.

challenge icon

Görev

Kolay

thermostat.gd dosyasındaki Thermostat sınıfına setter'lar ekleyerek doğrulama uygulayın:

  • target (20 ile başlar) yalnızca 10 ile 30 arasındaki değerleri kabul eder. Diğer tüm değerlerde eski hedefi korur ve last_error değerini Target must be between 10 and 30 olarak ayarlar.
  • mode (off ile başlar) yalnızca heat, cool ve off değerlerini kabul eder. Diğer tüm metinlerde eski modu korur ve last_error değerini, ardından metin gelecek şekilde Unknown mode: olarak ayarlar.
  • Geçerli bir atama, last_error değerini boş bir dizgeye döndürür.
  • _init(start_target), start_target değerini target değ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 cool

Kodunuzu 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])
quiz iconKendini test et

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

Kendi başına pratik yap: Online GDScript derleyicisi