Apakah ada bukti bahwa penggunaan injeksi ketergantungan meningkatkan hasil dalam rekayasa perangkat lunak?

18

Terlepas dari popularitasnya, adakah bukti empiris yang menunjukkan bahwa Dependency Injection (dan / atau menggunakan wadah DI) membantu, katakanlah, mengurangi jumlah bug, meningkatkan rawatan, atau meningkatkan kecepatan pengembangan pada proyek perangkat lunak kehidupan nyata?

NMrt
sumber
3
Kemungkinan duplikat injeksi Ketergantungan: Cara menjualnya Dan sebelum Anda hanya melihat pada tajuk utama dan berpikir "hei, ini bukan benar-benar sebuah penipuan" - bacalah pertanyaan lain dan jawabannya, saya pikir mereka sangat cocok dengan pertanyaan ini di sini.
Doc Brown
5
Terima fakta bahwa banyak praktik pengembangan perangkat lunak profesional tidak memiliki "bukti ilmiah", mereka didasarkan pada pengalaman praktis. Jadi, bahkan jika Anda sekarang telah memperburuk pertanyaan Anda hanya karena mencoba membuatnya secara artifisial "kurang duplikat" daripada yang saya tautkan, pertanyaan sebenarnya yang seharusnya Anda tanyakan untuk mendapatkan jawaban yang benar-benar ingin Anda ketahui adalah pertanyaan lain yang saya tautkan dengan . Dan omong-omong, sekarang tampaknya Anda meminta sumber daya pihak ketiga, yang di luar topik di situs ini.
Doc Brown
6
Sangat sedikit teknik dalam pengembangan perangkat lunak yang disertai dengan bukti ilmiah, dari jenis di mana Anda dapat menunjuk ke makalah penelitian dan menyatakan secara pasti bahwa suatu teknik itu berharga. Akibatnya, sebagian besar dari kita mengandalkan pengalaman dan analisis biaya / manfaat untuk membenarkan keputusan kami. Anda memilih teknik seperti injeksi ketergantungan karena Anda memerlukan manfaat yang diberikannya, dan karena manfaat itu lebih besar daripada biayanya. Diakui, kalkulus itu selalu agak subyektif.
Robert Harvey
1
@DocBrown Jujur, saya melihat ini bukan sebagai duplikat, atau sebagai di luar topik, saya sendiri. Alasan dan kemanjuran praktik pembangunan tampaknya sangat relevan untuk SE.SE. Dan, saya akan memberikan jawaban. OP mungkin tidak akan menyukai jawaban saya ... tapi, saya pikir layak memiliki jawaban objektif (hampir-jawab) untuk apakah TPO dan PM dapat berharap untuk melihat produktivitas tim mereka secara ajaib naik (atau tingkat bug mereka turun) sebagai Begitu seseorang berteriak "injeksi ketergantungan."
svidgen
3
@gnat mungkin layak memulai pertanyaan meta yang berbeda untuk pertanyaan "bukti", yang ditambahkan ke ruang lingkup dari jawaban meta "sumber daya situs" lama setelah saya memutakhirkannya. Tentu, meminta kami untuk mencari statistik mungkin tidak membantu. Tapi, inti dari pertanyaan itu sangat masuk akal. Dan, bagi saya, sepertinya malas untuk begitu cepat membatalkannya. Komentar di sini secara khusus memberi kesan bahwa kami adalah sekelompok dogmatis DI yang tidak dapat mempertahankan praktik kami. Ya, kita bisa. Dan kita harus melakukannya.
svidgen

Jawaban:

14

TLDR

Data empiris tidak relevan. Alat dan praktik (seperti DI) memecahkan masalah tertentu . Pahami masalah Anda, pelajari cara menggunakan alat, dan itu akan menjadi jelas ketika alat itu berharga - dan Anda akan dapat menjelaskan hasil yang jauh lebih kenabian daripada data empiris yang digeneralisasi, agregat, apa pun.


Dan sekarang, dengan lebih banyak kata-kata ...

Apakah ada bukti empiris?

Tentu, mungkin. Atau setidaknya mungkin. Tapi siapa peduli? Itu tidak relevan.

