Bir kere, büyük if/else
blok kümeleri kolayca test edilemez . Her yeni "dal" başka bir yürütme yolu ekler ve böylece siklomatik karmaşıklığı arttırır . Kodunuzu iyice test etmek isterseniz, tüm yürütme yollarını kapsamalısınız ve her koşul en az bir test daha yazmanızı gerektirir (küçük, odaklanmış testler yazdığınız varsayılarak). Öte yandan, stratejileri uygulayan sınıflar genellikle sadece 1 kamusal yöntemi ortaya koyar ve bu da test edilmesi kolaydır.
Bu nedenle, iç içe if/else
yerleştirme ile kodunuzun tek bir kısmı için birçok test alırsınız; Strateji ile birden çok daha basit stratejinin her biri için birkaç testiniz olur. İkincisi ile, daha iyi kapsama alanına sahip olmak kolaydır, çünkü yürütme yollarını kaçırmak daha zordur.
Genişletilebilirliğe gelince , kullanıcıların kendi davranışlarını enjekte edebilecekleri bir çerçeve yazdığınızı düşünün. Örneğin, bir çeşit vergi hesaplama çerçevesi oluşturmak ve farklı ülkelerin vergi sistemlerini desteklemek istiyorsunuz. Hepsini uygulamak yerine, çerçeve kullanıcılarına bazı belirli vergilerin nasıl hesaplanacağına dair bir uygulama sağlama şansı vermek istiyorsunuz.
İşte strateji modeli:
- Örneğin
TaxCalculation
, bir arayüz tanımlarsınız ve çerçeveniz vergileri hesaplamak için bu türden örnekleri kabul eder
- Çerçevenin bir kullanıcısı, bu arabirimi uygulayan ve onu çerçevenize geçiren bir sınıf oluşturur, böylece hesaplamaların bir kısmını gerçekleştirmek için bir yol sağlar
Aynı şeyi yapamazsınız if/else
, çünkü bu çerçevenin kodunu değiştirmeyi gerektirir, bu durumda artık bir çerçeve olmaz. Çerçeveler genellikle derlenmiş biçimde dağıtıldığından, bu tek seçenek olabilir.
Yine de, sadece düzenli bir kod yazsanız bile, Strateji faydalıdır çünkü niyetlerinizi daha açık hale getirir. "Bu mantık takılabilir ve koşullu" diyor, yani kullanıcı eylemlerine, yapılandırmaya ve hatta platforma bağlı olarak değişebilen birden fazla uygulama olabilir.
Strateji modelinin kullanılması okunabilirliği artırabilir , çünkü belirli bir stratejiyi uygulayan bir sınıf tipik olarak açıklayıcı bir ada sahip olmalıdır, örneğin USAIncomeTaxCalculator
, if/else
bloklar "isimsiz" dir, en iyi durumda sadece yorumlanır ve yorumlar yalan söyler. Ayrıca, fr benim kişisel zevk, sadece if/else
üst üste 3 blok olması okunabilir değildir ve iç içe bloklar ile oldukça kötü olur.
Açık / kapalı prensibi yukarıdaki örnekte açıklandığı gibi, Strateji siz "değişiklik için kapalı" (bu parçaların yeniden yapılandırmaya ihtiyaç olmadan kod ( "uzantısı için açık") bazı kesimlerinde bir mantık uzatmak için izin verir, çünkü aynı zamanda çok alakalı ).