Observer deseni nedir? Gerçek hayatta nerelerde karşımıza çıkar?
Cevap
Observer, bir nesnenin (subject) durumu değiştiğinde ona abone olan nesnelere (observers) otomatik olarak haber vermesini sağlayan davranışsal bir desendir. Yayıncı ile aboneler birbirinin somut sınıfını bilmez, gevşek bağlıdır.
class EventEmitter:
def __init__(self):
self._listeners = {}
def on(self, event, callback):
self._listeners.setdefault(event, []).append(callback)
return lambda: self._listeners[event].remove(callback) # unsubscribe
def emit(self, event, *args):
for cb in list(self._listeners.get(event, [])):
cb(*args)
orders = EventEmitter()
orders.on("created", lambda o: print(f"E-posta gönder: {o['id']}"))
orders.on("created", lambda o: print(f"Stoktan düş: {o['id']}"))
orders.emit("created", {"id": 42})Sipariş servisi, e-posta veya stok modülünü bilmeden olayı yayınlar; yeni bir abone eklemek mevcut kodu değiştirmez.
Gerçek hayattan örnekler
- DOM olayları:
button.addEventListener("click", ...) - Node.js
EventEmitter, RxJS Observable'ları - React state değişince bileşenlerin yeniden render edilmesi, Redux
subscribe - MVC'de model değişince view'in güncellenmesi
- Dağıtık sistemlerde pub/sub (Kafka, Redis Pub/Sub) aynı fikrin ölçeklenmiş hâlidir.
Dikkat edilecekler
- Bellek sızıntısı: abonelikten çıkılmazsa observer'lar referans tutulduğu için toplanamaz (React'te
useEffectcleanup bu yüzden önemlidir). - Bildirim sırası garanti edilmemeli.
- Senkron bildirimde yavaş bir abone tüm akışı yavaşlatır; bir abonenin hatası diğerlerini engellememeli.
- Zincirleme olaylar akışın takibini zorlaştırabilir.
İlgili OOP & Tasarım Desenleri soruları
- Clean code nedir? Yaygın code smell'ler nelerdir?
- Dependency Injection nedir? IoC container ne işe yarar?
- Strategy deseni nedir? if/else zincirlerini nasıl ortadan kaldırır?
- Factory deseni nedir? Ne zaman kullanılır?
- Singleton deseni nedir? Neden bazen anti-pattern olarak görülür?
- Interface ile abstract class arasındaki fark nedir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.