Analisis statistik biaya-manfaat DI mungkin menarik secara akademis, tetapi, itu tidak selalu memprediksi keberhasilan individu. Hasil agregat menyembunyikan keberhasilan dan kegagalan individu . Dan, saya mungkin berpendapat bahwa data mengenai praktik "evangelikal" sangat beracun. Disiplin ini cenderung menarik baik orang fanatik dan bodoh, yang keduanya mengaburkan dampak bersih dari implementasi "murni", dan salah satu dari yang Anda bisa !

Jadi, bagaimana kita tahu Injeksi Ketergantungan sama sekali berharga ?

Pertanyaan bagus! Sebenarnya pertanyaan HEBAT. Dan aku bersamamu - aku benci membuang waktu dan upaya mental pada "praktik terbaik" dogmatis yang tidak dapat dibenarkan oleh siapa pun. Jadi, saya senang Anda bertanya.

Uhh. Tapi, inilah masalah yang memalukan ... Secara umum , Anda tidak tahu. Dan, yang lebih memalukan lagi, kode Anda mungkin tidak benar-benar menjadi lebih baik dengan cara memperkenalkan DI.


GASP!

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

...


Jadi, mungkin sekarang Anda bertanya-tanya ...

Kenapa aku harus repot-repot tentang hal-hal yang belum terbukti?

Pertama-tama, mari kita semua - di semua sisi debat - tenang saja. Saya dapat meyakinkan Anda bahwa antara dogmatisme dan skeptisisme ada surga nalar yang indah dan berkepala dingin. (Dan posting SE.SE sesekali eksentrik.) Dan, POAP dapat membawa Anda ke sana.

... Maksud saya, Prinsip Menerapkan Prinsip :

Prinsip, pola, dan praktik bukanlah tujuan akhir. Aplikasi yang baik dan tepat dari masing-masing karena itu terinspirasi dan dibatasi oleh tujuan akhir yang lebih unggul.

Anda perlu memahami mengapa Anda melakukan apa yang Anda lakukan!

(POAP tidak dikecualikan dari POAP.)

(Aku akan mengatakan, "penekanan," tapi itu dari saya "blog" sendiri pula. Jadi, itu semua milikku!)

Izinkan saya mengulangi poin utama di sana: Anda perlu memahami mengapa Anda melakukan apa yang Anda lakukan.

Dan mungkin untuk memperjelas, biasanya tidak masuk akal untuk mengambil "sesuatu" yang diberikan (seperti Injeksi Ketergantungan), dan menggunakannya tanpa sudah memahami masalah apa yang dipecahkannya - khusus untuk Anda. Jika Anda memahami masalah Anda dan bagaimana "sesuatu" (seperti DI) bekerja, akan agak "jelas" betapa membantu "sesuatu" itu, sangat terlepas dari apa yang disarankan oleh data umum, agregat, empiris.

Jika DI membantu atau tidak membantu Anda tidak jelas - atau setidaknya di luar kekuatan penalaran Anda - Anda juga tidak mengerti DI, atau Anda tidak mengerti masalah Anda sendiri.


Mari kita pertimbangkan "perumpamaan" dunia nyata.

Kita perlu membangun sebuah kotak. Kami punya kayu. Kami punya kuku. Dan, kami memiliki dua alat: Palu cakar standar dan obeng .

Sekarang, kita mungkin memiliki beberapa data empiris yang luas untuk menunjukkan bahwa kotak yang dibuat dengan obeng secara keseluruhan lebih kuat, dibandingkan dengan yang dibangun dengan palu. Tetapi, jika Anda mencoba untuk mengacaukan kuku-kuku itu, Anda tidak akan berakhir dengan sebuah kotak sama sekali. Dan, jika Anda mencoba untuk memukulnya dengan obeng, Anda mungkin akan mendapatkannya; tetapi, itu akan membutuhkan lebih banyak waktu dan usaha, dan hasil akhirnya akan kurang tepat (dan kuat) daripada Anda hanya menggunakan palu.

Dan, jika Anda pernah melihat seseorang menggunakan alat apa pun sebelumnya, dan jika Anda memahami seperti apa bentuk kotak itu, keputusannya jelas.

Telekinesis!

Err ... hmm ...


Ya-Jadi, masalah apa yang dipecahkan Dependency Injection?

Ia berfungsi untuk mencegah kode yang kaku dan tidak dapat dikonfigurasi, yang karenanya seringkali tidak dapat diuji .

Ia melakukan ini dengan mengizinkan kode pemohon untuk memutuskan objek apa yang beroperasi dengan modul. Dan saya tahu Anda memikirkannya, dan Anda benar: Ini bahkan bukan konsep baru yang jauh. Metode / Parameter fungsi telah ada sejak aljabar terjadi.

