Elle bağımlılık enjeksiyonu kompozisyon ve polimorfizme daha iyi bir alternatif mi?


13

İlk olarak ben bir giriş seviyesi programcısıyım; Aslına bakılırsa, bir AS derecesini yaz boyunca bir final capstone projesi ile bitiriyorum. Yeni işimde, yapacak bir proje olmadığında (takımı daha yeni işe alımlarla doldurmayı bekliyorlar), beklediğimde okumak ve öğrenmek için kitaplar verildi - bazı ders kitapları, diğerleri çok fazla değil (Kod Tamamlandı gibi). Bu kitapları inceledikten sonra mümkün olduğunca çok şey öğrenmek için internete başvurdum ve SOLID ve DI hakkında bilgi edinmeye başladım (Liskov'un yerine koyma prensibi hakkında biraz konuştuk, ancak başka SOLID fikirleri hakkında konuşmadık). Bu yüzden öğrendiğim gibi, daha iyi öğrenmek için oturdum ve DI'yi elle kullanmak için bazı kodlar yazmaya başladım (geliştirme bilgisayarlarında DI çerçeveleri yok).

Şey, benim yaptığım gibi, tanıdık geldiğini fark ediyorum ... ve geçmişte polimorfizm kullanarak soyut sınıfların kompozisyonunu kullanarak yaptığım işe çok benziyor. Burada daha büyük bir resmi mi kaçırıyorum? DI hakkında (en azından elle) bunun ötesine geçen bir şey var mı? Bazı DI çerçevelerinin kodlarını değiştirmeden, bazı şeyleri yeniden derlemek zorunda kalmadan değişen bazı büyük faydalara sahip olma olasılığını anlıyorum, ancak elle yaparken, yukarıda belirtilenden farklı olup olmadığından emin değilim ... Bu konuda bazı bilgiler çok yardımcı olacaktır!

Yanıtlar:


21

DI'deki temel fikir, bağımlılıkları dışarıdan çekmelerine izin vermek yerine, basitçe bağımlılıkları nesnelere itmektir. Buna daha önce "kontrolün ters çevrilmesi" de deniyordu. Bu, bağımlılıkların çok daha iyi kontrol edilmesine ve - son fakat en az değil - birim testi kolay kod yazmasına izin verir.

DI çerçeveleri sadece bu fikrin üzerine kuruludur ve (kısmen) kablolama nesnesi bağımlılıklarının sıkıcı sıkıcı kısmını otomatik olarak birleştirir. Aksi takdirde, daha büyük bir projede elle yapıldığında önemli miktarda kod gerektirebilir.

Bağımlılıkları tanımlamak için, harici yapılandırma dosyalarının yanı sıra, günümüzde, örneğin Java ve C # gibi dillerde kod ek açıklamalarını kullanmak da mümkündür. Bunlar her iki dünyanın da en iyisini getirebilir: kablolama bağımlılıkları açıklayıcı bir tarzda, ancak mantıksal olarak ait olduğu kodun içinde. Bana göre, bağımlılıkları yeniden derlemek zorunda kalmadan değiştirme olasılığı o kadar değerli değil, çünkü gerçek hayatta nadiren yapıldığı için (bazı özel durumlar dışında), ancak kod içinde tanımlanan sınıflardan ve nesnelerden genellikle yapay bir bağımlılık ortaya koyuyor .

Başlık sorunuza geri dönmek için, DI kompozisyon veya polimorfizme alternatif değildir; sonuçta, bu ikisi tarafından mümkün kılınmıştır .


1
Bağımlılık Enjeksiyonu (DI), Kontrolün İnversiyonunun (IoC) bir şeklidir.
Matthew Flynn

@MatthewFlynn, gerçekten. Referans için: martinfowler.com/articles/injection.html
Péter Török

1
Bu benim referansım. UI olay dinleyicilerinin bir çeşit IoC olduğu için zaten yaygın olan bir şey olan kontrolün tersini yapan yeni "hafif kaplar" dan bahsediyor. Spring ve diğer IoC konteynırlarının diğer Kontrol İnversiyonu formundan ayırt etmek için Bağımlılık Enjeksiyonu olarak yaptığı nesne bağını dublajlar.
Matthew Flynn

Hata! Gerçekten "özledim." Benimle çeliştiğini sanıyordum ... Üzgünüm.
Matthew Flynn

Son paragrafınız beni biraz daha iyi hissettiriyor; küçük öğrenme projem boyunca çalıştığım zaman kendime “bu polimorfizm gibi geliyor” demeye devam ettim. Ne yazık ki, işimdeki .Net ve c # korkunç bir şekilde güncel değil, ama içine bakmaktan, bahsettiğiniz yerleşik c # çerçevesi Unity mi?
Drake Clarris

22

Bu konuda okuduğum en iyi makale James Shore's . Ben soyutlama ve polimorfizmin bir parçası olarak, çağlar boyunca " DI elle " yapıyorum . Bu yüzden profesyonel dünyaya girdikten ve bu terimin etrafa atılmasını duyduktan sonra, kelimenin ne anlama geleceğini düşündüğüm ile aslında ne anlama geldiği arasında büyük bir kopukluk yaşadım :

"Bağımlılık Enjeksiyonu" 5 sentlik bir kavram için 25 dolarlık bir terimdir.

Benim için her şeyi temizleyen Shore'un görevinden. Örneğin:

verilmiş

class Engine {public abstract void start()}
class V8 extends Engine {...}
class V6 extends Engine {...}

Yazmak yerine:

class Car
{
    private Engine engine;
    public Car()
    {
        this.engine = new V6();
    }

    public void start()
    {
        this.engine.start();
    }
}

Bunun gibi bir şey yaz:

class Car
{
    private Engine engine;
    public Car(Engine a)
    {
        this.engine = a;
    }

    public void start()
    {
        this.engine.start();
    }
}

...

Car F = new Car(new V8());

Bu da Carörneğin belirli Engineayrıntıları işlemek zorunda kalmasını önler . Bir arabanın sadece bir motora ihtiyacı vardır, temel Motor işlevselliğini uyguladığı sürece hangisinin umurunda değildir. Yani, Carsınıfınız belirli uygulama bağımlılığına bağlı değildir; potansiyel olarak çalışma zamanında başka bir yere "enjekte edilir".

Bu özel Car örneği, "Yapıcı Enjeksiyonu" adı verilen DI alt tipini kullanır, bu da bağımlılığın bir yapıcı argümanı olarak verildiği anlamına gelir. setEngine(Engine a)"Ayarlayıcı Enjeksiyonu" için bir yöntem de kullanabilirsiniz , ancak bu alt türler bana bilgiç görünmektedir.

Bununla birlikte, biraz daha DI, birçok DI çerçevesi, daha soyut olarak referans verilen bu şeylerin bir demetini birbirine bağlamak için ısıtıcı plakasını sağlar.

Bu kadar.


0

Ben sadece son birkaç yıl içinde DI kullanmaya başladığım için uzman değilim, ancak fark ettiğim DI kaplarının yararlı temalarından / işlevlerinden birkaçı (kompozisyon / polimorfizmin ürünleri olarak düşünmüyorum) (ama ben bu konuda düzeltilmiş olabilir):

  • nesne yaratmanın merkezi merkezi
  • iş parçacığı temelinde singleton sağlama
  • engelleme gibi yön odaklı teknikler

0

DI dışında, kök uygulamasında (xml kullanarak yapılandırmak yerine) bir sınıf kompozisyonu yapılandırması vardır. Özellikle büyük projeler için sınıf kompozisyon yapılandırmasını düzenleyebilmelerine rağmen herhangi bir DI veya IoC çerçevesine gerek yoktur. Bunun nedeni, DI çerçevesinin normalde sınıf kompozisyonunu yapılandırmaya yardımcı olan otomatik kablolama gibi ek özellikleri uygulayan kapla birlikte gelmesidir. Bu konudaki anlayışımı ortaya çıkarmak için blog girişimi okuyabilirsiniz .

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.