Menu
CoddyTech

Validasi dengan Setter

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 27 dari 65.

Setter berjalan setiap kali property-nya diberi nilai, sehingga setter menjadi tempat untuk memeriksa nilai baru. Python menimbulkan error jika nilainya tidak valid. GDScript tidak memiliki exception, jadi setter melakukan salah satu dari dua hal berikut: membatasi nilai agar tetap dalam rentang, atau mempertahankan nilai lama dan mencatat kesalahan yang terjadi.

# 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) mengembalikan value yang dibatasi dalam rentang 0 hingga 100. Di setter nickname, return keluar sebelum assignment, sehingga nama lama tetap digunakan dan last_error menjelaskan alasannya:

# main.gd
var hero := Character.new()
hero.hp = 250
print(hero.hp) # 100
hero.nickname = "Al"
print(hero.nickname) # Player
print(hero.last_error) # Nama terlalu pendek
hero.nickname = "Alice"
print(hero.nickname) # Alice

setter juga dijalankan untuk penugasan di dalam class, di _init() dan di setiap method. Tetapkan argumen constructor melalui property agar argumen tersebut juga diperiksa:

func _init(start_hp: int) -> void:
	hp = start_hp # menjalankan setter: Character.new(500) dimulai dengan 100

Di dalam setter itu sendiri, menetapkan hp akan menyimpan nilai tanpa memanggil setter lagi. Satu-satunya penetapan yang melewati setter adalah nilai awal dalam deklarasi (= 100), jadi nilai itu harus valid dengan sendirinya.

challenge icon

Tantangan

Mudah

Tambahkan validasi ke class Thermostat di thermostat.gd dengan setter:

  • target (dimulai dari 20) hanya menerima nilai dari 10 hingga 30. Untuk nilai lain, nilainya tetap pada target lama dan last_error diatur menjadi Target must be between 10 and 30.
  • mode (dimulai dari off) hanya menerima heat, cool, dan off. Untuk teks lain, nilainya tetap pada mode lama dan last_error diatur menjadi Unknown mode: diikuti teks tersebut.
  • Penetapan yang valid mengatur kembali last_error menjadi string kosong.
  • _init(start_target) menetapkan start_target ke target, sehingga setter memeriksanya.

Kode yang disediakan membaca target awal, lalu jumlah perintah, lalu satu perintah di setiap baris (target 25 atau mode cool). Setelah membuat thermostat dan setelah setiap perintah, kode mencetak Rejected: dan error jika last_error tidak kosong, lalu mencetak status. Untuk nilai awal 22 dan perintah target 35 serta mode cool, kode mencetak:

Target 22, mode off
Rejected: Target must be between 10 and 30
Target 22, mode off
Target 22, mode cool

Kodemu ditulis di thermostat.gd. main.gd berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

extends Node

func _ready():
	# Kode input/output yang disediakan: biarkan apa adanya
	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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler GDScript online