Kami mulai menginjili lewat parameter dasar, menyebutnya "Injeksi Ketergantungan", setelah kami mengakumulasikan dan mewarisi kode yang cukup untuk melihat ketidakseimbangan kami. Pegunungan kode yang kami duduki tidak dapat dengan mudah diubah, diuji, atau bahkan digunakan kembali , hanya karena dependensi disembunyikan.

Oleh karena itu, perjuangan keras untuk Injeksi Ketergantungan ...

K. Tapi, saya bisa menyampaikan argumen dengan baik. Mengapa kerangka kerja ?

Seperti yang saya pahami, kerangka kerja DI terutama menyelesaikan masalah penumpukan boilerplate (karena DI yang terlalu bersemangat, IMO) - terutama ketika ada dependensi "default" standar untuk semua modul yang membutuhkannya. Kerangka DI melakukan hal-hal ajaib (mungkin bahkan nakal!) Untuk menyelinap dependensi default mereka ketika mereka tidak secara eksplisit disahkan pada titik doa. (Efek yang sama sebagai Penentu Lokasi Layanan ketika digunakan dengan cara ini, ingat!)

Ketergantungan Injeksi, sebagai "disiplin", sebenarnya sangat sulit untuk dilakukan dengan benar. Ini bukan masalah menggunakan DI atau tidak; itu masalah mengetahui dependensi mana yang cenderung berubah atau perlu mengejek dan menyuntikkan mereka . Dan kemudian, masalah menentukan apakah DI cocok dengan yang lebih baik daripada beberapa alternatif, seperti Lokasi Layanan ...

Tapi, saya akan mendorong Anda untuk Google itu , mungkin melihat jawaban SO ini , mungkin berbicara dengan pengembang super-berpengalaman dan sukses dalam industri Anda, dan contoh-contoh spesifik posting ke CR.SE .

svidgen
sumber
4
Sudahkah Anda menghirup lem @ CandiedOrange? +1 untuk Prinsip Tujuan yang Diterapkan.
Robert Harvey
1
@RobertHarvey Berharap saya bisa mengatakan saya lem baru yang sedang kita bicarakan! Saya sudah memiliki dendam lama terhadap rekayasa berbasis agama ... Kecuali jika Anda mengacu pada narasi - mungkin bahkan zany - sifat posting?
svidgen
2
Catatan tambahan bagi para downvoters, tidak ada yang lebih meyakinkan saya dalam keputusan saya untuk menjawab pertanyaan selain suara naik turun yang seimbang! ... Ini akan menyenangkan untuk melihat kritik Anda di komentar meskipun ...
svidgen
3
@RobertHarvey tidak yakin lem mana yang saya maksudkan tapi saya menemukan diri saya menyetujui setiap kata dari ini. Sangat mudah untuk berpikir palu menyebalkan ketika Anda menggunakannya pada sekrup.
candied_orange
Mulai pengeditan untuk memasukkan lebih detail tentang DI secara khusus dan menggembungkan TLDR ke atas. Dan kemudian anak-anak mulai ribut, jadi saya menekan Save. ... Jika saya secara tidak sengaja kehilangan esensi dari apa yang Anda pilih (bagi Anda yang melakukannya), tolong beri tahu saya!
svidgen
12

