Programlamada Tasarım Desenleri #18 — State Design Pattern (dotnet c#)

Programlamada Tasarım Desenleri #18 — State Design Pattern (C# .NET ile Uygulamalı)

Tasarım desenleri serimizin 18. bölümünde “State Design Pattern” yani “Durum Tasarım Deseni”ni ele alıyoruz. Bu desen, bir nesnenin iç durumuna göre davranışını değiştirmesini sağlar. .NET dünyasında C# ile bu desenin nasıl etkin bir şekilde kullanılacağını örnek kodlarla açıklayarak detaylandırıyoruz.

State Design Pattern Illustration

🔍 State Design Pattern Nedir?

State Design Pattern, bir nesnenin davranışlarını, o nesnenin mevcut durumuna göre değiştirmek için kullanılır. Bu desen sayesinde if-else veya switch-case yapılarında boğulmak yerine, her durumu ayrı bir sınıf olarak tanımlayabilir ve nesnenin davranışını dinamik olarak değiştirebilirsiniz.

🎯 Amaç: Karmaşık kontrol akışlarını sadeleştirmek ve bakım kolaylığı sağlamak.

✅ Ne Zaman Kullanılır?

  • Nesnenin davranışları, iç durumuna bağlı olarak değişiyorsa,
  • Eğer bir nesne çok sayıda if/else veya switch-case blokları içeriyorsa,
  • Durum geçişlerinin kodun çeşitli yerlerine dağılmasını istemiyorsanız.

👷‍♂️ .NET / C# ile State Pattern Uygulaması

Örnek bir Sipariş (Order) sistemi üzerinden ilerleyelim. Siparişin farklı durumları olabilir: Yeni, Hazırlanıyor, Kargoda, Teslim Edildi.

🧱 1. State Arayüzü (IOrderState)

public interface IOrderState
{
    void ProcessOrder(Order order);
    void ShipOrder(Order order);
}

🧱 2. Concrete State Sınıfları

Yeni Sipariş Durumu: `NewOrderState`

public class NewOrderState : IOrderState
{
    public void ProcessOrder(Order order)
    {
        Console.WriteLine("Sipariş hazırlanıyor.");
        order.SetState(new ProcessingOrderState());
    }

    public void ShipOrder(Order order)
    {
        Console.WriteLine("Sipariş işlenmeden kargoya verilemez!");
    }
}

Hazırlanıyor: `ProcessingOrderState`

public class ProcessingOrderState : IOrderState
{
    public void ProcessOrder(Order order)
    {
        Console.WriteLine("Sipariş zaten hazırlanıyor.");
    }

    public void ShipOrder(Order order)
    {
        Console.WriteLine("Sipariş kargoya veriliyor.");
        order.SetState(new ShippedOrderState());
    }
}

Kargoya Verildi: `ShippedOrderState`

public class ShippedOrderState : IOrderState
{
    public void ProcessOrder(Order order)
    {
        Console.WriteLine("Sipariş zaten kargoda.");
    }

    public void ShipOrder(Order order)
    {
        Console.WriteLine("Sipariş çoktan gönderildi.");
    }
}

🧱 3. Context Sınıfımız: `Order`

public class Order
{
    private IOrderState _currentState;

    public Order()
    {
        _currentState = new NewOrderState(); // Başlangıç durumu
    }

    public void SetState(IOrderState newState)
    {
        _currentState = newState;
    }

    public void ProcessOrder()
    {
        _currentState.ProcessOrder(this);
    }

    public void ShipOrder()
    {
        _currentState.ShipOrder(this);
    }
}

🧪 Örnek Kullanım

class Program
{
    static void Main(string[] args)
    {
        Order order = new Order();

        order.ProcessOrder(); // Durum: Hazırlanıyor
        order.ShipOrder();    // Durum: Kargoda
        order.ProcessOrder(); // Kargoya verildiği için değişiklik olmayacak
    }
}

📌 Çıktı:

Sipariş hazırlanıyor.
Sipariş kargoya veriliyor.
Sipariş zaten kargoda.

📊 State Design Pattern’in Avantajları

Avantajlar Açıklama
🔄 Esnek Davranış Kontrolü Nesneye göre farklı durumlar rahatça yönetilir.
🧼 Daha Temiz Kod Yapısı Karmaşık if-else/switch-case’lerden kurtulursunuz.
♻️ Açık-kapalı prensibi (OCP) Yeni durumları sınıf ekleyerek kolayca genişletebilirsiniz.
🧠 Anlaşılır Kod Akışı Her durum kendi sorumluluğunda oldukça okunabilirlik artar.

🎨 Görsel ile Özet (State Pattern Diagramı)

State Pattern UML Diyagramı

Kaynak: Wikipedia – State Pattern UML

🤔 Gerçek Hayattan Örnek Uygulamalar

  • Banka hesabı durumu (Aktif, Devre Dışı, Bloke)
  • Trafik lambası kontrolü (Yeşil, Sarı, Kırmızı)
  • Video oynatıcı durumları (Oynat, Durdur, Duraklat)
  • Mobil sipariş uygulamaları (Yeni, Hazırlanıyor, Kargoda, Teslim)

✅ Özet

State Pattern, yazılım mimarisinde davranışsal tasarım desenleri arasında önemli bir yere sahiptir. Nesnelerin iç durumlarına göre davranışlarını dinamik olarak değiştirmesi gereken senaryolarda ciddi anlamda kodun okunabilirliğini ve sürdürülebilirliğini artırır.

🛠 İlgili Kaynaklar

🗨️ Sizin Projelerinizde Kullandınız mı?

Siz bu deseni nerelerde kullanıyorsunuz? Yorumlarda paylaşın! 👇

📌 Etiketler: State Design Pattern, Tasarım Desenleri, Behavioral Patterns, C#, .NET, OOP, Design Patterns, Software Architecture

Hazır mısınız? Bir sonraki yazımızda “Strategy Design Pattern”ı uygulamalı olarak inceleyeceğiz.

📌 Takipte kalın ve bültene abone olun!

Order Lifecycle Flowchart
Programmer Coding State Pattern
Traffic Light State Pattern
State Pattern Advantages Infographic

You may also like...

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir