Pola State
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 54 dari 65.
Pola State memberi sebuah object state terpisah untuk setiap mode yang dapat dimilikinya. Object tersebut menyerahkan pekerjaannya kepada state saat ini, sehingga perilakunya berubah saat state berubah.
Untuk beberapa state, enum dan match sudah cukup. Saat setiap state bereaksi terhadap beberapa aksi dengan caranya sendiri, match itu bertambah panjang dengan setiap state dan setiap aksi. Pola State memindahkan aturan setiap state ke class-nya sendiri:
# hero_state.gd
@abstract
class_name HeroState
extends RefCounted
@abstract func get_state_name() -> String
@abstract func handle(action: String) -> HeroStatehandle() mengembalikan state berikutnya: object state baru untuk beralih ke sana, atau self untuk tetap di sini.
# idle_state.gd
class_name IdleState
extends HeroState
func get_state_name() -> String:
return "Idle"
func handle(action: String) -> HeroState:
if action == "run":
return RunState.new()
return selfRunState ditulis dengan cara yang sama: namanya adalah "Running", dan "stop" mengembalikan IdleState.new(). Hero, yaitu konteksnya, menyimpan state saat ini dan menanyakan apa yang harus dilakukan:
# hero.gd
class_name Hero
extends RefCounted
var state: HeroState = IdleState.new()
func handle_action(action: String) -> void:
var next := state.handle(action)
if next != state:
print(state.get_state_name(), " -> ", next.get_state_name())
state = next# main.gd
var hero := Hero.new()
for action in ["stop", "run", "run", "stop"]:
hero.handle_action(action)Idle -> Running
Running -> IdleAksi yang sama memiliki arti berbeda dalam state yang berbeda: "stop" tidak melakukan apa pun saat idle dan menghentikan hero yang sedang berlari. Setiap aturan berada di class untuk state-nya, jadi state baru, seperti melompat, berarti satu class baru.
Status-status mengembalikan status berikutnya alih-alih menyimpan hero. Status yang menyimpan hero sementara hero menyimpan status akan membentuk siklus referensi, dan kedua object tidak akan pernah dibebaskan.
Tantangan
MudahPintu berada dalam keadaan Locked, Closed, atau Open. DoorState (door_state.gd) mendeklarasikan get_state_name() dan handle(action), sedangkan LockedState (locked_state.gd) sudah ditulis: unlock membuat pintu menjadi Closed. Tulis:
ClosedState.handle():openmengembalikanOpenStatebaru,lockmengembalikanLockedStatebaru, dan tindakan lainnya mengembalikanself.OpenState.handle():closemengembalikanClosedStatebaru, dan tindakan lainnya mengembalikanself.Door.handle_action(action): meminta state saat ini untuk menentukan state berikutnya. Jika objeknya sama, cetakACTION: still STATE; jika tidak, cetakACTION: OLD -> NEWdan beralih ke state baru.
Pintu dimulai dalam keadaan Locked. Kode yang disediakan membaca jumlah tindakan yang akan diberikan, lalu membaca satu tindakan per baris, dan mencetak state akhir. Untuk open, unlock, open, lock, output-nya adalah:
open: still Locked
unlock: Locked -> Closed
open: Closed -> Open
lock: still Open
Final state: OpenTulis kodemu di door.gd, closed_state.gd, dan open_state.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 tetap seperti ini
var door := Door.new()
var count := int(OS.read_string_from_stdin())
for i in count:
door.handle_action(OS.read_string_from_stdin())
print("Final state: ", door.state.get_state_name())
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