Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

C# State Design Pattern(State Tasarım Deseni)

Ekstra Senaryo
Bu senaryoda bir e-ticaret sitesindeki sipariş süreci simüle edilecektir.
Senaryomuzun genel izahati şöyledir. Kullanıcının e-ticaret üzerinden yaptığı siparişe dair aşağıdaki aşamalar sırasıyla gerçekleşecektir;

  • Sipariş oluşturulmadan önceki durum (NoOrder) olarak nitelendirilecektir.
  • Siparişin oluşturulması. Bu durum (Suspended) olarak nitelendirilecektir.
  • Oluşturulan siparişin stok bilgilerinin güncellenmesi. Bu durum ise (StockReserved) olarak nitelendirilecektir.
    • Siparişteki ürünlerin adetleri eğer mevcut stok miktarını geçiyorsa sipariş iptal edilecek ve (OrderCanceled) durumuna çekilecektir. İptal edilen siparişin ürün adetleri güncellenip tekrar denenebilecektir.
    • Yok eğer stok miktarı siparişteki ürün adedini karşılıyorsa stok bilgileri güncellenecek ve (StockReserved) durumuna geçilecektir.
  • Stok bilgileri güncellenen siparişin ödeme işlemi gerçekleştirilecektir. Bu durum ise (OrderCompleted) olarak nitelendirilecektir.
    • Ödeme süreci başarıyla sonuçlanıyorsa (OrderCompleted) durumuna geçilecektir.
    • Aksi taktirde sipariş başarısız olacağı için (OrderFailed) durumuna çekilecektir.
  • Ve son olarak ödeme gerçekleştirildiğinde ise sipariş onaylanacak ve nakliye işlemleri devreye sokulacaktır. Bu durum ise (OrderCompleted) olarak nitelendirilecektir.
