Bağımlılık enjeksiyonu kullanımının yazılım mühendisliğinde sonuçları artırdığına dair kanıt var mı?


18

Popülerliğine bakılmaksızın, Bağımlılık Enjeksiyonunun (ve / veya bir DI kabının kullanılmasının) örneğin hata sayısını azaltmaya, sürdürülebilirliği artırmaya veya gerçek hayattaki yazılım projelerinde geliştirme hızını artırmaya yardımcı olduğunu gösteren ampirik kanıtlar var mı?


3
Bağımlılık enjeksiyonunun olası kopyası : Nasıl satarsınız Ve sadece başlığa bakmadan ve "hey, bu tam anlamıyla bir dupe değil" diye düşünmeden önce - diğer soruyu ve cevapları okuyun, bence bu soruya çok iyi uyuyorlar.
Doc Brown

5
Birçok profesyonel yazılım geliştirme uygulamasının "bilimsel kanıt" içermediğini kabul edin, pratik deneyime dayanırlar. Bu nedenle, sorunuzu yalnızca bağlantı kurduğum sorudan yapay olarak "daha az kopya" yapmaya çalıştığınız için kötüleştirseniz bile, gerçekten bilmek istediğiniz cevapları almak için sormanız gereken gerçek soru, bağlantı kurduğum diğer soru . Ve bu arada, şimdi bu sitede konu dışı olan üçüncü taraf kaynakları istiyormuşsunuz gibi görünüyor.
Doc Brown

6
Yazılım geliştirmede çok az tekniğe, bir araştırma makalesine işaret edebileceğiniz ve bir tekniğin değerli olduğunu kesin olarak beyan edebileceğiniz türden bilimsel kanıtlar eşlik etmektedir. Sonuç olarak, çoğumuz kararlarımızı haklı çıkarmak için deneyim ve maliyet / fayda analizlerine güveniyoruz. Bağımlılık enjeksiyonu gibi bir teknik seçersiniz, çünkü sağladığı faydalara ihtiyacınız vardır ve bu faydalar maliyetlerden daha ağır basar. Kuşkusuz, bu analiz her zaman biraz özneldir.
Robert Harvey

1
@DocBrown Dürüst olmak gerekirse, bunu ne bir kopya olarak ne de konu dışı olarak görüyorum. Bir geliştirme uygulamasının mantığı ve etkinliği SE.SE ile çok ilgili görünmektedir. Ve bir cevap vereceğim. OP muhtemelen cevabımı beğenmeyecek ... ama, TPO'ların ve PM'lerin ekiplerinin verimliliğinin sihirli bir şekilde artmasını (veya hata oranlarının düştüğünü) görmeyi bekleyip bekleyemeyeceğine objektif bir cevap (neredeyse cevap) vermeye değer olduğunu düşünüyorum. Birisi "bağımlılık enjeksiyonu" diye bağırır.
svidgen

3
@gnat, "kanıt" soruları için ayrı bir meta soru başlatmaya değer, bu da "site kaynağı" meta cevabının kapsamına, ben kaldırdıktan çok sonra eklendi. Elbette, istatistikleri bulmamızı istemek muhtemelen yardımcı olmuyor. Ancak, sorunun özü son derece makul. Ve bence, konudan bu kadar çabuk çıkmak tembellik gibi geliyor. Burada yapılan yorumlar özellikle biz sadece DI dogmatiklerin bir avuç izlenimini vermek edemez uygulamalarımızı savunmak. Evet, yapabiliriz. Ve yapmalıyız.
svidgen

Yanıtlar:


14

TLDR

Ampirik veriler önemsizdir. Araçlar ve uygulamalar (DI gibi) belirli sorunları çözer . , Sorunlarınızı anlamak araçların nasıl kullanılacağını öğrenmek ve bir araç değerli olduğu çok açık olacaksınız - ve çok daha isabetli herhangi genelleştirilmiş, toplanmış, ampirik verilere göre sonuçları açıklamak mümkün olacak.


Ve şimdi, çok daha fazla ayrıntıyla ...

Ampirik kanıt var mı?

Elbette, muhtemelen. Ya da en azından belki. Ama kim umursar? Alakalı değil.

