Strategy Deseni
- İngilizcesi
- Strategy Pattern
- Türkçe karşılığı
- strateji deseni
- Okunuşu
- stretıci petırn
Günlük kullanımda çoğunlukla İngilizcesi tercih edilir.
Kısaca
Strategy deseni, değiştirilebilir algoritmaları tek arayüzün arkasına koyup çalışma zamanında aralarında geçiş yapılmasını sağlayan davranışsal bir desendir.
Strategy deseni nedir?
Strategy deseni, kargo hesaplamak, sonuçları sıralamak ya da dosyaları sıkıştırmak gibi aynı işi farklı yollarla yapan bir algoritma ailesini alır ve her birini ortak bir arayüzün arkasına koyar. Bunları kullanan kod, yani context, bir strateji referansı tutar ve hangisi olduğunu bilmeden onu çağırır. Davranışı değiştirmek artık context'i düzenlemek değil, farklı bir strateji geçirmek demektir.
Desen olmadan bu mantık çoğunlukla yeni bir seçenek çıktığında her seferinde düzenlenmesi gereken uzun bir if/else ya da switch bloğuna dönüşür. Stratejilerle her seçenek kendi sınıfında ya da fonksiyonunda yaşar, tek başına test edilebilir ve yenileri mevcut koda dokunmadan eklenebilir; bu, SOLID'deki açık-kapalı ilkesine uyar. Birinci sınıf fonksiyonları olan dillerde strateji çoğunlukla, bir sıralama metoduna verdiğiniz karşılaştırma fonksiyonu gibi, argüman olarak geçirilen bir fonksiyondan ibarettir.
Bir navigasyon uygulaması iyi bir benzetmedir: araba, bisiklet ya da yürüyüş seçersiniz ve uygulama her mod için farklı bir algoritma kullanarak aynı hedefe rota hesaplar. Gerçek dünya kullanımları arasında fiyatlandırma ve indirim kuralları, ödeme yöntemleri, kimlik doğrulama yöntemleri, yeniden deneme politikaları, doğrulama kuralları ve bir sıkıştırma ya da serileştirme biçimi seçmek bulunur.
Strateji deseni, ikisi de bir arayüzün arkasındaki nesneleri değiştirdiği için sıklıkla state deseniyle karıştırılır. Strateji deseninde algoritmayı istemci dışarıdan seçer; state deseninde ise nesne, bir siparişin beklemede durumundan gönderildi durumuna geçmesi gibi, iç durumu değiştikçe kendi davranışını değiştirir. Ayrıca factory deseniyle doğal olarak eşleşir: factory yapılandırmadan doğru stratejiyi seçebilir ve işi ardından strateji yapar.
Önemli noktalar
- Strategy deseni, birbirinin yerine kullanılabilen algoritmaları ortak bir arayüzün arkasına koyar.
- Context, hangi somut stratejiye sahip olduğunu bilmeden onu kullanır.
- Uzun koşullu blokların yerini alır ve yeni seçenekleri eklemeyi kolaylaştırır.
- Birçok dilde bir strateji, argüman olarak geçirilen basit bir fonksiyon olabilir.
- Stratejilerde çağıran seçer; state deseninde nesne davranışını kendisi değiştirir.
Örnek
// Each strategy calculates shipping in a different way
type ShippingStrategy = (weightKg: number) => number;
const standard: ShippingStrategy = (kg) => 5 + kg * 0.5;
const express: ShippingStrategy = (kg) => 15 + kg * 1.2;
const storePickup: ShippingStrategy = () => 0;
// The context doesn't care which strategy it receives
function shippingCost(weightKg: number, strategy: ShippingStrategy) {
return strategy(weightKg);
}
console.log(shippingCost(4, standard)); // 7
console.log(shippingCost(4, express)); // 19.8
console.log(shippingCost(4, storePickup)); // 0Sık sorulan sorular
Strategy ile state desenleri arasındaki fark nedir?
İkisi de davranışı birbirinin yerine geçebilen nesnelere devreder. Strategy deseninde algoritmayı çağıran seçer; state deseninde ise nesne olaylar gerçekleştikçe kendi başına durumlar arasında geçiş yapar ve her durum farklı bir davranış tanımlar.
Bir callback fonksiyonu geçirmek strategy deseni midir?
Esasen evet. Bir sıralama metoduna karşılaştırma fonksiyonu ya da ödeme koduna fiyatlandırma fonksiyonu geçirdiğinizde o fonksiyon bir stratejidir; birinci sınıf fonksiyonları olan diller yalnızca her biri için ayrı bir sınıfa ihtiyaç duymaz.
Strategy deseni ne zaman kullanılmalı?
Aynı görevi yapmanın birkaç yolu olduğunda ve aralarında çalışma zamanında seçim yapmanız gerektiğinde ya da bir koşullu blok yeni durumlarla büyümeye devam ettiğinde kullanın. Yalnızca iki kararlı seçenek varsa basit bir if ifadesi daha anlaşılır olabilir.
İlgili sayfalar
- Tasarım DeseniYazılım Mimarisi, s. 42Tasarım deseni, yazılım tasarımında sık görülen bir soruna kanıtlanmış, yeniden kullanılabilir çözümdür; hazır kod değil, genel bir şablon olarak anlatılır.
- Çok biçimlilikProgramlamanın Temelleri, s. 8Çok biçimlilik, kodun farklı türlerdeki değerlerle ortak bir arayüz üzerinden çalışabilmesidir; her tür kendi davranışını sağlar.
- InterfaceProgramlamanın Temelleri, s. 26Interface, bir türün sağlamayı vaat ettiği metot ve özellik imzalarından oluşan adlandırılmış bir kümedir; bu üyelerin nasıl gerçekleştirildiğini söylemez.
- Yüksek dereceli fonksiyonProgramlamanın Temelleri, s. 56Yüksek dereceli fonksiyon, başka bir fonksiyonu argüman olarak alan, fonksiyon döndüren ya da ikisini de yapan fonksiyondur; davranış veri gibi taşınabilir.
- Factory DeseniYazılım Mimarisi, s. 15Factory deseni, nesne oluşturmayı özel bir fonksiyona ya da sınıfa taşıyan ve çağıranların somut sınıfı hiç adlandırmadığı oluşturucu bir tasarım desenidir.
- SOLIDYazılım Mimarisi, s. 39SOLID, geliştiricilerin daha anlaşılır, genişletilebilir, test edilebilir ve bakımı kolay kod yazmasına yardım eden beş nesne yönelimli tasarım ilkesidir.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin