Bağımlılık enjeksiyonunun tersini göstermek için teknik terim?


12

Bu sadece teknik bir sorudan ziyade bir isimlendirmedir (teknik yazı). Uygulamamızda bağımlılık enjeksiyonunu genişletmeye odaklanmış bir yeniden düzenleme teklifi yazmaya çalışıyorum (ve kendime atandım). Bu tür kullanımın yapmak ederken Bahar fasulye Autowiring için, örneğini fasulye kullanarak o örneklerini hala var MyClass obj = new MyClass(...)tamamen enjekte edilebilir. Teklifimin zarif terminolojiyi kullanmasını ve DI'nin karşısında yer alan tasarım modelini uygun bir terimle belirtmek istiyorum.

"Sıkı bağlantı", DI'ye zıt anlamlı bir terim mi?


1
Evet, birleştirme hem diğer sınıflarda açık sınıf adları kullanma eylemini hem de sonuçta bir kod tabanının durumunu tanımlar.
Kilian Foth

11
Hayır, sıkı bağlantı DI'nin tersini değil, sadece elde edilen kodun özelliğini tanımlar. DI'yi kullanabilir ve tamamen farklı nedenlerle sıkı bağlantıya sahip olabilirsiniz.
Doc Brown


@EricKing gösteriş yapıyor. Bu arada +1.
candied_orange

1
"Bağımlılık emme" .
SeldomNeedy

Yanıtlar:


30

Hayır. Sıkı bağlantı, bağımlılık enjeksiyonunun uğraştığından çok daha fazlasıdır.

Bağımlılık enjeksiyonu uygulama kararını dışsallaştırır. Bu, ayrıştırmak için uzun bir yol kat eder, ancak bağlantı bundan daha fazlasıdır.

Bağımlılık enjeksiyonu için iyi bir zıtlık, bağımlılığı zor kodlamaktır . Bir davranış nesnesinin içine inşa ettiğinizde (yeni veya doğrudan bazı fabrikaları kullanın), iki farklı kaygıyı bir araya getirdiniz. Bir servis bulucu ayrıştırmaya yardımcı olur ancak sizi servis bulucuya bağlar.

Kuplaj, yapı ve davranışı birbirinden ayırmaktan daha fazlasıdır. A sınıfından B sınıfına kadar belirli bir sırayla çağrılması gereken 101 yöntemim varsa, sıkı sıkıya bağlıyım. İnşa ve davranışın ne kadar harika ayrıldığı önemli değil.

Birleştirme, iki nesnenin birbirine bağımlılığının bir ölçüsüdür. Birini diğerini etkilemeden değişiklik yapmayı zorlaştıran her şey, birleşmeye katkıda bulunur. Bağımlılık enjeksiyonu buna yardımcı olur, ancak hepsi bu değildir.


Evet, zor kodlama (bağımlılık), (çalışma zamanında) enjekte etmenin aksine, tam olarak önereceğim şey de benden biraz daha hızlıydı.
Doc Brown

7
@DocBrown Bazen burası hızlı olmaya çok fazla önem vermemiş olsaydı. Nasıl koyacağınızı duymak isterim.
candied_orange

İyi cevap - bağımlılık enjeksiyonu ayrıştırma anlamına gelmez. Başka türlü inanmak kötü bir yolda ilerliyor
Ant P

1
@CandiedOrange Belki birisi meta olarak cevapların bir süre gizli kalmasını önermelidir. Ve / veya bu oylar Nsaatlerce kamuoyundan gizlenecektir ... Veya bir cevap seçilene kadar. Biliyorum ben tek bir cevap zaten 10 oya sahip ve diğer 5 cevaplar hiç yokken tamamen objektif değil!
svidgen

1
@svidgen metada "batıda en hızlı silah" araması yaptı. Sorunun zaten uzun bir geçmişi var.
candied_orange

6

Açıkçası, Bağımlılık Enjeksiyon sadece gerçekten karşı çıkan DEĞİL Bağımlılık enjeksiyon ve bu nedenle herhangi bir bağımlılık yönetim stratejisi - değil Bağımlılık Enjeksiyon.

[İstenmeyen] bağlantı, tam olarak dik bir sorun olmasa da, her iki şekilde de meydana gelebilir veya hafifletilebilir. Bunların ikisi de DependencyClass:

public DependencyInjectedConstructor(DependencyClass dep) {
  dep.do();
}

public DependencyLookupConstructor() {
  var dep = new DependencyClass();
  dep.do();
}

DependencyLookupConstructorDependencyClassbu durumda belirli bir gruba bağlanır . Ama ikisi de bağlandı DependencyClass. Gerçek kötülük, eğer burada bir tane varsa, mutlaka kaplin değildir, aniden kendi bağımlılıklarına enjekte edilmesi DependencyLookupConstructorgerekiyorsa değişmesi DependencyClassgerekir 1 .

Bununla birlikte, bu yapıcı / sınıf daha da gevşek bir şekilde birleştirilmiştir:

public DependencyLocatingConstructor() {
  var dep = ServiceLocator.GetMyDoer();
  dep.do();
}

Eğer C # çalışıyorsanız, yukarıdaki izin verecektir ServiceLocatordönmek için herhangi bir şey olduğunda GetMyDoer()sahip olduğu sürece can, çağrıldığında do()Ne DependencyLocatingConstructoro vardır do(). Tam bir arabirime 2 bağlı olmadan derleme zamanı imza doğrulamasından faydalanırsınız .

Yani, zehirini seç.

Ancak temel olarak, Bağımlılık Enjeksiyonunun somut bir "zıttı" varsa, "Bağımlılık Yönetimi Stratejileri" alanında başka bir şey olurdu. Diğerlerinin yanı sıra, konuşmada aşağıdakilerden herhangi birini kullandıysanız, bunu Bağımlılık Enjeksiyonu DEĞİL olarak kabul ediyorum :

  • Servis Konum Belirleyici Deseni
  • Bağımlılık Bulucu / Konum
  • Doğrudan nesne / bağımlılık yapısı
  • Gizli bağımlılık
  • "Bağımlılık Enjeksiyonu Değil"

1. İronik olarak, DI'nin daha yüksek seviyelerde çözdüğü bazı problemler, DI'nin daha düşük seviyelerde kullanılmasının bir sonucudur. Gereksiz karmaşıklığı ile codebases çalışan keyfini yaşadım baştan olarak bu karmaşıklığı aslında yardımcı yerlerin avuç ağırlayabilecek bir sonucu ... Ben kuşkusuz kötü maruz bırakılarak önyargılı değilim.

2. Servis konumunun kullanılması, aynı zamanda, bağımlı kodun nasıl oluşturulduğu konusunda büyük ölçüde agnostik olmasına rağmen , aynı türden farklı bağımlılıkları çağrı kodundan işlevsel rolleri ile kolayca belirlemenizi sağlar . Diyelim ki çözmeniz gereken Userya da IUserfarklı amaçlar için: Örneğin, Locator.GetAdministrator()karşı Locator.GetAuthor()- ya da her neyse. Kodum, hangi arayüzleri desteklediğini bile bilmeden işlevsel olarak neye ihtiyaç duyduğunu sorabilir .


2
Kurtuluş DependencyInjectedConstructor(DependencyClass dep), DependencyClass'ın bir arayüz veya soyut sınıf olabileceğidir. Bu yüzden C # kodlayıcılarının olduğu gibi bir arabirim öneki kullanması beni üzüyor IDependency. Müşteri olarak, bu Bağımlılık şeyin ne olduğu benim işim değil. İnşa etmediğim sürece, bilmem gereken tek şey onunla nasıl konuşacağım. Ne olduğu başkasının sorunu.
candied_orange

Nokta bu arabirime DI hala çiftler, sen olmaktan ve bu değil gerektiren bu DependencyClasshiç de soyut bir arayüz olacak. Bu sadece inşaat / yapılandırma / yer mantığı mevcut gerektirir "Başka bir yerde." ... Peki, ve daha ilgili soru, mesele DI "sıkı kaplin zıt" değildir :)
svidgen

Aslında ... DI'nin sizi C # 'da bile bir arabirime bağladığını söyleyerek sınırların dışında olabilirim. Gerçi, C # 'da bunlardan kaçındım, aynı zamanda dynamicparametreleri de kabul edebileceğim izlenimi altındayım . (Ama varbellek hizmet veriyorsa parametreleri.) Yani, C # DI ile, ben düşünüyorum ben de bir arayüz karşı koduna varsa, ya tamamen derleme zamanı doğrulama vazgeçmek zorunda.
svidgen

Nesneler arabirimlere bağlanır. İnterface anahtar sözcüğünü kullanıp kullanmadığınız. Uygun bir arayüz budur. Eşleştirmeniz gereken her şey. Kaybettiğiniz şey uygulama detayları ve ihtiyacınız olmayan ekstra şeyler. Bunu, istemcinin dünyaya "Tek ihtiyacım olan şey bu" demesini sağlamak için interface anahtar sözcüğünü kullanarak resmileştirebiliriz. Ama zorunda değiliz. Heck bazı dillerde yazarak ördek yazabiliriz.
candied_orange

Tamamen anlaşmazlık içinde olduğumuzdan emin değilim. Ama netleştirmek için ... Nesneler edilir içten bağlanmış kendi evet, arayüzler. Ancak, arayüzün kendisi sadece arayüz açıkça isimlendirilmişse bağımlılık bağlaşımı uygular. C # 'da, dynamicveya varbir konumlandırıcıdan bir nesne kullanmak ve arabirimi görmezden gelmenizi ve bu sınıfın bazı arabirimi uygulayıp uygulamadığına bakılmaksızın, ihtiyacınız olan herhangi bir sınıfı kullanmanıza izin verir . Başka bir deyişle, A-> B <-C'ye sahipsek, DI, A'yı C'den ayırır, ancak hem A hem de C'nin B'ye bağlanmasını gerektirir ve D olsa bile, D'nin kullanılmasını önler . do()IDoerdo()
svidgen

2

Spesifik, yaygın olarak kabul gören endüstri terminolojisi olduğunu bilmiyorum, ancak akla gelen alternatifler arasında dahili örnek oluşturma , dahili bağımlılık oluşturma , yerel bağımlılıklar veya yerel olarak kapsamda bağımlılıklar bulunmaktadır .


2
Seviyorum instance creationama yeterince spesifik değil. DI, uygulama düzeyinde değil, denetleyici aracılığıyla örnekler oluşturur. belkiinternal instance creation
amphibient

1

Bağımlılık kapsülleme ile giderdim . Bu, bağımlılığın tekrar ziyaret etmek ve ayrılmak yerine kilitlendiğini ifade eder.

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.