DI'nin istatistiksel maliyet-fayda analizi akademik olarak ilginç olabilir, ancak bireysel başarıyı tahmin etmek zorunda değildir. Toplu sonuçlar, bireysel başarıları ve başarısızlıkları gizler . Ve "Protestan" uygulamalara ilişkin verilerin özellikle zehirli olduğunu iddia edebilirim. Bu disiplinler bir "saf" uygulaması net etkisini gizleyen, her ikisi de gönülden bağlı ve aptalları, hem kendimize çekeriz ve ya hangi sen olabilir olun!

Peki, Bağımlılık Enjeksiyonunun hiç değerli olmadığını nasıl biliyoruz ?

İyi soru! Aslında BÜYÜK soru. Ve seninleyim - kimsenin haklı gösteremeyeceği dogmatik “en iyi uygulamalar” için zaman ve zihinsel çaba harcamaktan nefret ediyorum. Sorduğunuza sevindim.

Ahh. Fakat, Burada ... utandırıcı bir problem genel anlamda, sen yok biliyorum. Ve daha da utanç verici bir şekilde, kodunuz DI'yi tanıtarak hiçbir şekilde daha iyi olmayabilir.


GASP!

    ⊙▃⊙     . . .      (╯°□°)╯︵ ┻━┻

...


Belki şimdi merak ediyorsunuz ...

Neden 'can sıkıcı şeyler ispatlanmıyor' diye rahatsız etmeyeyim?

Her şeyden önce, hadi - tartışmanın her iki tarafında - sadece yerleşelim. Dogmatizm ile şüphecilik arasında güzel bir akıl ve düzlük cenneti bulunduğunu garanti edebilirim. (Ve ara sıra eksantrik SE.SE yazısı.) Ve POAP sizi oraya götürebilir.

... Demek istediğim, İlkeleri Uygulama Prensibi :

İlkeler, kalıplar ve uygulamalar nihai amaç değildir. Bu nedenle, her birinin iyi ve uygun bir şekilde uygulanması, üstün ve daha nihai bir amaçtan esinlenir ve kısıtlanır .

Yaptığın şeyi neden yaptığını anlamalısın!

