Alper ÖNER - Blog

Chain of Responsibility DESIGN PATTERN

2020-07-21 16:26:58649 okunma
C# CHAIN OF RESPONSIBILITY(SORUMLULUK ZINCIRI)DESIGN PATTERN

248371640332427.png image
Chain of responsibility tasarım deseni; bir isteğin duruma göre farklı şekillerde işlem yapılması gereken durumlarda kullanılır. Bu tasarım deseninde isteğe cevap verebilecek sınıflar aynı arayüzü kullanır ve isteğin durumuna göre ya cevap verir ya da isteği zincirdeki sonraki nesneye gönderir.

Chain of responsibility tasarım deseninde 3 ana yapı vardır.

Handler(eylemci):

İsteği işleyebilecek sınıfların uygulamasını yapan sınıftır. Yani zincirdeki bütün halkalar bu arayüzü uygulamak zorundadır. Bu arayüzde kendisini gösteren bir property ve isteğe cevap verebilecek bir metot tanımlı olur.

ConcreteHandler(Somut,beton):

İsteğe cevap verebilecek (veya sonraki nesneye yönlendirebilecek) gerçek sınıflardır. Bu sınıfların hepsi Handler olarak tanımlanan arayüzü uygulamak zorundadır.

Client:

Zincirin oluşturan ve zincirin ilk halkasına isteği gönderen nesnedir.
Chain of responsibility tasarım deseni için örnek uml şeması aşağıdadır.
216754234748765.jpg image
•Chain of responsibility sorumluluk zinciri anlamına gelmektedir.
•Sisteme gönderilen bir istedigin (komut) hangi nesne tarafından cevaplanması gerektigini bilmedigimiz durumlarda ya da isteği yapan nesne ve servis sağlayan nesne arasında sıkı bir bağ oluşmasını engellememiz gerektiğinde Chain of Responsibility tasarım şablonu kullanılır.
•Bu tasarım şablonunda servis sağlayan ilgili tüm nesneler bir kolye üzerindeki boncuklar gibi birbirleriyle ilişkili hale getirilir.
•Bir nesne zincirdeki kendinden sonraki nesneyi tanır ve isteği kendi cevaplayamadığı durumda, kendinden sonraki nesneye iletir.
Bu işlem, zincirde bulunan doğru servis saglayıcı nesneyi bulana kadar devam eder.

PROBLEM

Bu proje, tüm dünyada faaliyet gösteren birden çok sanal ofis firmasının toplantı salonunun kiralama uygulamasını geliştirmek.
Halihazırda var olan sistem, firmanın çalıştığı ülkelere göre birçok sunucuya ayrılmış durumda.Örneğin Türkiye’den bir toplantı salonu kiralayacaksanız, 150.143.253.114 gibi bir IP adresindeki (URL de olabilir) veritabanını kullanmanız gerekiyor.
Bizden istenen, müşteri tarafından belirtilen şehir ve katılımcı sayısına göre gerekli salonların filtrelenerek kullanıcıya sunulması.
EĞER BİRAZDAN ELE ALACAĞIMIZ TASARIM DESENİ HİÇ OLMASAYDI, BU KISMI NASIL KODLARDINIZ?
BİR DÜŞÜNELIM. ELİMİZDE ÇOK BASİT BIR KOŞUL VAR.
EĞER ISTENEN YER TÜRKİYE İSE, İLGİLİ DB’YE BAĞLAN VE GEREKLİ İŞLEMLERI YAP.
O ZAMAN,
SALONLARI GETİRMEK İÇİN ŞUNA BENZER BIR KOD YAZACAKTIK:
367523573420724.PNG image
Böyle apartman gibi if (ya da switch case) bloğunun istemci kodu için çok verimsiz ve bakım maliyetini arttıran bir yapı olduğu su götürmez bir gerçek. Bu kirli bir kod.Çünkü, ihtiyaçlarınız değiştiğinde bu kodu da değiştirmek zorunda kalacaksınız. Uygulamayı geliştirdiğimiz müşteri,yeni bir ülkeyle çalışmaya başladığında yukarıdaki yapıya bir if daha eklemek geliştiriciyi de müşteriyi de çıldırtacak bir durumdur.
ÇÖZÜM>>>COR
ŞIMDI BIZ ISTEMCININ IF BLOĞU ILE BU IHTIYACI ÇÖZMESINI ISTEMIYORUZ.ONUN YERINE BIR NESNE OLUŞTURMAK VE BU NESNENIN ILGILI METODUNU ÇAĞIRMAK ÇOK DAHA IYI OLUR.

KULLANICININ KIRALAMAK ISTEDIĞI SALONUN YERI, KATILIMCI BILGISI GIBI VERILERE GÖRE ILGILI SUNUCUDAKI VERITABANINA BAĞLANIP FILTRELENMIŞ SONUCU DÖNDÜRMELI.
UNUTMAYIN! AMACIMIZ IF BLOĞUNUN VERIMSIZLIĞINDEN KURTULMAKTI.

O zaman ilk adımımız bu nesnenin sınıfını oluşturmak olsun.
454624256833065.PNG image
Nesnemizin özelliklerini dışarıdan alacak.
354372313016641.PNG image
Zincirin her halkası, bir sonraki halkaya erişebileceğine göre, kendi tipinde bir özellik taşıması gerekiyor. Bu özelliğe de BirSonrakiSorumlu diyelim. Bu nesnenin Ara metodu da bizden AramaKriteri nesnesini alacak ve sorumlu nesneye (zincirin sonraki halkasına) doğru aktaracak.
161013026330943.PNG image
ToplantiSalonRezervasyon sınıfına istemciden erişecek olan metodumuz MAIN DEN ERİSMEK İÇİN BU METODU KULLANACAĞIZ.
--------------------------------------------------------------------------------------------------------------------------
Artık zincirimizin tüm halkalarını oluşturabiliriz.
483704878442060.PNG image
Burada önemli olan, her halkanın kendi sorumluluğunu bilmesi.Eğer işlemi yapmaktan sorumlu değilse, ilgili veriyi bir sonraki halkaya fırlatması.Aslında bu halkaların arasında birhiyerarşi de oluşturuluyor.Bu hiyerarşinin nasıl oluşacağını elbette sizin senaryonuz belirleyecektir.
•Şimdi, istemci koduna geçerek temiz kodumuzu gözlemleme zamanı.
•İlk olarak, üç halka nesnesini oluşturacağım ve belirlediğim sıraya göre, birleştireceğim.
Ardından da zincirin ilk halkasına talepte bulunacağım. Bakalım sonuç ne olacak?
409253918324503.PNG image

328312738516519.png image

Kaynaklar
https://www.turkayurkmez.com/chain-of-responsibility-design-pattern/
http://harunozer.com/makale/
sorumluluk_zinciri_tasarim_deseni__chain_of_responsibility_design_pattern.html

Yorumlar
| 2021-01-16 19:34:47

http://mewkid.net/when-is-xuxlya2/ - Amoxicillin <a href="http://mewkid.net/when-is-xuxlya2/">Amoxicillin 500 Mg</a> hob.sreh.alpersahinoner.com.puj.lr http://mewkid.net/when-is-xuxlya2/

| 2021-01-16 20:14:23

http://mewkid.net/when-is-xuxlya2/ - Amoxicillin <a href="http://mewkid.net/when-is-xuxlya2/">Amoxicillin</a> mqw.yhtg.alpersahinoner.com.rxj.iq http://mewkid.net/when-is-xuxlya2/

Yorum yapabilirsiniz.
Onaylandıktan sonra yorumlarınız paylaşılacaktır.