Bağımlılık enjeksiyonu nasıl sadece karmaşıklığı ayrı bir sınıfa taşımakla kalmaz?


9

Bu hafta bağımlılık enjeksiyonu için Typhoon çerçevesini kullanmayı düşünüyorum. Birim sınaması sırasında nesnelerin yapımını ayırmanın keyfi bileşenleri taklitlerle değiştirmek için yararlı olduğunu anladım ve şimdiye kadar bunun tek başına faydalarını gördüm.

Ancak, onlarca başlık ithalatı olan mizahi bir görünüm denetleyicisi sınıfına sahip olmadan önce, onlarca başlık ithalatı olan mizahi bir fabrika sınıfım olduğunu düşünemiyorum. Büyük bir fabrika sınıfından kaçınmam gerekir mi?


6
On yıl içinde DI'nin Singleton'dan dayak listesini devralmasını bekliyorum, ama bu sefer iyi nedenlerle. Bazı iyi kullanımları var, ancak etkisini değerlendirirken çok dikkatli olmanızı öneririm.
Balog Pal

5
Bağımlılık enjeksiyonunun karmaşıklığı azaltmanın bir yolu olduğunu değil, açık bağımlılıklar lehine örtük bağımlılıklardan (global sembollerin / serbest değişkenlerin kullanımı) kaçınmanın bir yolu olduğunu düşünmüyorum (açık parametreler / bağlı değişkenler kullanın). Dolayısıyla, karmaşıklık hala oradadır, ancak yöntem / yapıcı imzalarınızda açık hale getirdiğiniz için bununla uğraşmak zorundasınız.
Giorgio

7
Kod düzenlemek için hemen hemen her sistemin "karmaşıklığı başka bir yere taşımak" olarak tanımlanabileceğini unutmayın. Bu, karmaşıklığı en mantıklı ve yararlı bir şekilde organize etmek kadar ortadan kaldırmakla ilgili değildir.

1
50 başlık içe aktarmanız gerekiyorsa, bunu bir yerde yapmanız gerekir. DI, kodunuzu daha kolay birim test etmenize yardımcı olur.
BЈовић

2
Peki, şimdi kontrolörünüzün kontrol etmeye ve başlık ithalat fabrikanızın başlık ithalatına odaklandığını mı söylüyorsunuz? Bir DI çerçevesi kullanıyor olsanız da olmasanız da, bu nasıl kötü bir şey olabilir?
pdr

Yanıtlar:


16

Bağımlılık Enjeksiyonu, bir nesnenin başka bir bağımlı nesne hakkında nasıl bildiğini tanımlamaya yardımcı olur. Sistemin genel karmaşıklığını azaltmanıza yardımcı olmayacaktır. DI'den önce onlarca ithalata ihtiyacınız varsa, ondan sonra onlarca ithalata ihtiyacınız olacak. Aradaki fark, bu ithalatın daha anlamlı (fabrika, inşaatçı vb.) Bir yerde (sınıfta) olmasıdır.

Bağımlılıkların bir kurucu veya yöntemle sağlanmasına izin vererek, sınıfınıza farklı, ama yine de geçerli, bağımlı bir nesne sağlama ve endişeleri ortadan kaldırarak söz konusu sınıfın uyumunu artırma esnekliğine izin verirsiniz.

Benzer olan ve sıklıkla birlikte kullanılan birkaç ilke vardır: Bağımlılık Enjeksiyonu (DI), Kontrolün İnversiyonu (IoC) ve Bağımlılık İnversiyon Prensibi (DIP)

Bu makaleden http://martinfowler.com/articles/dipInTheWild.html

DI kablolama hakkında, IoC yön hakkında ve DIP şekil hakkında


2
+1, son fiyat teklifi için. İnsanların sıklıkla yanlış anladıkları bu 3 kavramın en iyi açıklamasıdır.
haylem

Yukarıdaki bağlantılı makale gerçekten olağanüstü. Yeterince derin ve çok açık bir açıklama.
DemetriKots

10

Bağımlılık enjeksiyonu karmaşıklığı azaltmaz, ancak endişelerin ayrılması ve azaltılmış kuplaj ile eşlenebilirliği arttırır.

Ancak, onlarca başlık ithalatı olan mizahi bir görünüm denetleyicisi sınıfına sahip olmadan önce, onlarca başlık ithalatı olan mizahi bir fabrika sınıfım olduğunu düşünemiyorum. Büyük bir fabrika sınıfından kaçınmam gerekir mi?

"Humongo" derslerden kaçınmalısın, nokta. Diyelim ki görünüm denetleyicisini daha küçük, daha sürdürülebilir sınıflara ayırdınız. Şimdi hepsi bağımlılıklarını korumakla yükümlüdür. DI, bu bağımlılık yönetimini tüm bu sınıflardan yalnızca bağımlılık yönetiminden sorumlu bir fabrika / yapılandırma sınıfına taşımanıza yardımcı olur - bkz. Tek Sorumluluk İlkesi. Ve orijinal görünüm denetleyicisinden kesinlikle çok daha az "mizahi" olsa da, çok büyük olursa, uygulamanın farklı bölümlerinden sorumlu olan daha küçük bağımlılık yönetimi sınıflarına bölme seçeneğiniz vardır.


2

Layman'ın sözleriyle:

Bağımlılık enjeksiyonu karmaşıklığı daha az zarar verdiği yere taşır.

@Gnat için DÜZENLEME: DI sadece karmaşıklığı ayrı bir sınıfa taşımakla kalmaz, daha az zarara neden olduğu yere taşır.


bu sorulan soruya nasıl cevap veriyor?
gnat

@gnat bir düzenleme ekledi, cevabım bana göre DI'nin karmaşıklığı nasıl ayrı bir sınıfa taşımadığını açıklıyor.
Tulains Córdova
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.