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şir

Strategy 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.

  1. Clean code nedir? Yaygın code smell'ler nelerdir?OrtaOOP & Tasarım DesenleriYazılım Müh.
  2. Dependency Injection nedir? IoC container ne işe yarar?ZorOOP & Tasarım DesenleriYazılım Müh.
  3. Observer deseni nedir? Gerçek hayatta nerelerde karşımıza çıkar?OrtaOOP & Tasarım DesenleriYazılım Müh.
  4. Factory deseni nedir? Ne zaman kullanılır?OrtaOOP & Tasarım DesenleriYazılım Müh.
  5. Singleton deseni nedir? Neden bazen anti-pattern olarak görülür?ZorOOP & Tasarım DesenleriYazılım Müh.
  6. Interface ile abstract class arasındaki fark nedir?KolayOOP & Tasarım DesenleriYazılım Müh.

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle