CHAIN OF RESPONSIBILITY(SORUMLULUK ZINCIRI)DESIGN PATTERN-PROBLEM ÇÖZÜMÜ C#


Chain of RespoNsibility(Sorumluluk Zinciri)DESIGN PATTERN

 Chain of Responsibility (Sorumluluk Zinciri) tasarım deseni behavior grubununa ait, bir isteğin belli sınıflar içinde gezdirilerek ilgili sınıfın işlem yapmasını yöneten tasarım desenidir.  Chain of responsibility tasarım deseninin dofactory.com a göre kullanım sıklığı 40% lardadır.//ORTALAMA
 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.


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 yazacaktık:
SORUMLULUK 

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 ihtiyacı çözmesini istemiyoruz. Onun yerine bir nesne oluşturmak ve bu nesnenin ilgili metodunu çağırmak çok daha iyi olur.
 Kullanıcının kiralamak istediği salonun yeri, katılımcı bilgisi gibi verilere göre ilgili sunucudaki veritabanına bağlanıp filtrelenmiş sonucu döndürmeli.
 
 Unutmayın! Amacımız if bloğunun verimsizliğinden kurtulmaktı.


 O zaman ilk adımımız bu nesnenin sınıfını oluşturmak olsun.

Nesnemizin özelliklerini dışarıdan alacak.
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.
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.
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 bir
hiyerarş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?



KAYNAKLAR


Yorumlar

Bu blogdaki popüler yayınlar

Veri Madenciliği Bilgi Keşfi Nedir? Bilgi Keşfi Süreçleri Nelerdir?

QR Kod nedir? Ne İşe Yarar? Nerelerde Kullanılır? Nasıl Taranır?

Takviyeli/Pekiştirmeli Öğrenme (Reinforcement Learning)