Farkında olduğum tek meşru bağımlılık enjeksiyon anti-paterni Servis Bulucu DI çerçevesi kullanıldığında bir anti-patern olan paternidir.
Burada veya başka yerlerde duyduğum diğer sözde DI anti-paternleri, genel OO / yazılım tasarımı anti-paternlerinin biraz daha spesifik durumlarıdır. Örneğin:
Yapıcı aşırı enjeksiyonu, Tek Sorumluluk İlkesinin ihlalidir . Çok fazla yapıcı argümanı çok fazla bağımlılığı gösterir; çok fazla bağımlılık sınıfın çok fazla şey yapmaya çalıştığını gösterir. Genellikle bu hata, alışılmadık derecede uzun veya belirsiz ("yönetici") sınıf adları gibi diğer kod kokularıyla ilişkilidir. Statik analiz araçları aşırı afferent / efferent kuplajını kolayca tespit edebilir.
Davranışın aksine, veri enjeksiyonu, poltergeist anti-paternin bir alt tipidir ve bu durumda 'geist kaptır. Bir sınıfın geçerli tarih ve saatin farkında olması gerekiyorsa DateTime
, veri olan a enjekte etmezsiniz ; bunun yerine, sistem saati üzerine bir soyutlama enjekte edersiniz ( SystemWrappers projesinde ISystemClock
daha genel bir tane olduğunu düşünmeme rağmen genellikle benimkini çağırırım ). Bu sadece DI için doğru değildir; test edilebilirlik için kesinlikle gereklidir, böylece zamanla değişen işlevleri gerçekten beklemenize gerek kalmadan test edebilirsiniz.
Her yaşam döngüsünü Singleton olarak ilan etmek bana göre kargo kült programlamanın mükemmel bir örneğidir ve daha az derecede konuşma dilinde " nesne cesspool " dur . Hatırladığımdan daha fazla tekil istismar gördüm ve çok azı DI'yi içeriyor.
Başka bir yaygın hata, IOracleRepository
yalnızca kapsayıcıya kaydedebilmek için yapılan uygulamaya özgü arabirim türleridir (garip adlarla ). Bu tek başına Bağımlılık Tersine Çevirme İlkesinin ihlalidir (sadece bir arayüz olduğu için gerçekten soyut olduğu anlamına gelmez) ve genellikle Arayüz Ayrışma İlkesini ihlal eden arayüz şişkinliğini de içerir .
Genellikle gördüğüm son hata , NerdDinner'da yaptıkları "isteğe bağlı bağımlılık" tır . Başka bir deyişle, bağımlılık enjeksiyonunu kabul eden bir kurucu, ama aynı zamanda "varsayılan" bir uygulama kullanan başka bir kurucu vardır. Bu aynı zamanda DIP'yi ihlal eder ve LSP ihlallerine yol açma eğilimindedir , çünkü geliştiriciler zamanla varsayılan uygulama etrafında varsayımlar yapmaya başlar ve / veya varsayılan kurucuyu kullanarak yeni sürüm örnekleri başlatır.
Eski deyişle FORTRAN'ı herhangi bir dilde yazabilirsiniz . Bağımlılık Enjeksiyon onların bağımlılık yönetimini vidalama gelen geliştiriciler engelleyecek bir gümüş kurşun değil, ama does genel hatalar / anti-desenler bir dizi önlemek:
...ve bunun gibi.
Açıkçası , Unity veya AutoFac gibi belirli bir IoC kap uygulamasına bağlı olacak bir çerçeve tasarlamak istemezsiniz. Bu bir kez daha DIP'yi ihlal ediyor. Ancak kendinizi böyle bir şey yapmayı düşünürken bile bulursanız, o zaman zaten birkaç tasarım hatası yapmış olmalısınız, çünkü Bağımlılık Enjeksiyonu genel amaçlı bir bağımlılık yönetimi tekniğidir ve bir IoC konteyneri kavramına bağlı değildir .
Her şey bir bağımlılık ağacı oluşturabilir; belki bir IoC konteyneri, belki bir sürü alayla yapılan bir birim test, belki de kukla veri sağlayan bir test sürücüsüdür. Çerçeveniz umursamamalı ve gördüğüm çoğu çerçeve umursamıyor, ancak yine de son kullanıcının IoC kapsayıcısına kolayca entegre edilebilmesi için bağımlılık enjeksiyonunu ağır kullanıyorlar.
DI roket bilimi değildir. Dış bağımlılıkları olmayan bir yardımcı program yöntemi veya çerçeve dışında herhangi bir amacı bulunamayan bir yardımcı program sınıfı gibi bunları kullanmak için zorlayıcı bir neden olmadığından new
ve kaçınmaya çalışın static
(birlikte çalışma sarmalayıcıları ve sözlük anahtarları, bu).
IoC çerçevelerindeki sorunların birçoğu, geliştiriciler bunları nasıl kullanacaklarını ilk kez öğrendiklerinde ortaya çıkıyor ve aslında IoC modeline uymak için bağımlılıkları ve soyutlamaları ele alma şeklini değiştirmek yerine, IoC kapsayıcılarını beklentilerini karşılamak için manipüle etmeye çalışıyorlar. genellikle yüksek kuplaj ve düşük kohezyon içeren eski kodlama tarzı. Kötü kod, DI tekniklerini kullansın ya da kullanmasın, kötü koddur.