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 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.
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:
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.
Zincirin her halkası, bir sonraki halkaya erişebileceğine
göre, kendi tipinde bir özellik taşıması gerekiyor. Bu özelliğe de BirSonrakiSorumlu diyelim.
ToplantiSalonRezervasyon sınıfına istemciden erişecek olan metodumuz
MAIN DEN ERİSMEK İÇİN BU METODU KULLANACAĞIZ.
--------------------------------------------------------------------------------------------------------------------------
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?
Yorumlar
Yorum Gönder