Observer Design Pattern

Behavioral (davranışsal) tasarım kalıplardan olan observer pattern sık kullanılır. One to many ilişkili birden fazla nesneden oluşur. Bir nesne değiştiği zaman, ona bağlı diğer nesnelerde otomatik olarak değişmektedir. Olay (event) bazlı değişimler olmaktadır.

Aslında observer pattern c#’da bulunan event yapısı ile aynıdır.

Subject: Ana nesnedir. Bu nesne içerisinde diğer nesnelerin içinde bulunduğu liste vardır. Yani diğer nesneler(observers) subject’e bağlıdır. Birden fazla observer tek bir subject’e bağlanabilir. Notify() metodu ile observerların içerisinde bulunan update() metodunu çağırır. Attach() metodu ile nesne bağlarız. Detach() metodu ile nesneleri ayırma işlemini yaparız.

Observer: Subject’e bağlıdır. Ana nesnede değişim olduğu zaman observer içerisinde bulunan update() metodu subject tarafından çağrılır. Böylece her observerler meydana gelen değişimden etkilenir.

Yukarıda bahsettiğim subject ve observer nesnelerini metodları aşağıdaki uml şeması ve sequence diyagramı ile gösterilmiştir. Notify() ile mevcut tüm observer nesnelerinin update() metodları çağrılmaktadır. Böylece olan değişimlerden observerlar etkilenir. Concreteobserver nesnesinde, subject tarafından çağrılan update() metodu içerisinde mevcut durum güncellenir. Concretesubject ise değişim olduğu zaman observerlara bildirim yollar.

 

observeruml
uml şeması

sequence diyagram
sequence diyagram

Örnekler: Observer pattern çalışma mantığını örnekler ile anlatalım.

  • Verilerin 3 farklı sunum şekli tanımlanmıştır. Bunlar observer, veri kaynağı ise subject olarak tanımlanmıştır. Subject üzerinde yapılan herhangi bir değişiklik observerlar üzerinde uygulanır. Observer nesneleri veriyi aynı yerden alırlar ancak birbirlerinden haberleri yoktur. Birden fazla observer bulunabilir.

observer-spreadsheet-example

  • Bir diğer örnekte sorular sorulup kullanıcıların cevapladığı yaygın platform quora üzerinden olsun. Sorulan soru subject olsun. Bu soruyu takip eden 13 kişi olsun. Takipçiler observer nesneleri olacaktır. Mevcut soruya yeni bir cevap yazıldığı zaman soruyu takip eden herkes bildirim almaktadır.
  • MVC (model view controller) mimarisi observer pattern için bir örnektir. Modelin(subject), viewlar(observers) ile ayrışmasını sağlar. Model üzerinde herhangi bir değişim olduğu zaman tüm viewlar etkilenecektir.
  • Event management (olay yönetimi) yapılırken kullanılır.

Kısaca tanıtım yaptıktan sonra kod kısmına geçelim. Github üzerinden koda erişebilirsiniz.

Örnekte ürün market ilişkisi observer pattern ile gösteriliyor. Ürünler subject olarak, marketler observer olarak tanımlanmıştır. Ürünlerin fiyatları değiştiği zaman tüm marketler bu değişimden haberdar olacaktır.

Ürünler için abstract olarak Product sınıfı tanımlanmıştır. Bu sınıftan yeni ürünler yani subjectler türetilecektir. Attach() metodu içerisinde shops listesine marketler eklenmektedir. Yani fiyat değiştiği zaman güncellenecek olan observerlar burada bağlanıyor. Detach() metodu ile tam tersi olarak listeden marketler çıkarılmaktadır. Fiyat ve ürün ismi olarak 2 değişken döndürülmektedir.

abstractsubject

  ProductA sınıfı bu abstract sınıftan türetilmiştir. Aynı şekilde birden fazla ürün yani subject oluşturup onlara farklı farklı observerlar bağlayabiliriz.

concretesubject

Concrete observer sınıfı ile subjectlere bağlanacak nesneler oluşuyor. Bu sınıf içerisinde Update() metodu içeren bir interfaceden kalıtım almaktadır. Subject içerisinde bulunan Notify() metodu içerisinde observer içerisindeki update metodu çağrılmaktadır. Böylece ne kadar nesne üretilmiştir ise hepsi değişimden haberdar olacaktır.

observer

Programı çalıştıran kod aşağıda gösterilmiştir. Önce observer ve subject nesnelerini oluşturduk. Ardından subject nesnelerine observerları attach() metodu ile bağladık. Ardından fiyat değişimleri yapınca her bir observer nesnesinin update() metodu çağrılmaktadır.

programcode

Ekran çıktısı

output

Kaynakça

Advertisements

Software Design Patterns (Yazılım Tasarım Şablonları)

Herkese merhabalar. Yazılım dünyasında sıkça bahsedilen ve önemli olan yazılım tasarım şablonları ile ilgili yazı dizisi yazmaya karar verdim.

