Tasarım desenleri, yazılımda tekrar tekrar karşılaşılan problemlere verilmiş, denenmiş ve isimlendirilmiş çözümlerdir. Kod değil, birer fikir kalıbıdır. Asıl değerleri ortak bir dil sağlamalarıdır: "Burada Strategy kullanalım" demek, beş dakikalık bir açıklamanın yerini tutar.
1. Strategy
Aynı işin farklı yollarla yapılabildiği durumlarda her yolu ayrı bir sınıfa koyar ve çalışma anında seçmeyi sağlar.
Örnek: Kargo ücretinin firmaya göre hesaplanması, farklı indirim kuralları, farklı ödeme sağlayıcıları.
public interface IIndirimKurali { decimal Uygula(decimal tutar); }
public class SadakatIndirimi : IIndirimKurali { public decimal Uygula(decimal t) => t * 0.95m; }
public class KampanyaIndirimi : IIndirimKurali { public decimal Uygula(decimal t) => t - 50; }
Uzun if-else veya switch zincirlerinin en yaygın ilacıdır.
2. Factory
Nesne oluşturma mantığını tek bir yerde toplar. Hangi sınıfın üretileceği bir parametreye bağlıysa (ör. "pdf", "excel"), bu karar kodun her yerine dağılmaz.
3. Repository
Veri erişimini iş mantığından ayırır. İş kodu "müşteriyi getir" der; verinin SQL Server'dan mı, bir API'den mi geldiğini bilmez. Entity Framework Core zaten bu deseni kısmen uygular; üstüne gereksiz bir katman eklemeden önce ihtiyacı tartmak gerekir.
4. Decorator
Bir nesneye, kodunu değiştirmeden yeni davranış ekler. Örnek: Bir servis çağrısının etrafına önbellek, loglama veya tekrar deneme eklemek.
5. Observer (Yayıncı-Abone)
Bir olay gerçekleştiğinde ilgilenen tüm tarafların haberdar edilmesini sağlar. Sipariş onaylandığında stok düşülmesi, e-posta gönderilmesi ve fatura kesilmesi bağımsız abonelerle yapılabilir. Sistemler arası ölçekte bu fikir mesaj kuyrukları ve webhook'lar ile hayata geçer.
6. Adapter
Uyumsuz iki arayüzü birbirine bağlar. Her kargo veya e-fatura firmasının farklı bir API'si varsa, hepsini ortak bir IKargoFirmasi arayüzüne uyarlayan adaptörler yazılır.
7. Singleton
Bir sınıftan uygulama boyunca tek bir örnek olmasını garanti eder. Klasik uygulaması test etmeyi zorlaştırdığı için modern .NET'te bunun yerine dependency injection ile "singleton ömürlü" servis kaydı tercih edilir.
8. Builder
Çok parametreli ve adım adım oluşturulan nesneler için okunabilir bir kurulum sağlar. Rapor, e-posta veya sorgu oluştururken sık kullanılır.
Desenler ne zaman zarar verir?
- Problem yokken desen uygulamak (desen için desen)
- Basit bir
ifyerine beş sınıflık yapı kurmak - Ekipte kimsenin bilmediği desenleri kullanmak
Kural basit: önce problemi hissedin, sonra deseni uygulayın. Bu yaklaşım KISS ve YAGNI ilkeleriyle de uyumludur.
Sık sorulan sorular
Tüm desenleri ezberlemem gerekir mi?
Hayır. Strategy, Factory, Adapter, Decorator ve Observer'ı iyi anlamak, günlük işlerin büyük kısmında yeterlidir.
Desenler hangi dillerde geçerli?
Fikirler dilden bağımsızdır; ancak bazı desenler modern dil özellikleriyle çok daha kısa yazılabilir veya gereksiz hale gelir.
Sonuç
Tasarım desenleri, deneyimli geliştiricilerin ortak hafızasıdır. Doğru problemde kullanıldıklarında kodu esnek ve anlaşılır kılarlar; problemsiz yerde ise yalnızca karmaşıklık eklerler.