Strategy deseni nedir? if/else zincirlerini nasıl ortadan kaldırır?
Cevap
Strategy, bir işin farklı yapılış biçimlerini (algoritmaları) ayrı sınıflara/fonksiyonlara koyup çalışma zamanında değiştirilebilir hâle getiren davranışsal bir desendir.
Problem
def calculate_shipping(order, method):
if method == "standard":
return 30
elif method == "express":
return 30 + order.weight * 5
elif method == "free_over_500":
return 0 if order.total >= 500 else 30
# her yeni yöntemde bu fonksiyon değişirStrategy ile
from typing import Protocol
class ShippingStrategy(Protocol):
def cost(self, order) -> float: ...
class Standard:
def cost(self, order): return 30
class Express:
def cost(self, order): return 30 + order.weight * 5
class FreeOver:
def __init__(self, threshold): self.threshold = threshold
def cost(self, order): return 0 if order.total >= self.threshold else 30
class Checkout:
def __init__(self, shipping: ShippingStrategy):
self.shipping = shipping
def total(self, order):
return order.total + self.shipping.cost(order)
STRATEGIES = {"standard": Standard(), "express": Express(), "promo": FreeOver(500)}
checkout = Checkout(STRATEGIES[user_choice])Faydaları
- Open/Closed: yeni yöntem eklemek yeni sınıf eklemektir.
- Her strateji ayrı ve kolayca test edilir.
- Davranış çalışma zamanında değiştirilebilir.
Örnekler
Sıralama karşılaştırıcıları (sorted(key=...)), ödeme yöntemleri, sıkıştırma algoritmaları, Passport.js kimlik doğrulama stratejileri.
Fonksiyonların birinci sınıf vatandaş olduğu dillerde strateji çoğu zaman yalnızca bir fonksiyondur; sınıf hiyerarşisi kurmak şart değildir.
İlgili OOP & Tasarım Desenleri soruları
- Clean code nedir? Yaygın code smell'ler nelerdir?
- Dependency Injection nedir? IoC container ne işe yarar?
- 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?
- 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.