Transaction Yönetiminde C# İle OOP Yaklaşımı

Selamlar,

Bugün iş hayatında en kritik konuların başında gelen, birbirine bağımlı, çok adımlı işlemler yapılırken bir işlemin bitiminden sonra çalıştırılması gereken bir sonraki işlemin nasıl yönetilebileceğini, ayrıca oluşabilecek hata durumlarında o ana kadar yapılmış tüm işlemlerin nasıl geri alınabileceğini hep beraber inceleyeceğiz. Son olarak yapılan işlemler için notify mekanizmasını, var olan bu sistem üzerine nasıl oturtabileceğimizi hep beraber tartışacağız.

Gerçek hayattan örnek vermek gerekir ise bankalarda kullanılan para transferi, birçok firmada kullanılan döküman yönetimi ve son örnek olarak online sinema veya maç bileti alımı işlemlerini verebiliriz. Eğer tüm adımlar başarılı bir şekilde tamamlanmaz ise o ana kadar yapılan tüm işlemlerin geri alınması ve ayrıca geçilen her adımın kullanıcıya bildirilmesi gerekmektedir.

Birbirini takip eden işlemler için Chain of Responsibility design pattern tercih edilebilecek yaklaşımlardan biridir. Burada sadece ileri yönlü hareket yerine geriye dönüş sistemi de hesaba katılmalıdır. Bu örnekde birbirini takip eden bir takım para transfer işlemleri yapılacaktır. Bankaların işlem adımlarında, çeşitli birimlerin bilgilendirilmesi için Observer design pattern kullanılacaktır.

Chain of Responsibility Yapısı: Dikkat edilirse bu pattern sadece ileri yönlüdür. Ben bu yapıya bir de olumsuz durumlarda geriye dönülecek BackHandler tanımladım. Bu tamamen benim yaklaşımımdır. Chain of Responsibility’yi tanımlayabilecek benim en çok aklımda kalan örnek, yiyecek veya kahve otomatlarıdır.

Yapılacak transaction işlemler için ortak görülen “IOperator” interface’i aşağıdaki gibi tanımlanmıştır.

NotifyCenter: Bildirim yani notify tipleri Enum olarak aşağıdaki gibi tanımlanmıştır. Kısaca haber verilecek birimler burada tanımlanmıştır.

TransactionStage: Transaction yani yapılacak işlem adımları gene Enum şeklinde aşağıdaki gibi tanımlanmıştır.

TransactionInfo: Transactin özelliklerinin tutulduğu sınıftır.

Observer Tasarım Kalbı Yapısı: En akılda kalıcı örneklerden biri borsada tahvil almış tüm müşterilerin, fiyat değişikliği durumunda  yani property set durumunda müşterilerin ilgili değişiklikten dolayı bilgilendirilmesi işlemidir.

TransactionHandler abstarct sınıfı aşağıdaki gibi “IOperator” sınıfından türetilmiştir. Transaction sınıfına ait özellikler burada tanımlanır.

  • NotfiyType” ile uyarı işlemi yapılacak merkez belirlenir.
  • Notify()” methodu ile ilgili kuruma haber verme işlemi tanımlanır.
  • “isFirst” ilk başlanacak transaction belirlenmiş, böylece bir hata durumunda geri dönülen transaction işlemindeki son nokta tanımlanmıştır.
  • NextTransaction()” methodu ile bu transaction’da yapılan işlemin olumlu bir şekilde sonuçlanması durumunda bir sonraki çağrılacak işlem burada tanımlanır.
  • BeforeTransaction()”  methodu ile bu transaction’da yapılan işlemde çıkabilecek bir hata durumunda, geri dönülmesi gereken bir önceki işlem burada tanımlanır.
  • ProcessPreviewTransaction()” methodunda hatalı bir durum ile karşılaşıldığında işlemlerin geri alınması için çağrılan bir methoddur. Burada işlemin geri alınacağı mesajı ve “Notify()” işlemi yapılır. Son olarak ilk transaction’a gelinmemiş ise bir önceki transaction’a ait “ProcessPreviewTransaction()” methodu çağrılır.

Transaction 1-2-3-4 aşağıda görüldüğü gibi tanımlanmıştır. Hepsi de “TransactionHandler()” abstract sınıfından türetilmişlerdir.

1-2 ve 3. Transaction’da yapılacak işlem, bu işlem sonucunun, birimlere iletileceği “Notify()” methodu aşağıdaki gibi tanımlanmıştır. Ayrıca işlemin olumlu olması durumunda, ilgili transaction’a tanımlanmış “nextTransaction”‘ın “ProcessTransaction()” methodu “TransactionInfo” sınıfına ait olan “sInfo” değişkeni, paramtere olarak geçilerek tetiklenir.

Eğer işlem başarız olunup hataya düşülünürse, yine işlemlerin geri alınacağına dahil “Notify()” methodu işletilip, ilgili transaction’a tanımlanmış “beforeTransaction”‘ın “ProcessTransaction()” methodu, “TransactionInfo” sınıfına ait olan “sInfo” değişkeni, parametre olarak geçilerek tetiklenir.

4.Transaction’da bilinçli olarak hata yapılması sağlanmış ve bu adıma kadar işletilen tüm Transactionların yaptığı işlerin geri alınması sağlanmıştır. Yani her bir Transaction’ın “beforeTransaction”‘ propertysine atanan Transaction’ın “ProcessTransaction()” methodunun tetiklenmesi sağlanmıştır. Bu işlem ilk atanan Transaction’a kadar devam edecektir. Yani “isFirst” propertysi true olan Transaction’a kadar geri gidilecektir.

Program.cs: Örnek amaçlı oluşturulan 4 Transaction aşağıdaki gibi tanımlanmıştır.

Ekran Çıktısı:

Böylece transaction gibi önemli bir durumda, design patternler ile işlerin ne kadar kolaylaşabileceğini, tasarım kalıpları polimorfizm’i ile eldeki ihtiyaca tekbir yöntem ile cevap verilemediğinde farklı tasarım kalıplarının bir arada kullanılması ile çözüme nasıl gidilebileceğine hep beraber inceledik. Ayrıca ben bu örnek de var olan “Chain of Responsibility design pattern“‘ına kendimce farklı bir esneklik katıp, sadece ileri yönlü değil aynı zamanda geriye doğru işleyen adımlarının da yapılmasını sağladım. Arada bir böyle çılgınlıklar yapmak güzel olabiliyor:) Bu konudaki fikir ve düşünceleriniz benle paylaşırsanız sevinirim.

Not: Momento Design Patternini de belki kullanabilirdik. Ama Undo ve Redo işlemlerinden, daha kapsamlı bir iş akşı içerisinde olduğumuzdan tercih etmedim.

Geldik bir makalenin daha sonuna. Yeni bir makalede görüşmek üzere hoşçakalın.

Herkes Görsün:

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. Ümit dedi ki:

    Elinize sağlık. Oldukça anlaşılır faydalı bir makale olmuş.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir