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_green8}910def handle_red(self):11print(" Dur")12self.state = "green"1314def handle_yellow(self):15print(" Dikkat")16self.state = "red"1718def handle_green(self):19print(" Geç")20self.state = "yellow"2122def step(self):23self.handlers[self.state]()2425light = TrafficLight()26for _ in range(6):27light.step()Beklenen çıktı:
1Dur2Geç3Dikkat4Dur5Geç6DikkatDaha karmaşık durumlarda state sınıfları kullan. Her state bir nesne olur, kendi davranışını tanımlar:
1from abc import ABC, abstractmethod23class State(ABC):4@abstractmethod5def handle(self, context):6pass78class RedState(State):9def handle(self, context):10print(" Dur")11context.state = GreenState()1213class GreenState(State):14def handle(self, context):15print(" Geç")16context.state = YellowState()1718class YellowState(State):19def handle(self, context):20print(" Dikkat")21context.state = RedState()2223class TrafficLight:24def __init__(self):25self.state = RedState()2627def step(self):28self.state.handle(self)2930light = 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.
0 yorum