UYGULAMADAKİ TÜM DURUMLAR
NoOrder Siparişin oluşturulmadığını ifade eder.
Suspended Siparişin oluşturulduğunu ifade eder.
StockReserved Stok bilgilerinin güncellendiğini ifade eder.
OrderCompleted Siparişin başarıyla sonuçlandığını ifade eder.
OrderFailed Siparişin başarısız sonuçlandığını ifade eder.
OrderCanceled Siparişin iptal edildiğini ifade eder.
Ekstra Senaryo Çözüm
    //State
    abstract class OrderState
    {
        public abstract void OrderCreate();
        public abstract void StockReserve(int quantity);
        public abstract void Payment(int totalPrice);
    }
    //Context
    class OrderMachine
    {
        OrderState state;
        OrderState noOrder;
        OrderState suspend;
        OrderState stockReserve;
        OrderState payment;
        OrderState orderCompleted;
        OrderState orderFailed;
        OrderState orderCanceled;
        public OrderMachine()
        {
            noOrder = new NoOrder(this);
            suspend = new Suspended(this);
            stockReserve = new StockReserved(this);
            orderCompleted = new OrderCompleted(this);
            orderFailed = new OrderFailed(this);
            orderCanceled = new OrderCanceled(this);

            state = noOrder;
        }

        public int Stock { get; set; } = 1000;

        public void SetNoOrder()
            => state = noOrder;
        public void SetSuspended()
            => state = suspend;
        public void SetStockReserved()
            => state = stockReserve;
        public void SetOrderCompleted()
            => state = orderCompleted;
        public void SetOrderFailed()
            => state = orderFailed;
        public void SetOrderCanceled()
            => state = orderCanceled;

        public void OrderCreate()
            => state.OrderCreate();
        public void StockReserve(int quantit)
            => state.StockReserve(quantit);
        public void Payment(int totalPrice)
            => state.Payment(totalPrice);
    }
    //Concrete State
    class NoOrder : OrderState
    {
        OrderMachine _context;
        public NoOrder(OrderMachine context)
            => this._context = context;

        public override void OrderCreate()
        {
            Console.WriteLine("Sipariş oluşturuldu.");
            _context.SetSuspended();
        }
        public override void Payment(int totalPrice)
            => Console.WriteLine("Sişarip oluşturmadan ödeme yapılamaz!");
        public override void StockReserve(int quantit)
            => Console.WriteLine("Sipariş oluşturmadan stok güncellenemez!");
    }
    //Concrete State
    class Suspended : OrderState
    {
        OrderMachine _context;
        public Suspended(OrderMachine context)
            => this._context = context;

        public override void OrderCreate()
            => Console.WriteLine("Sipariş zaten oluşturuldu...");
        public override void Payment(int totalPrice)
            => Console.WriteLine("Stok güncellenmeden ödeme yapılamaz!");
        public override void StockReserve(int quantit)
        {
            if (quantit > _context.Stock)
            {
                Console.WriteLine("Sipariş edilmek istenen ürün miktarı, stok miktarından fazladır!");
                _context.SetOrderCanceled();
                Console.WriteLine("Sipariş iptal edilmiştir.");
            }
            else
            {
                Console.WriteLine("Sipariş edilen ürün miktarı kadar stok başarıyla güncellenmiştir.");
                _context.SetStockReserved();
                Console.WriteLine($"Kalan stok miktarı : {_context.Stock - quantit}");
            }
        }
    }
    //Concrete State
    class StockReserved : OrderState
    {
        OrderMachine _context;
        public StockReserved(OrderMachine context)
            => this._context = context;

        public override void OrderCreate()
            => Console.WriteLine("Sipariş zaten oluşturuldu...");
        public override void Payment(int totalPrice)
        {
            if (totalPrice < 1500)
            {
                Console.WriteLine("Ödeme başarıyla gerçekleştirildi...");
                _context.SetOrderCompleted();
            }
            else
            {
                Console.WriteLine("Yetersiz bakiye!");
                _context.SetOrderFailed();
            }
        }
        public override void StockReserve(int quantit)
            => Console.WriteLine("Stok bilgisi zaten güncelleştirildi...");
    }
    //Concrete State
    class OrderCompleted : OrderState
    {
        OrderMachine _context;
        public OrderCompleted(OrderMachine context)
            => this._context = context;

        public override void OrderCreate()
            => Console.WriteLine("Sipariş zaten başarıyla tamamlandı...");
        public override void Payment(int totalPrice)
            => Console.WriteLine("Sipariş zaten başarıyla tamamlandı...");
        public override void StockReserve(int quantit)
            => Console.WriteLine("Sipariş zaten başarıyla tamamlandı...");
    }
    //Concrete State
    class OrderFailed : OrderState
    {
        OrderMachine _context;
        public OrderFailed(OrderMachine context)
            => this._context = context;

        public override void OrderCreate()
            => Console.WriteLine("Sipariş başarısız sonuçlandı...");
        public override void Payment(int totalPrice)
            => Console.WriteLine("Sipariş başarısız sonuçlandı...");
        public override void StockReserve(int quantit)
            => Console.WriteLine("Sipariş başarısız sonuçlandı...");
    }
    //Concrete State
    class OrderCanceled : OrderState
    {
        OrderMachine _context;
        public OrderCanceled(OrderMachine context)
            => this._context = context;

        public override void OrderCreate()
            => Console.WriteLine("Sipariş iptal edildi... Sipariş edilen ürün adedini güncelleyiniz!");
        public override void Payment(int totalPrice)
            => Console.WriteLine("Sipariş iptal edildi... Sipariş edilen ürün adedini güncelleyiniz.");
        public override void StockReserve(int quantit)
        {
            if (quantit > _context.Stock)
            {
                Console.WriteLine("Sipariş edilmek istenen ürün miktarı, stok miktarından fazladır!");
                _context.SetOrderCanceled();
                Console.WriteLine("Sipariş iptal edilmiştir.");
            }
            else
            {
                Console.WriteLine("Sipariş edilen ürün miktarı kadar stok başarıyla güncellenmiştir.");
                _context.SetStockReserved();
                Console.WriteLine($"Kalan stok miktarı : {_context.Stock - quantit}");
            }
        }
    }

Yukarıda State Design Pattern mantığında gerekli tasarım oluşturulmuştur. Şimdi oluşturulan bu tasarımı net bir şekilde test edebilmek için aşağıdaki üç farklı şekilde kullanımı ele alıp sonuçlarını gözlemlemekte fayda vardır.

C# State Design Pattern(State Tasarım Deseni) C# State Design Pattern(State Tasarım Deseni) C# State Design Pattern(State Tasarım Deseni)
C# State Design Pattern(State Tasarım Deseni) C# State Design Pattern(State Tasarım Deseni) C# State Design Pattern(State Tasarım Deseni)

İyi çalışmalar 🙂

Bunlar da hoşunuza gidebilir...

Bir yanıt yazın

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