Bağımlılık enjeksiyonu kuplajı nasıl arttırır?


32

Bağımlılık enjeksiyonunun Wikipedia sayfasında , dezavantajlar bölümü bize şunu söylüyor:

Bağımlılık enjeksiyonu, bir alt sistemin kullanıcısının bu alt sistemin ihtiyaçlarını karşılamasını zorunlu kılarak bağlantıyı arttırır.

bağımlılık enjeksiyonuna karşı bir makaleye bağlantı ile .

Bağımlılık enjeksiyonu, sınıfın somut uygulama yerine arayüzü kullanmasını sağlar. Bu, kuplajın azalmasına neden olmalı , değil mi?

Neyi kaçırıyorum? Bağımlılık enjeksiyonu sınıflar arasında eşleşmeyi nasıl artırıyor?


2
Bu dezavantajların listesini kimin yazdığından emin değilim, ama bir tuz tuzu ile alırdım. Örneğin, bir ton yedek kurulum kodunu ortadan kaldırarak DI'nin bir kod tabanının boyutunu 2/3 oranında azalttığını gördüm.
Rob

@RobY Çoğunlukla bağımlılığı enjekte etmek için fabrika kullandım ve deneyimlerim kod boyutunu arttırması, ancak testi basitleştirmesi.
BЈовић

Registry veya Context Passing;) gibi bir alternatif kullanmayı deneyin. Temel olarak, şimdi ve 15 yıl önce arasındaki farktan bahsediyorum.
Rob

İlgili: stackoverflow.com/a/9503612/264697 . Mark Seemann'ın cevabı, Bağımlılık Enjeksiyonu kullanılarak genel kuplajın nasıl azaltıldığını açıklar.
Steven

Yanıtlar:


42

Peki neyi özlüyorum?

Bağımlılık Enjeksiyonu, bir sınıfla bağımlılığı arasındaki eşleşmeyi azaltır. Ancak, bir sınıfla tüketicisi arasındaki bağlantıyı arttırır (çünkü tüketicinin onu oluşturmak için daha fazla bilgiye ihtiyacı vardır) ve bağımlılık ile tüketicisi (tüketicinin kullanım bağımlılığını bilmesi gerektiğinden).

Çok sık, bu iyi bir işlemdir. Sınıf, bir arayüzün ötesindeki bağımlılıkları hakkındaki detayları bilmemeli ve belirli kod parçalarını bir araya getirmek uygulamanın sorumluluğunda olmalıdır .


Doğru, kuplaj bir şekilde azalır ve bir başkası artar.
Paul Draper

Ancak tüketici onu yaratmaz; önemli olan nokta budur.
Casey,

@emodendroket - Eh? Kontrolün Tersine çevrilmesi tüketicinin onu yaratmamasını sağlar. Bağımlılık Enjeksiyonu buna diktir.
Telastyn

Genelde terimler birbirinin yerine kullanıldığından, bilmediğim bir ayrım yapıyorsunuz.
Casey,

22

SBir veritabanı bağlantısına bağlı bir alt sisteminiz olduğunu varsayalım D. Bağımlılık enjeksiyonu olmadan Sve arasında nispeten sıkı bir bağlantı vardır D, çünkü Shem nasıl kullanılacağını hem de nasıl Dyaratacağını bilmeye ihtiyaç duyar . Sistemin geri kalanı ise arasındaki bu bağımlılık blissfully habersiz olabilir Sve D.

Bağımlılık enjeksiyon ile arasındaki bağlantı Sve Dsen kaldırmak, çünkü gevşek olur Sbir nasıl oluşturulacağını bilgi D. SSadece nasıl kullanılacağını bilmek gerekiyor. Artan genel kaplin , sistemin diğer bölümlerinin şimdi Dnasıl bir tane yaratılacağı hakkında ve muhtemelen nasıl bir şeyler yapması gerektiğinden kaynaklanmaktadır . Kuplajdaki bu artışın derecesi, bağımlılığın nasıl Denjekte edildiğine bağlıdır S:

  • İle yapıcı enjeksiyon yaratıcısı Sihtiyaçlarına bir bağımlılık Dve muhtemelen bilgi nasıl yaratılacağı.
  • İle yöntem düzeyinde enjeksiyon , bir yöntemin her arayan Siçinden bir Denjekte alır ihtiyaçlarına bir bağımlılık Dve muhtemelen bilgilerinden oluşturmak için.

Her iki durumda da, bağlı olan sınıfların Dsayısı ve nasıl bir hareket yaratacağı bilgisinin Dsistemde bir yerde bulunması gerekir. Bu, genel olarak birleşme artışı yaratır.


Tamam, yapıcı ve belirleyici enjeksiyon için anlamlıdır. Ancak eğer fabrika veya strateji modeli kullanılıyorsa, yaratım oraya taşınır ve sınıf sadece enjekte edilen nesneyi kullanır. Yoksa bu bir bağımlılık enjeksiyonu değil midir (yalnızca kontrolün ters çevrilmesi)?
BЈовић

Fabrika enjeksiyonunda bile, yaratıcının Sbir fabrika tedarik etmesi gerekir D, bu da bunun (veya en azından bunun bir arayüzünü) Skullandığını bilmesi gerektiği anlamına gelir D.
Idan Arye,

7

Eşleşmeyi arttırdığı konusunda kesinlikle aynı fikirde değilim.

Bağımlılık enjeksiyonu olmadan, bir alt sistem ile bağımlılığın somut uygulanması arasında sıkı bir bağlantıya sahipsiniz.

Bağımlılık enjeksiyonuyla, alt sistemi bağımlılığın uygulanmasından ayırdınız.

Tüketici ile bu alt sistem arasındaki eşleşmeyi arttırdığı argümanı yapmak, tüketicinin şimdi alt sistem tarafından istenen bağımlılıkla sıkı bir şekilde bağlantılı olduğu anlamına geldiği için ÇOK şüphelidir. Tek yapmanız gereken, tüketicinizi bağımlılığa bağlayan sıkıca bağlı kodlar yazmanızdır. İdeal olarak TÜM kodunuz çözülür.

Yapıcı Enjeksiyon:

Bağımlılık çözünürlüğü, bağımlılık enjeksiyon kabı veya fabrika tarafından gerçekleştirilir. Tüketici, alt sistemin somut bir uygulamasını, bağımlılık enjeksiyon kabından veya bir fabrikadan alabilir.

Tüketici, alt sistemin yapıcısının neye benzediğini bilmek zorunda değildir. Alt sistem bağımlılığına bir bağlantı yoktur.

Yöntem Enjeksiyonu:

Yapıcı enjeksiyonuyla aynıdır, ancak şimdi tüketicinin konteynır veya fabrikadan bağımlılığın somut bir örneğini alması (veya hatta metodu / kurucu enjekte etmesini) ve metoda enjekte etmesi gerekir. Yine tüketici, bağımlılığın somut bir uygulamasına bağlanmaz.

TL; DR Bir alt sistemde bağımlılık enjeksiyonu için en kötü durum, kuplajın tüketici koduna kaydırılmasıdır. ÇARPIŞMADA GENEL BİR ARTIŞ DEĞİLDİR.

En iyi durum, tüm sistemlerin artık gevşek bir şekilde bağlı olmasıdır ve bağımlılık enjeksiyonunun, bağımlılık enjeksiyon kapları veya fabrikaları aracılığıyla kontrol edilmesidir.

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.