Saya mencari di Google, Google Cendekia, ACM, dan IEEE Inilah beberapa makalah yang saya dapat temukan:

  • Kerangka kerja Dependency Injection: peningkatan kemampuan uji? . Ini berpendapat bahwa "testability" dapat didefinisikan sebagai "kohesi rendah". Ini menyatakan bahwa DI mengarah pada kohesi yang lebih rendah, kohesi yang lebih rendah berkorelasi dengan cakupan tes yang lebih tinggi, dan bahwa cakupan tes yang lebih tinggi berkorelasi dengan lebih banyak kesalahan yang ditemukan. Dikatakan bahwa, berdasarkan ini, DI meningkatkan testabilitas.

    Saya tidak suka ini karena beberapa alasan. Pertama-tama, ia mengatakan "A berkorelasi dengan B, B berkorelasi dengan C, jadi A menyebabkan C", yang merupakan beberapa langkah dalam logika yang saya lihat tidak didukung dengan baik oleh kertas. Kedua, ia mengakui bahwa itu hanya mengukur "sub bagian dari testability", dan bahwa 'testability' secara umum bukanlah sesuatu yang mudah didefinisikan. Akhirnya, ukuran testabilitas mereka didefinisikan dalam hal jumlah ketergantungan yang disuntikkan!

  • Efek Injeksi Ketergantungan pada Pemeliharaan . Mereka membandingkan proyek yang menggunakan DI dengan proyek yang tidak menggunakan DI yang mereka temukan di SourceForge dan melihat apakah ada perbedaan dalam metrik kohesi. Untuk mengurangi bias, mereka memasangkan proyek agar semirip mungkin. Pada akhirnya, mereka melihat sinyal bahwa proyek dengan banyak DI agak kurang digabungkan daripada proyek dengan hanya sedikit DI. Namun, tampaknya tidak ada perbedaan yang signifikan dalam kohesi antara proyek DI dan pasangan non-DI mereka, jadi itu bisa menjadi konsekuensi dari domain tertentu. Mereka menyebutkan "tidak ada korelasi" sebagai hasil utama mereka dan "mungkin itu sedikit membantu?" sebagai topik untuk studi lebih lanjut.

  • Secara empiris menilai dampak injeksi ketergantungan pada pengembangan aplikasi layanan web . Abstrak tidak benar-benar menjelaskan apa yang mereka cari. Saya menggali dan membaca pracetak dan sejauh yang saya tahu itu sebenarnya tentang seberapa baik alat otomatis dapat menemukan layanan. Layanan yang ditulis dengan gaya DI lebih mudah ditemukan. Juga, mengutip penelitian sebelumnya saya terdaftar sebagai memberikan bukti empiris bahwa DI mengurangi kopling, yang merupakan kebalikan dari apa yang diklaim kertas.

Untuk ketiga makalah ini (dan untuk Studi Empiris tentang Penggunaan Injeksi Ketergantungan di Jawa , yang hanya tentang deteksi) saya menindaklanjuti semua makalah yang mengutip mereka, tidak ada yang tentang menentukan efektivitas DI. Mengingat semua ini, saya yakin mengatakan bahwa tidak , kami belum memiliki bukti empiris tentang apakah DI meningkatkan kualitas perangkat lunak atau tidak.

Hovercouch
sumber
2
Ini menjawab pertanyaan secara langsung. +1
Matthew James Briggs
3
@MatthewJamesBriggs Saya bukan downvoter, tetapi, apakah menjawab pertanyaan secara langsung penting jika jawabannya menyesatkan atau tidak lengkap ???
svidgen
@viden Saya tidak melihat bagaimana jawabannya tidak lengkap. Pertanyaannya adalah "apakah kita memiliki bukti empiris bahwa DI berfungsi?" Dan jawabannya adalah tidak." Itu mengatakan apa-apa tentang apakah itu berfungsi atau tidak, hanya saja tidak ada penelitian tentang itu.
Hovercouch
1
Tidak lengkap dan menyesatkan karena jawaban Anda membatasi ruang lingkup "bukti" untuk "makalah yang telah Anda temukan" dan diselimuti "keefektifan" tanpa menghormati tujuan DI yang sebenarnya, dan bahwa Anda memiliki Oleh karena itu disimpulkan bahwa jawabannya adalah "tidak" tanpa kualifikasi ... Saya berpendapat bahwa, jika Anda akan "langsung" menjawab pertanyaan, seperti yang disarankan @MatthewJamesBriggs, Anda harus bertanggung jawab untuk menggali lebih dalam dan menjadi mampu menunjukkan dengan kepastian tinggi bahwa Anda telah menjelajahi semua jalan ...
svidgen
1
Dan saya kira, ketika menggabungkan dengan penilaian yang terburu-buru Anda dari satu sumber daya Anda tidak mengutip, aku mungkin bahkan menyebutnya jawaban ini sangat menyesatkan. Karena, selain dari semua bukti potensial yang Anda abaikan, Anda mengambil bukti yang terdokumentasi dan segera mengabaikannya karena alasan yang tidak sepenuhnya dijelaskan. ... Jika saya mengklaim, misalnya, bahwa "tidak ada bukti kami mendarat di bulan" karena kertas "satu-satunya" yang pernah saya baca tentang masalah ini berasal dari revisi buku teks "usang" yang tidak saya ketahui. percaya, saya harap Anda akan skeptis terhadap metode saya ...
svidgen