(POAP, POAP'tan muaf değildir.)

("Vurgu mayın" derdim ama yine de kendi "blogum" dan. Yani, hepsi benim!)

Oradaki ana noktayı tekrarlayayım: Yaptığınız şeyi neden yaptığınızı anlamanız gerekiyor.

Ve belki de açıklığa kavuşturmak için, belirli bir "şey" (Bağımlılık Enjeksiyonu gibi) almak ve hangi sorunu çözdüğünü anlamadan - özellikle sizin için - genellikle mantıklı değildir . Sorunlarınızı ve "DI" gibi "bir şeyin" nasıl işlediğini anlarsanız, genelleşmiş, toplu, ampirik verilerin ne önerdiğine bakılmaksızın "bir şeyin" ne kadar yararlı olduğu bir şekilde "açık" olacaktır.

DI yardımseverlik veya varsa un Sebebin güçlerin ötesinde ya da en azından - - Size -helpfulness açık değildir ya DI anlamıyorum, ya da kendi sorunları anlamıyorum.


Gerçek dünya "benzetmesi" ni ele alalım.

Bir kutu yapmamız gerekiyor. Odunumuz var. Tırnaklarımız var. Ve iki aracımız var: Standart bir pençe çekiç ve bir tornavida .

Şimdi, tornavidalarla inşa edilen kutuların, çekiçlerle inşa edilenlere kıyasla genel olarak önemli ölçüde daha sağlam kutular olduğunu gösteren bazı ampirik verilerimiz olabilir. Ancak, bu tırnakları vidalamaya çalışırsanız, bir kutu ile sonuçlanmazsınız. Ve, bunları tornavida ile sokmaya çalışırsanız, sonunda onları içeri alabilirsiniz; ancak, önemli ölçüde daha fazla zaman ve çaba gerektirecektir ve nihai sonuç, çekici kullandığınızdan daha az kesin (ve sağlam) olacaktır.

Ve daha önce birinin herhangi bir aracı kullandığını gördüyseniz ve bir kutunun nasıl göründüğünü anlarsanız, karar açıktır.

Telekinezi!

Hata ... hmm ...


Evet, Peki, Bağımlılık Enjeksiyonu hangi problemi çözüyor?

Genellikle, bu nedenle un- olan önler katı, un tarafından yapılandırılabilen kod çalışır test edilebilir .

Bunu, bir modülün hangi nesnelerle çalışacağına karar vermek için kod çağırarak izin verir . Ve düşündüğünü biliyorum ve haklısın: Bu uzaktan yeni bir kavram bile değil. Cebir gerçekleştiği için yöntem / fonksiyon parametreleri mevcuttur.

Dengesizliklerimizi görmek için yeterli kodu biriktirip miras aldığımızda, temel parametre geçişini analiz etmeye başladık, buna "Bağımlılık Enjeksiyonu" adını verdik. Üzerine oturduğumuz kod dağları , sadece bağımlılıklar gizlendiği için kolayca değiştirilemez, test edilemez ve hatta tekrar kullanılamazdı .

Bu nedenle, Bağımlılık Enjeksiyonu için gayretli haçlı seferi ...

K. Ama argümanları gayet iyi iletebilirim. Neden çerçeveler ?

Anladığım kadarıyla, DI çerçeveleri temel olarak kazan plakası birikimi problemini çözer (aşırı hevesli DI, IMO nedeniyle) - özellikle de bunları gerektiren tüm modüller için standart "varsayılan" bağımlılıklar olduğunda. DI çerçeveleri, çağrılma noktasında açıkça geçilmediğinde bu varsayılan bağımlılıkları kaydırmak için sihirli (potansiyel olarak yaramaz!) Şeyler yapar. ( Bu şekilde kullanıldığında Servis Bulucu ile aynı etki , dikkat edin!)

Bağımlılık Enjeksiyon, bir "disiplin" olarak, gerçekten doğru bir şekilde yapılması zordur. DI kullanma ya da kullanma meselesi değil; hangi bağımlılıkların değişebileceğini veya alay edip bunlara enjekte edilmesi gerektiğini bilmek meselesidir . Ve sonra, DI'nin Hizmet Konumu gibi bazı alternatiflerden daha iyi uyup uymadığına karar vermek meselesi ...

Ancak, sizi Google'a teşvik ediyorum , belki de bu SO cevabını görüyorum , muhtemelen endüstrinizdeki süper deneyimli ve başarılı bir geliştiriciyle konuşun ve CR.SE'ye belirli örnekler gönderin .


4
@ CandiedOrange'in tutkalından bazılarını kokluyor musunuz? Uygulamalı Amaçlar İlkesi için +1.
Robert Harvey

1
@RobertHarvey İstediğimiz tutkalın yeni olduğunu söyleyebilirim! İnanç temelli mühendisliğe karşı uzun süredir devam eden bir kan davası geçirdim ... Yazının anlatımından - muhtemelen zany'dan - bahsetmedikçe?
svidgen

2
Downvoters'ın yan notu, bir soruyu cevaplama kararımda dengeli ve yukarı-aşağı oylardan başka hiçbir şey beni daha fazla güvence altına alamaz! ... Yorumlarınızda eleştirilerinizi görmek güzel olurdu ...
svidgen

3
@RobertHarvey hangi yapıştırıcılarımdan bahsettiğinizden emin değilim ama kendimi bunun her kelimesine katılıyorum. Bir çekiçin vidalarda kullandığınızda berbat olduğunu düşünmek kolaydır.
candied_orange

Özellikle DI hakkında daha fazla ayrıntı eklemek ve TLDR'yi en üste taşımak için düzenlemeye başladı. Ve sonra çocuklar huzursuzlaşmaya başladı, ben de Save'e vurdum. ... Eğer istemediğiniz şeyin özünü (yapmış olanlar için) yanlışlıkla kaybetmişsem, lütfen bana bildirin!
svidgen

12

Google, Google Akademik, ACM ve IEEE'yi aradım. Bulabildiğim makaleler şunlardı:

  • Bağımlılık Enjeksiyon çerçeveleri: test edilebilirlikte bir gelişme? . "Test edilebilirlik" in "düşük uyum" olarak tanımlanabileceğini iddia eder. DI'nin daha düşük kohezyona yol açtığını, daha düşük kohezyonun daha yüksek test kapsamı ile ilişkili olduğunu ve daha yüksek test kapsamının bulunan daha fazla hata ile ilişkili olduğunu belirtmektedir. Buna dayanarak DI'nin test edilebilirliği geliştirdiğini söylüyor.

    Bunu birkaç nedenden dolayı sevmiyorum. Her şeyden önce, "A, B ile ilişkilidir, B, C ile ilişkilidir, bu nedenle A, C'ye neden olur", ki bu, gazetenin iyi desteklediğini görmediğim mantıkta birkaç adımdır. İkincisi, sadece "test edilebilirliğin alt parçalarını" ölçtüğünü ve "test edilebilirlik" in genel olarak kolayca tanımlanabilecek bir şey olmadığını kabul eder. Son olarak, test edilebilirlik ölçüsü, enjekte edilen bağımlılıkların sayısı olarak tanımlanır!

  • Bağımlılık Enjeksiyonunun Sürdürülebilirlik Üzerine Etkileri . DI'yi kullanan projeleri SourceForge'da buldukları DI'yi kullanmayan projelerle karşılaştırırlar ve uyum metriklerinde herhangi bir fark olup olmadığını görürler. Yanlılığı azaltmak için, projeleri mümkün olduğunca benzer olacak şekilde eşleştirdiler. Sonuçta, çok fazla DI olan projelerin, sadece biraz DI olan projelerden biraz daha az bağlı olduğuna dair sinyaller gördüler. Bununla birlikte, DI projeleri ile DI olmayan çiftleri arasında uyum açısından önemli bir fark olmadığı görülmüştür, bu nedenle belirli alanların bir sonucu olabilir. Onlar "hiçbir korelasyon" birincil sonuç olarak listeler ve "belki biraz yardımcı olur?" daha fazla çalışma için bir konu olarak.

  • Bağımlılık enjeksiyonunun web hizmeti uygulamalarının geliştirilmesi üzerindeki etkisini ampirik olarak değerlendirme . Özet gerçekten ne aradıklarını açıklamıyor. Bir ön baskıyı kazdım ve okudum ve aslında otomatik takımların hizmetleri ne kadar iyi keşfedebileceğini anlayabildiğim kadarıyla. DI tarzında yazılmış hizmetler daha kolay keşfedildi. Ayrıca, listelediğim önceki çalışmanın, DI'nin kuplajı azalttığına dair makalenin iddia ettiği zıttı azalttığını gösteren ampirik kanıtlar olarak belirtmektedir.

Bu üç makale için (ve Java'da Bağımlılık Enjeksiyonunun Kullanımına Yönelik Ampirik Bir Çalışma için , sadece algılama ile ilgili) Onlardan bahseden, hiçbiri DI'nin etkinliğini belirlemekle ilgili olmayan tüm kağıtları takip ettim. Tüm bunlar göz önüne alındığında, hayır dediğimden eminim , DI'nin yazılım kalitesini artırıp iyileştirmediğine dair henüz ampirik kanıtlarımız yok.


2
Bu doğrudan soruyu cevaplar. +1
Matthew James Briggs

3
@MatthewJamesBriggs Ben downvoter değilim, ancak sorunun yanıltıcı veya eksik olup olmadığı doğrudan soruyu cevaplamak ???
svidgen

@svidgen Cevabın nasıl eksik olduğunu anlamıyorum. Soru "DI'nin işe yaradığına dair ampirik kanıtlarımız var mı?" Ve cevap hayır." Bu, işe yarayıp yaramadığı hakkında hiçbir şey söylemiyor, sadece üzerinde araştırma yok.
Hovercouch

1
Cevabınızın eksik ve yanıltıcı olması, "delil" in kapsamını "bulabileceğiniz" (sic) bulabileceğiniz "kağıtlarla sınırlar ve DI'nin gerçek amaçlarına saygı duymadan" etkililik "üzerine batırır ve bu nedenle cevabın kalifikasyon olmadan "hayır" olduğu sonucuna vardı ... @MatthewJamesBriggs'in önerdiği gibi, soruyu "doğrudan" cevaplayacaksanız, derin kazmaya ve tüm yolları keşfettiğinizi yüksek bir kesinlik ile gösterebiliyoruz ...
svidgen

1
Ve sanırım, bunu belirttiğiniz tek kaynak hakkındaki aceleci değerlendirmenizle birleştirdiğinizde, bu yanıtı çok yanıltıcı bile diyebilirim . Çünkü, göz ardı ettiğiniz tüm potansiyel kanıtların yanı sıra, belgelenmiş kanıtlar alıyorsunuz ve tam olarak açıklanmayan nedenlerle derhal indirim yapıyorsunuz. ... Örneğin, "aya intiğimizi gösteren hiçbir kanıt yok" diye iddia edersem, çünkü konuyla ilgili şimdiye kadar okuduğum "tek" kağıt, benim kullanmadığım "itiraz edilmiş" bir ders kitabı revizyonundan güven, umarım yöntemlerime
kuşkunuz olur
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.