Decorator deseni nedir? Kalıtıma göre avantajı nedir? Bir örnekle gösterin.
Cevap
Decorator, bir nesneye aynı arayüzü koruyarak çalışma zamanında yeni davranışlar ekleyen yapısal bir desendir. Nesne, aynı arayüzü uygulayan bir sarmalayıcıya (wrapper) konur; sarmalayıcı işi asıl nesneye devreder ve öncesinde/sonrasında ek iş yapar.
Neden kalıtım değil?
Loglama, cache ve retry özelliklerini kalıtımla eklemeye çalışırsanız her kombinasyon için ayrı alt sınıf gerekir (CachedLoggedRetryingClient...). Bu sınıf patlamasıdır. Decorator'larla bunları serbestçe zincirleyebilirsiniz.
from abc import ABC, abstractmethod
import time
class DataSource(ABC):
@abstractmethod
def read(self, key: str) -> str: ...
class DbSource(DataSource):
def read(self, key):
return f"db:{key}"
class CacheDecorator(DataSource):
def __init__(self, inner: DataSource):
self.inner, self.cache = inner, {}
def read(self, key):
if key not in self.cache:
self.cache[key] = self.inner.read(key)
return self.cache[key]
class TimingDecorator(DataSource):
def __init__(self, inner: DataSource):
self.inner = inner
def read(self, key):
t = time.perf_counter()
try:
return self.inner.read(key)
finally:
print(f"read({key}) {time.perf_counter() - t:.6f}s")
source = TimingDecorator(CacheDecorator(DbSource()))
source.read("user:1")Gerçek hayattan örnekler
- Java I/O:
new BufferedReader(new InputStreamReader(new FileInputStream(f))). - HTTP middleware zincirleri (Express, ASP.NET Core) aynı fikrin fonksiyonel hâlidir.
- Python'daki
@decoratorsözdizimi fonksiyonları sarmalar; adı ortak, mantığı aynıdır ama nesne değil fonksiyon düzeyinde çalışır.
Dezavantajları
Çok katmanlı sarmalama hata ayıklamayı zorlaştırır; decorator sırası sonucu etkileyebilir (cache'i timing'in içine mi dışına mı koyduğunuz ölçümü değiştirir).
İ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?
- Observer deseni nedir? Gerçek hayatta nerelerde karşımıza çıkar?
- Factory deseni nedir? Ne zaman kullanılır?
- Singleton deseni nedir? Neden bazen anti-pattern olarak görülür?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.