Menu
CoddyTech

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) -> HeroState

handle() 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 self

RunState 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 -> Idle

Aynı 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.

challenge icon

Görev

Kolay

Bir 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(): open yeni bir OpenState, lock yeni bir LockedState döndürür; diğer tüm durumlarda self döndürür.
  • OpenState.handle(): close yeni bir ClosedState döndürür; diğer tüm durumlarda self döndürür.
  • Door.handle_action(action): sonraki durum için mevcut duruma sorar. Aynı nesneyse ACTION: still STATE yazdırır; değilse ACTION: OLD -> NEW yazdı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: Open

Kodunu 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())
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