Kontrolün Ters Çevirilmesi Bağımlılık Tersine Çevirme ile İlişkisi


12

Web üzerindeki birçok makalede, Tersine Çevirme ve Bağımlılık Ters Çevirme İlkesi terimleri karışık ve eş anlamlı olarak kullanılmıştır ("DI-Kapsayıcılar" ve "IoC-Kapsayıcılar" olarak adlandırılan araçlarla daha fazla karışıklık vardır). Bir Wikipedia makalesi , IoC'nin DI ile aynı olmadığını açıklamak için iyi bir iş çıkarıyor:

denetimin ters çevrilmesi (IoC), bir bilgisayar programının özel olarak yazılan bölümlerinin genel, yeniden kullanılabilir bir kitaplıktan denetim akışını aldığı bir tasarımı tanımlar.

Bu yüzden DIP, modüllerinizin somut uygulamalardan ziyade soyutlamalara bağımlı olmasıyla ilgilidir.

IoC, ayrı bir modüle program akışınız üzerinde kontrol vermekle ilgilidir. Ve bu modülün yapabileceği şeylerden biri, çalışma zamanında bağımlılıkları çözmek.

Bu fark adil görünüyor, ancak hiç kimsenin IoC ilkesinin bağımlılık çözme dışında başka uygulamalarından bahsettiğini görmedim. Wikipedia tanımı oldukça geniştir ve yapılandırmasına ve bazı dahili mantığına bağlı olarak özel kodunuza çağrı yapabilen bir modülle çok daha fazlasını yapabileceğiniz anlaşılıyor.

İşte, henüz tam olarak anlayamadığım bazı sorular:

  • IoC ve DIP arasındaki gerçek ilişki nedir? IoC her zaman DIP'nin uygulanmasının bir aracı mıdır?
  • Bağımlılık çözme araçlarına neden hem DI- hem de IoC kapları deniyor? Bu, DI ve IoC'nin aynı şey olduğu anlamına gelir.

Not : Bu soru DI ve IoC arasındaki fark nedir? Sorusunun bir kopyası değildir , çünkü ikincisi Bağımlılık Tersini değil, Bağımlılık Enjeksiyonunu sormaktadır.



@gnat, hayır değil, lütfen düzenlememi görün
Andre Borges

katılıyorum, üzgünüm özledim
gnat

2
IMO, basit cevap "onlar aynı" dır. IoC bağımlılık evrimi için başka bir isimdir ve her ikisi de bağımlılık enjeksiyonunu gerçekleştirmenin bir yoludur. Enjeksiyonla çok kolay karıştığı için "bağımlılık inversiyonunu" çok yararsız bir terim olarak görüyorum. Yani DI (enjeksiyon) var ve IoC, enjeksiyon yoluyla bağımlılıkların / kontrolün tersine çevrilmesinin bir yoludur.
David Arno

Yanıtlar:


6

Martin Fowler'in sitesinde özellikle DIP, DI ve IoC arasındaki fark hakkında bir bölüm içeren harika bir makale var . Bunun özü (bu siteden kopyalandığı gibi)

DI, bir nesnenin nasıl bağımlılık kazandığıyla ilgilidir. Harici olarak bir bağımlılık sağlandığında, sistem DI'yi kullanır. IoC, çağrıyı kimin başlattığıyla ilgilidir. Kodunuz bir çağrı başlatırsa, IoC değildir, kapsayıcı / sistem / kütüphane verdiğiniz kodu tekrar ararsa IoC değildir.

Öte yandan DIP, kodunuzdan aradığı şeye gönderilen mesajlardaki soyutlama seviyesiyle ilgilidir. Emin olmak için, DI veya IoC'yi DIP ile kullanmak daha anlamlı, güçlü ve etki alanı uyumlu olma eğilimindedir, ancak genel bir problemde farklı boyutlar veya güçlerle ilgilidirler. DI kablolama ile ilgilidir, IoC yön ile ilgilidir ve DIP şekil ile ilgilidir.


2
IoC, çağrıyı kimin başlattığıyla ilgilidir - neye çağrıyı kim başlatır ? Eğer ISomeInterface object = container.Resolve<ISomeInterface>()yazarsam bu IoC mi değil mi?
Andre Borges

1
Yazdığınız şey servis bulma düzenindeki bir uygulamadır. Bu aynı zamanda IoC. IoC değil ISomeInterface nesnesi = new MyClass (). Yani, çağrı "örneklemeye çağrı" (ya da "yeni" diyen).
Sjoerd222888

1
"Öte yandan, DIP, kodunuzdan aradığı şeye gönderilen mesajlardaki soyutlama seviyesiyle ilgilidir." Bu bana saçma geliyor. Bunun tersi nerede? Tersini değil bağımlılığı soyutlamayı anlatıyor.
David Arno

@DavidArno, Martin Fowler'in web sitesine güvenemeyeceğimizi mi söylüyorsun?
holdenmcgrohen

@holdenmcgrohen, şeylerle ilgili görüşleri. Sadece Martin Fowler olduğu için bunu yapmıyoruz. IMO gibi zaman zaman yanlış, örneğin "anemi veri modeli" konusunda. Diğer zamanlarda, onun çok anlayışlı. Bu vesileyle, mantıklı olmadığı için onun da yanlış olduğunu düşünüyorum.
David Arno
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.