Software Engineering

Ders Kitabının Ötesinde: Modern Yazılım Mimarilerinde Tasarım Kalıplarının Uygulanması

Tasarım kalıpları, ölçeklenebilir kodu garanti eden katı kurallar veya "sihirli formüller" olarak sıkça yanlış anlaşılmaktadır. Gerçekte ise yazılım tasarımındaki tekrarlayan sorunlara yönelik kanıtlanmış çözümlerdir. Ancak bir kalıbın adını bilmek sadece savaşın yarısıdır; aşırı mühendislik yapmadan ne zaman ve nasıl uygulanacağını anlamak, kıdemliliğin gerçekten kendini gösterdiği yerdir. Bu yazı, tasarım kalıplarının üç temel kategorisine—Yaratıcı, Yapısal ve Davranışsal—teorik tanımlardan ziyade pratik uygulamaya odaklanarak derinlemesine giriyor.

Yaratıcı Kalıplar: Nesne Oluşturmanın Yönetimi

Yaratıcı kalıplar, nesne oluşturma mekanizmalarıyla ilgilenir ve nesneleri duruma uygun bir şekilde oluşturmayı hedefler. En yaygın olanı Factory Method (Fabrika Yöntemi)'tur. Nesneleri doğrudan örneklemek yerine, onları sizin için oluşturmasını bir fabrikadan istersiniz. Bu, istemci kodunu somut sınıflardan ayırarak sistemi daha genişletilebilir hale getirir.

class NotificationService {
    public send() { /* ... */ }
}

class EmailNotification extends NotificationService {
    public send() { console.log("Email sent"); }
}

class SMSService extends NotificationService {
    public send() { console.log("SMS sent"); }
}

class NotificationFactory {
    public static create(type: string): NotificationService {
        switch(type) {
            case 'email': return new EmailNotification();
            case 'sms': return new SMSService();
            default: throw new Error("Invalid type");
        }
    }
}

// Usage
const notifier = NotificationFactory.create('email');
notifier.send();

Bu yaklaşım, mevcut istemci kodunu değiştirmeden yeni bildirim türleri (örneğin Push Bildirimleri) eklemenize olanak tanır ve Açık/Kapalı İlkesi'ne (Open/Closed Principle) uyum sağlar.

Yapısal Kalıplar: Nesne ve Sınıf Bileşimi

Yapısal kalıplar, sınıfların ve nesnelerin daha büyük yapılar oluşturmak için nasıl bir araya getirildiğiyle ilgilenir. Decorator (Süsleyici) Kalıbı, bir nesnenin işlevselliğini yapısını değiştirmeden genişletmenize izin vermesi nedeniyle geliştiriciler arasında popülerdir. Sorumlulukları dinamik olarak eklemeniz gerektiğinde, bu genellikle kalıtım için daha iyi bir alternatiftir.

interface Coffee {
    cost(): number;
    description(): string;
}

class BasicCoffee implements Coffee {
    cost() { return 1.50; }
    description() { return "Black Coffee"; }
}

class MilkDecorator implements Coffee {
    private component: Coffee;
    constructor(component: Coffee) { this.component = component; }

    cost() { return this.component.cost() + 0.50; }
    description() { return this.component.description() + " + Milk"; }
}

class SugarDecorator implements Coffee {
    private component: Coffee;
    constructor(component: Coffee) { this.component = component; }

    cost() { return this.component.cost() + 0.10; }
    description() { return this.component.description() + " + Sugar"; }
}

const coffee = new SugarDecorator(new MilkDecorator(new BasicCoffee()));
console.log(coffee.description()); // "Black Coffee + Milk + Sugar"

Davranışsal Kalıplar: Nesneler Arası İletişim

Davranışsal kalıplar, algoritmalarla ve nesneler arası sorumluluk dağılımıyla ilgilenir. Strategy (Strateji) Kalıbı, bir algoritma ailesi tanımlamanıza, her birini kapsüllemenize ve çalışma zamanında değiştirilebilir hale getirmenize olanak tanır. Bu, nesnenin davranışının bağlama göre değişmesi gereken senaryolar için mükemmeldir; örneğin farklı sıralama algoritmaları veya ödeme işleme yöntemleri.

interface PaymentStrategy {
    pay(amount: number): void;
}

class CreditCardPayment implements PaymentStrategy {
    pay(amount: number) { console.log(`Paid $${amount} via Credit Card`); }
}

class PayPalPayment implements PaymentStrategy {
    pay(amount: number) { console.log(`Paid $${amount} via PayPal`); }
}

class ShoppingCart {
    private paymentStrategy: PaymentStrategy;

    setPaymentMethod(strategy: PaymentStrategy) {
        this.paymentStrategy = strategy;
    }

    checkout(amount: number) {
        this.paymentStrategy.pay(amount);
    }
}

Sonuç

Tasarım kalıpları bilgi göstermekle ilgili değildir; sürdürülebilir ve esnek kod yazmakla ilgilidir. Onları ustalaşmanın anahtarı, çözümün kendisine ulaşmadan önce çözdükleri sorunları tanımaktır. Kariyerinizde ilerledikçe, kalıpları sadece "kullanmadığınızı", ancak mimari kararlarınızın doğal olarak onlarla hizalandığını göreceksiniz. Basit uygulamalarla başlayın, karmaşıklık ortaya çıktığında bu yapılara doğru yeniden yapılandırma yapın ve her zaman zekâdan çok basitliği önceliklendirin.

Share: