Tabii, ama biz buna kompozisyon ve yetki diyoruz . Strateji Düzeni ve Bağımlılık Enjeksiyonu yapısal olarak benzer görünebilir, ancak amaçları farklıdır.
Strateji Kalıbı , aynı arabirim altında davranışların çalışma zamanında değiştirilmesine izin verir. Bir yeşilbaş ördeğe uçmasını ve kanatlarla uçmasını izleyebilirim. Sonra bir jet pilot ördeği için değiştirin ve Delta havayolları ile uçmasını izleyin. Program çalışırken bunu yapmak bir Strateji Kalıbı meselesidir.
Bağımlılık Enjeksiyonu , sabit kodlama bağımlılıklarından kaçınmak için bir tekniktir, böylece müşterilerin değiştiklerinde değiştirilmesini gerektirmeden bağımsız olarak değişebilirler. Müşteriler ihtiyaçlarını nasıl karşılayacaklarını bilmeden basitçe ifade ederler. Böylece nasıl karşılandıklarına başka bir yerde karar verilir (tipik olarak ana). Bu tekniği kullanmak için iki ördeğe ihtiyacınız yok. Hangi ördeği bilmeden veya umursamadan ördek kullanan bir şey. Ördek inşa etmeyen ya da aramaya gitmeyen ama elindeki ördekleri kullanmaktan çok mutlu olan bir şey.
Eğer somut bir ördek sınıfım varsa, onun sinek davranışını uygulayabilir. Hatta bir durum değişkenine dayanarak davranışları kanatlı uçmaktan Delta'ya uçmak bile isteyebilirdim. Bu değişken bir boolean, int olabilir veya bir if ile test etmek zorunda kalmadan her hangi bir uçan stili yapan FlyBehavior
bir fly
metoda sahip olabilir. Şimdi ördek türlerini değiştirmeden uçan stilleri değiştirebilirim. Şimdi havuzlar pilot olabilir. Bu kompozisyon ve delegasyon . Ördek bir FlyBehavior'dan oluşur ve uçan istekleri ona devredebilir. Tüm ördek davranışlarınızı aynı anda değiştirebilir veya her davranış veya aradaki herhangi bir kombinasyon için bir şey tutabilirsiniz.
Bu size mirasın biri dışında sahip olduğu tüm güçleri verir. Kalıtım, Duck alt türlerinde hangi Duck yöntemlerini geçersiz kıldığınızı ifade etmenizi sağlar. Kompozisyon ve temsilci seçme, Duck'ın başlangıçtan itibaren alt türlere açıkça yetki vermesini gerektirir. Bu çok daha esnektir ancak daha fazla klavye yazmayı içerir ve Duck bunun olduğunu bilmelidir.
Bununla birlikte, birçok insan mirasın en baştan açıkça tasarlanması gerektiğine inanmaktadır. Ve eğer öyle değilse, mirasa izin vermemek için sınıflarınızı mühürlü / final olarak işaretlemelisiniz. Bu görüşe bakarsanız, mirasın kompozisyon ve temsilci seçime göre hiçbir avantajı yoktur. Çünkü o zaman her iki durumda da ya başlangıçtan itibaren genişletilebilirlik için tasarım yapmanız ya da daha sonra işleri parçalamak için istekli olmanız gerekir.
Şeyleri yıkmak aslında popüler bir seçenektir. Sadece sorunun olduğu durumlar olduğunu unutmayın. Bir sonraki sürümle güncellemek istemediğiniz kitaplıkları veya kod modüllerini bağımsız olarak dağıttıysanız, şu ana kadar neler yaptığınız hakkında hiçbir şey bilmeyen sınıfların sürümleriyle uğraşabilirsiniz.
Daha sonra işleri yırtmaya istekli olmak sizi tasarımdan fazla kurtarabilirken, ördek kullanıldığında ne yapacağını bilmeden bir ördek kullanan bir şey tasarlayabilme konusunda çok güçlü bir şey var. Bilmemek güçlü şeylerdir. Bir süre ördekleri düşünmeyi bırakıp kodunuzun geri kalanını düşünmenizi sağlar.
"Yapabilir miyiz" ve "yapmalıyız" farklı sorulardır. Kompozisyon Miras Üzerine İyileştirme asla miras kullanma anlamına gelmez. Hala mirasın en mantıklı olduğu durumlar var. Size en sevdiğim örneği göstereceğim :
public class LoginFailure : System.ApplicationException {}
Devralma, yalnızca bir satırda daha belirgin, açıklayıcı adlarla istisnalar oluşturmanıza olanak tanır.
Kompozisyon ile yapmayı deneyin ve bir karmaşa elde edersiniz. Ayrıca, kalıtım yo-yo problemi riski yoktur, çünkü burada kalıtım zincirini yeniden kullanmak ve teşvik etmek için veri veya yöntem yoktur. Tüm bu ekler iyi bir isim. İyi bir ismin değerini asla küçümsemeyin.
Duckbehavior.quackBehavior
Kodunuzdaki türleri ve diğer alanları nedir?