State Machine Kodlaması: Switch-Case Yerine Pratik Yöntemler

Switch-case ile state yönetimi yapmak kodu hızlı karmaşıklaştırır. Her yeni state eklemekte yeni case yazman gerekir, ve mantık dağılmış hale gelir. Bunun yerine state machine deseni kullanarak daha temiz, genişletilebilir çözümler yazabilirsin.

En basit yöntem dictionary ile handler eşlemesi yapmak. Her state için bir fonksiyon tanımla, sonra hangisi aktif olduğuna göre çağır:

1class TrafficLight:
2def __init__(self):
3self.state = "red"
4self.handlers = {
5"red": self.handle_red,
6"yellow": self.handle_yellow,
7"green": self.handle_green
8}
9
10def handle_red(self):
11print(" Dur")
12self.state = "green"
13
14def handle_yellow(self):
15print(" Dikkat")
16self.state = "red"
17
18def handle_green(self):
19print(" Geç")
20self.state = "yellow"
21
22def step(self):
23self.handlers[self.state]()
24
25light = TrafficLight()
26for _ in range(6):
27light.step()

Beklenen çıktı:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1Dur
2Geç
3Dikkat
4Dur
5Geç
6Dikkat

Daha karmaşık durumlarda state sınıfları kullan. Her state bir nesne olur, kendi davranışını tanımlar:

1from abc import ABC, abstractmethod
2
3class State(ABC):
4@abstractmethod
5def handle(self, context):
6pass
7
8class RedState(State):
9def handle(self, context):
10print(" Dur")
11context.state = GreenState()
12
13class GreenState(State):
14def handle(self, context):
15print(" Geç")
16context.state = YellowState()
17
18class YellowState(State):
19def handle(self, context):
20print(" Dikkat")
21context.state = RedState()
22
23class TrafficLight:
24def __init__(self):
25self.state = RedState()
26
27def step(self):
28self.state.handle(self)
29
30light = TrafficLight()
31for _ in range(6):
32light.step()

Bu yöntem switch-case'e göre çok daha esnek. Yeni state eklemek için sadece yeni bir sınıf yazarsın, mevcut kodu dokunmana gerek yok. Testleri de kolaylaştırır, her state'i izole test edebilirsin.

Sık yapılan hata: State geçişlerini context'te tutmak yerine handler içinde yapmak. Bu state'leri hard-code ettirir ve değiştirmesi zor olur. Geçişleri dışarıdan inject et veya state nesneleri arasında referans ver.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz