20 Kasım 2019 Çarşamba

GoF - Observer Örüntüsü

Giriş
GoF kitabından Observable nesnesine Subject deniliyor ancak ben bu yazıda Java'daki gibi Observer ve Observable isimlendirmesini kullanacağım.

Observer en temel tasarım örüntülerinden bir tanesi. Değişen nesne, değişikliğini diğerlerine haber verir. En basit kullanım şeklinde, Observer ve Observable aynı thread üzerinde çalışırlar.

Esneklik
Observer örüntüsünün en sevdiğim tarafı bağımlılıkların sıralamasının kolayca değiştirme imkanı tanıması. Elimizde şöyle bir bağımlılık yapısı olsun. Bu bağımlılık aynı zamanda yazılımdaki akışı da belitir.
A - feed -> B <- observe - C
A bileşeni B'yi besler. C ise B'yi izler.

Eğer D isimli yeni bir işlem tipi daha gelirse D de kolaylıkla B'ye abone olabilir. Böylece akışı değşitirmek kolaylaşır.
A - feed -> B <- observe - D -> call C
Fix Everything Yöntemi
Observer tetiklenince idempotent olarak tabi edilen ve herşeyi baştan yapan bir metod çağırır. Idempotency Nedir yazısına taşıdım

Diğer
1. Observer işlevini gören sınıfa Processor, Controller (!) gibi isimler verildiğini gördüm. Proje içinde tutarlı bir isimlendirme yapmak gerekir.

2. Observer ile Reactive Programming birbirleri ile ilintili.

AntiPattern
Antipattern bir probleme bulunan faydasız hatta zararlı çözümdür.

Örnek
Bir projede Observable kendisine takılı Observer'ları bir başka thread içinde yani arka planda tetikliyordu. Bu debug etmeyi inanılmaz zorlaştırıyor. Observer kendisine gelen çağrıyı yine kendisi karar vererek arka plandaki bir başka thread içinde işlemeye karar vermeli. Bu kararın Observable nesnesine bırakılması bence doğru değil!

Java
Observable Sınıfı yazısına taşıdım.

C#
GoF - Observer Örüntüsü yazısına taşıdım.

State Notification Örüntüsü
Observer ile yakından ilgili bir başka örüntü StateNotification. Observer'dan farkı, olay oluştuktan sonra bile yeni eklenen Observer'ın tetiklenebilmesi.
Örnek
En kolay örnek javascript'teki ready() metodu. Açıklaması şöyle. Bu metod doküman yüklendikten sonra bile aşağıdaki kodu çalıştırınca tetikleniyor.
That depends upon whether it is really an Event or State Notification (which is what ready is). If it is an event, then you don't tell the listener about all prior events. If it is State Notification, then you tell them immediately after they have subscribed and you are in the specified state.
Şöyle yaparız.
$(document).ready(function () {
    console.log("Works.");
});


Hiç yorum yok:

Yorum Gönder