Yazılım tasarımı sırasında sıkça karşılaşılan problemlere çözüm için tasarlanmış yazılım şablonlarına denir. Birçok farklı durum için o problemi çözmek için tasarlanmış kalıplardır. Bu tanımlamalar kullanılarak yazılım tasarımı yapılmaktadır. Yazılımcıların sistem veya uygulama geliştirirken kabul ettiği en iyi tasarım alıştırmalarından oluşmaktadır.

Tasarım şablonları programlama dillerinden bağımsız olarak tanımlanmışlardır. Ancak nesne tabanlı dillerine uygun tasarım şablonları daha fazla yaygınlaşmıştır. Bu şablonlar nesneler ve sınıflar arasındaki ilişkileri ve etkileşimleri göstermektedir. Yazılımı yapacak olan kişi elinde olan soruna göre bu şablonları özelleştirerek kullanacaktır.

Test edilebilir ve kanıtlanmış bu yapıları kullanarak yazılım geliştirme sürecini hızlandırmaktayız. Kaliteli yazılım tasarımı yapmak için projeyi hayata geçirdikten sonra çıkacak problemleri yazılım geliştirme esnasında çözmeliyiz. Tekrar kullanılabilir tasarım şablonları ile oluşacak büyük sorunların önüne geçebiliriz.

Tasarım şablonları yazılım dünyasında,  (Design Patterns: Elements of Reusable Object-Oriented Software) adlı 1994 yılında yazılmış kitap sayesinde adından söz edilir hale gelmiştir. Kitabı yazan 4 yazar Gang of Four olarak adlandırılır.

Bu kitaba göre tasarım şablonları 3 gruba ayrılır;

  • Creational Patterns ( Yaratımsal Şablonlar )
  • Structural Patterns ( Yapısal Şablonlar )
  • Behavioral Patterns ( Davranışsal Şablonlar )

ooppatterns

Yukarıda gösterilen resimde her belirtilen tasarım şablonu grubunda kullanılan yaklaşımlar gösterilmektedir.

Creational Patterns ( Yaratımsal Şablonlar ):

Yazılım nesnelerinin nasıl yaratılacağı hakkında genel öneriler sunmaktadır. Mevcut duruma uyarlanarak nesne yaratma problemleri ile mücadele etmektedir. Düzensiz oluşturulan nesneler tasarım problemlerine yol açabilir. Nesne yaratımını kontrol ederek karmaşıklıkları önleme amacındadır. Uygulamaya nesne oluştururken esneklik katmaktadır. Asıl amacı, iyi bir yazılımın içinde barındırdığı nesnelerin nasıl yaratıldığından bağımsız tasarlanması gerekliliğidir.

Modern yazılım geliştirmede nesnelerin birbirleri arasında oluşan ilişki önemlidir. Herhangi bir şablon olmadan oluşturulan büyük yazılım modelleri, yeni bir özellik eklenmek istediği zaman veya eklenecek yeni bir özellik olduğunda işlemi zorlaştıracaktır. Ayrıca yeniden kullanılabilirik imkanı azalacaktır.

Ne zaman sisteme eklememiz düşünülebilir?

  • Sistemin nesne yaratımlarından bağımsız olması gerektiğinde
  • Birbiri ile bağı olan nesneleri kullanacağımız zaman
  • Nesneleri nasıl oluşturduğumuzu gizlemek istediğimiz zaman ve sadece oluştukları interfaceleri göstermek istediğimizde.
  • Sınıfların örneklemelerinin çalışma zamanında tanımlanması
  • Temelde tek bir sınıf instantination varsa ve kullanıcı sürekli bu örneklemeye erişmek isterse

Aşağıda gösterilen sınıf diyagram birçok yaratımsal tasarım şablonunda ortaktır.

Creator = Nesne arayüzünü tanımlar ve nesne döndürür.

ConcreteCreator = Nesne arayüzünü implement etmektedir.

Creational_Pattern_Simple_Structure

Structural Patterns ( Yapısal Şablonlar )

Yapısal tasarım şablonları ile dizaynı kolaylaştırarak sınıflar arasındaki iletişimi düzene sokmak için kullanılırlar. Sınıflar ve nesnelerin büyük yapıları nasıl oluşturacağı tanımlanır.

Behavioral Patterns ( Davranışsal Şablonlar )

Nesnelerin davranışları ve birbirleri ile olan ilişkileri ile ilgilenir. Davranışsal şablonları kullanılarak nesnelerin birbileri ile olan iletişimin esnekliği artmaktadır.

Tasarım şablonlarını tanıtarak giriş yapmış olduk. Sonraki yazılarımda Yaratımsal şablonlardan başlayarak, her grupta bulunan yaklaşımları örnekler ile anlatmaya çalışacağım.

Yararlandığım kaynaklar:

Software design pattern

Design Patterns: Elements of Reusable Object-Oriented Software