Giriş
Sistemler karmaşıklaştıkça, yazılımda “durum” kavramı büyür: Bir nesne; aktif, pasif, beklemede gibi farklı durumlarda bulunabilir ve bu durumlara göre farklı tepkiler vermesi gerekir. Artan durumsal karmaşa, kodun okunabilirliğini ve bakımını zorlaştırır. State Pattern (Durum Tasarım Deseni), bu sorunla baş etmek için geliştirilmiş, çok güçlü bir yaklaşımdır.

State Pattern Nedir?
State Pattern’ın özü, nesnenin durumunu bir sınıfa (State) devretmek ve her davranışı o duruma uygun gerçekleştirmektir. Böylece nesneyi “if-else” veya “switch-case” bloklarıyla boğmak yerine, mümkün olan tüm davranış biçimlerini ayrı sınıflara bölerek tasarlarız. Bu sayede nesnenin durum değişiklikleri çok daha kolay ve anlaşılır şekilde yönetilir.
“Bir nesnenin, içsel durumu değiştiğinde davranışının da değişmesini sağlar; sanki nesnenin sınıfı değişmiş gibi…”
Kullanım Senaryoları ve Nedenleri
- Karmaşık bir nesnenin farklı durumlarda farklı çalışması gerekiyorsa,
- “if-else” zincirleri proje boyunca sürekli uzayıp karmaşıklık yaratıyorsa,
- Durumlar arası geçişleri merkezi biçimde yönetmek isteniyorsa,
- Kodun bakımı ve genişletilmesi sırasında yeni durumlar kolayca eklenmek isteniyorsa
State Pattern işte burada en iyi çözümdür.
State Pattern’ın Avantajları
- Kapsamlı durumsal davranışlar, sade ve bağımsız sınıflarla kontrol edilir.
- Durumlara yeni davranış (ya da yeni durum) eklemek çok kolaydır.
- Kod okunabilir, sürdürülebilir ve değişikliklere kapalı olmaktan çıkar.
- Tek bir nesne üzerinde karmaşık mantıklar yerine, görevi durumu kontrol eden sınıflara devredersiniz.
- Test edilebilirliği artırır.
C# ile Turnike Örneği
Burada State Pattern’ı bir turnike (metro giriş cihazı) modeliyle gösteriyoruz. Turnike 2 temel durumda olabilir: “Kilitli” ve “Açık”.
// State Arayüzü
public interface IState
{
void KartOkut(Turnike turnike);
void Geç(Turnike turnike);
}
// 'Kilitli' Durumu
public class Kilitli : IState
{
public void KartOkut(Turnike turnike)
{
Console.WriteLine("Kart kabul edildi, turnike açıldı.");
turnike.SetState(new Acik());
}
public void Geç(Turnike turnike)
{
Console.WriteLine("Turnike kilitli, geçiş izni yok!");
}
}
// 'Açık' Durumu
public class Acik : IState
{
public void KartOkut(Turnike turnike)
{
Console.WriteLine("Turnike zaten açık, fazladan kart okutmaya gerek yok.");
}
public void Geç(Turnike turnike)
{
Console.WriteLine("Geçildi, turnike tekrar kilitlendi.");
turnike.SetState(new Kilitli());
}
}
// Context Sınıfı
public class Turnike
{
private IState state;
public Turnike()
{
state = new Kilitli();
}
public void SetState(IState state)
{
this.state = state;
}
public void KartOkut()
{
state.KartOkut(this);
}
public void Gec()
{
state.Geç(this);
}
}
Kullanım
Turnike t = new Turnike();
t.Gec(); // Turnike kilitli, geçiş izni yok!
t.KartOkut(); // Kart kabul edildi, turnike açıldı.
t.Gec(); // Geçildi, turnike tekrar kilitlendi.
Gerçek Hayatta Kullanım Alanları
- Oyun karakterlerinin durumsal davranışları (koşma, zıplama, saldırı vb.)
- Banka hesaplarının aktif, askıda, kapalı durumlarının yönetilmesi
- Bağlantı nesnelerinin bağlı-bağlantısız gibi durumlarının merkezi olarak ele alınması
- Trafik ışıklarının yeşil, kırmızı, sarı gibi farklı durumlarındaki davranışlarının kontrolü
Dikkat Edilmesi Gerekenler
- Eğer durum sayısı çok fazla ve birbirinden bağımsızsa, her bir durumu ayrı sınıf yapmak kod şişkinliğine neden olabilir.
- State Pattern, strateji (Strategy Pattern) ve komut (Command Pattern) ile karıştırılmamalıdır. State Pattern, davranışı nesnenin durumu ile ilişkilendirir.
State Pattern ile Kodun Daha Anlaşılır Olması
Bu desen sayesinde, farklı durumlara özgü kodlar ayrı sınıflarda toplanır ve merkezi mantık kodu okumak isteyen birinin tek seferde tüm akışı kavramasını sağlar. Özellikle kod büyüdükçe, karmaşık “if-else” bloklarının yerini basit ve sürdürülebilir bir yapı alır. Okuyucu kodu tek bir örnek dizisiyle kavrayabilir:
“Turnike kilitli — kart okut — turnike açıldı — geç — turnike kilitlendi!”
Sonuç
State Pattern, karmaşık durum ve davranışlara sahip sistemler için vazgeçilmez bir araçtır. Kodun hem okunabilirliğini hem de bakımı kolaylaştırır, yeni durum eklemeyi veya mevcutları değiştirmeyi zahmetsizleştirir. Özellikle büyük projelerde, bir bakışta anlaşılır ve sürdürülebilir bir çözüm sunar.
Okuduğunuzda, State Pattern’ın mantığını hem teknik hem de pratik olarak tek seferde kavramış olmalı, C# örnekleriyle aklınızda kolayca somutlaşmalıdır.
Sorularınız, yorumlarınız ve kendi deneyimlerinizi aşağıya bırakabilirsiniz!