Durum Kalıbı
Coddy'nin GDScript Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 54 / 65.
State kalıbı, bir nesneye içinde bulunabileceği her mod için ayrı bir durum nesnesi verir. Nesne, işini mevcut duruma devreder; böylece durum değiştiğinde davranışı da değişir.
Birkaç durum için bir enum ve match yeterlidir. Her durum birkaç eyleme kendine özgü şekilde tepki verdiğinde, bu match her durum ve her eylemle büyür. State kalıbı, her durumun kurallarını kendi sınıfına taşır:
# hero_state.gd
@abstract
class_name HeroState
extends RefCounted
@abstract func get_state_name() -> String
@abstract func handle(action: String) -> HeroStatehandle() bir sonraki durumu döndürür: geçiş yapılacak yeni bir durum nesnesi veya kalmak için self.
# 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 de aynı şekilde yazılır: adı "Running" olur ve "stop", IdleState.new() döndürür. Kahraman, yani bağlam, geçerli durumu saklar ve ne yapacağını ona sorar:
# 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 -> IdleAynı eylem farklı durumlarda farklı anlamlara gelir: "stop", boşta beklerken hiçbir şey yapmaz ve çalışan bir kahramanı durdurur. Her kural kendi durumunun sınıfında yer alır; bu nedenle zıplama gibi yeni bir durum, yeni bir sınıf demektir.
Durumlar, kahramanı saklamak yerine bir sonraki durumu döndürür. Kahramanı saklayan bir durum ile durumu saklayan kahraman arasında bir başvuru döngüsü oluşur ve iki nesne de hiçbir zaman bellekten silinmez.
Görev
KolayBir kapı Locked, Closed veya Open durumundadır. DoorState (door_state.gd), get_state_name() ve handle(action) bildirimlerini yapar; LockedState (locked_state.gd) yazılmıştır: unlock, kapıyı Closed durumuna getirir. Şunları yaz:
ClosedState.handle():openyeni birOpenState,lockyeni birLockedStatedöndürür; diğer tüm durumlardaselfdöndürür.OpenState.handle():closeyeni birClosedStatedöndürür; diğer tüm durumlardaselfdöndürür.Door.handle_action(action): sonraki durum için mevcut duruma sorar. Aynı nesneyseACTION: still STATEyazdırır; değilseACTION: OLD -> NEWyazdırır ve yeni duruma geçer.
Kapı Locked durumunda başlar. Sağlanan kod, kaç eylemin geleceğini okur, ardından her satırda bir eylem okur ve son durumu yazdırır. open, unlock, open, lock için çıktı şöyledir:
open: still Locked
unlock: Locked -> Closed
open: Closed -> Open
lock: still Open
Final state: OpenKodunu door.gd, closed_state.gd ve open_state.gd dosyalarına yaz. main.gd, sağlanan giriş/çıkış kodunu içerir ve düzenlenemez.
Kendin dene
extends Node
func _ready():
# Sağlanan giriş/çıkış kodu: olduğu gibi bırakın
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())
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