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 = valueclampi(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) # Alicesetter 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 100Di 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.
Tantangan
MudahTambahkan validasi ke class Thermostat di thermostat.gd dengan setter:
target(dimulai dari20) hanya menerima nilai dari10hingga30. Untuk nilai lain, nilainya tetap pada target lama danlast_errordiatur menjadiTarget must be between 10 and 30.mode(dimulai darioff) hanya menerimaheat,cool, danoff. Untuk teks lain, nilainya tetap pada mode lama danlast_errordiatur menjadiUnknown mode:diikuti teks tersebut.- Penetapan yang valid mengatur kembali
last_errormenjadi string kosong. _init(start_target)menetapkanstart_targetketarget, 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 coolKodemu 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])
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPclass dan objectKata Kunci selfmethodpropertyKonstruktor (_init)Ringkasan: Kalkulator Sederhana4Polimorfisme
Method Overriding Sekali LagiDuck TypingKelas Abstrak dan MethodDesain InterfaceRingkasan: Kalkulator Bentuk7Sinyal
Apa itu Sinyal?Mendeklarasikan dan MemancarkanMenghubungkan ke SinyalSinyal dengan ArgumenRangkuman, Sistem Kesehatan10Pola Desain Bagian 2
Pola CommandPola AdapterPola DecoratorPola Template MethodPola StatePola Composite2Property class
Variabel instance vs. variabel statisFungsi statisSetter propertyGetter propertyPrivat berdasarkan konvensiRangkuman: Pengelola Rekening Bank5Enkapsulasi
Member Publik dan PrivatValidasi dengan SetterPenyembunyian InformasiProperty Hanya-BacaRingkasan: Sistem Catatan Siswa8Konsep OOP Lanjutan
Komposisi vs PewarisanInner ClassNode sebagai KomponenRefCounted vs NodeEnum dalam Class11Proyek: Manajemen Perpustakaan
Gambaran Umum Proyekclass Buku dan PenggunaLatihan sendiri: Compiler GDScript online