Di tingkat kelas, itu mudah.
'Injeksi Ketergantungan' hanya menjawab pertanyaan "bagaimana saya akan menemukan kolaborator saya" dengan "mereka didorong pada Anda - Anda tidak harus pergi dan mendapatkannya sendiri". (Ini mirip dengan - tetapi tidak sama dengan - 'Pembalikan Kontrol' di mana pertanyaan "bagaimana saya akan memesan operasi saya atas input saya?" Memiliki jawaban yang sama).
Satu- satunya manfaat yang mendorong kolaborator Anda pada Anda adalah yang memungkinkan kode klien untuk menggunakan kelas Anda untuk membuat grafik objek yang sesuai dengan kebutuhan saat ini ... Anda belum secara sewenang-wenang menentukan bentuk dan mutabilitas grafik dengan memutuskan secara pribadi jenis konkret dan siklus hidup kolaborator Anda.
(Semua manfaat lainnya, dari testability, lepas kopling, dll, sebagian besar mengikuti dari penggunaan antarmuka dan tidak begitu banyak dari ketergantungan-injeksi-ness, meskipun DI secara alami mempromosikan penggunaan antarmuka).
Perlu dicatat bahwa, jika Anda menghindari instantiate kolaborator Anda sendiri, kelas Anda karenanya harus mendapatkan kolaboratornya dari konstruktor, properti, atau argumen metode (opsi terakhir ini sering diabaikan, omong-omong ... cara itu memang terjadi. tidak selalu masuk akal bagi kelas 'kolaborator untuk menjadi bagian dari' keadaannya ').
Dan itu bagus.
Pada tingkat aplikasi ...
Begitu banyak untuk pandangan per kelas tentang hal-hal. Katakanlah Anda memiliki banyak kelas yang mengikuti aturan "jangan instantiate kolaborator Anda sendiri", dan ingin membuat aplikasi dari mereka. Hal paling sederhana yang harus dilakukan adalah menggunakan kode lama yang baik (alat yang sangat berguna untuk memanggil konstruktor, properti, dan metode!) Untuk menyusun grafik objek yang Anda inginkan, dan memberikan beberapa masukan padanya. (Ya, beberapa objek dalam grafik Anda sendiri akan menjadi pabrik objek, yang telah diedarkan sebagai kolaborator ke objek berumur panjang lainnya dalam grafik, siap untuk digunakan ... Anda tidak dapat melakukan pra-konstruksi setiap objek! ).
... kebutuhan Anda untuk 'secara fleksibel' mengkonfigurasi objek-grafik aplikasi Anda ...
Bergantung pada tujuan Anda yang lain (yang tidak berhubungan dengan kode), Anda mungkin ingin memberi pengguna akhir kontrol atas grafik objek yang digunakan. Ini mengarahkan Anda ke arah skema konfigurasi, dari satu jenis atau lainnya, apakah itu file teks dari desain Anda sendiri dengan beberapa pasangan nama / nilai, file XML, DSL kustom, bahasa deskripsi grafik deklaratif seperti YAML, bahasa skrip imperatif seperti JavaScript, atau sesuatu yang lain yang sesuai dengan tugas yang dihadapi. Apa pun yang diperlukan untuk membuat grafik objek yang valid, dengan cara yang memenuhi kebutuhan pengguna Anda.
... mungkin kekuatan desain yang signifikan.
Dalam keadaan yang paling ekstrem dari tipe itu, Anda dapat memilih untuk mengambil pendekatan yang sangat umum, dan memberi pengguna akhir mekanisme umum untuk 'memasang kabel' grafik objek yang mereka pilih dan bahkan memungkinkan mereka untuk memberikan realisasi konkret dari antarmuka ke runtime! (Dokumentasi Anda adalah permata yang berkilau, pengguna Anda sangat pintar, akrab dengan setidaknya garis besar kasar dari grafik objek aplikasi Anda, tetapi tidak memiliki kompiler yang praktis). Skenario ini secara teoritis dapat terjadi dalam beberapa situasi 'perusahaan'.
Dalam hal ini, Anda mungkin memiliki bahasa deklaratif yang memungkinkan pengguna Anda untuk mengekspresikan jenis apa pun, komposisi grafik objek jenis tersebut, dan palet antarmuka yang dapat dicampur dan dicocokkan oleh pengguna akhir mitos. Untuk mengurangi beban kognitif pada pengguna Anda, Anda lebih suka pendekatan 'konfigurasi dengan konvensi', sehingga mereka hanya perlu melangkah dan menaiki objek-grafik-fragmen minat, daripada bergulat dengan semuanya.
Dasar kau orang miskin!
Karena Anda tidak suka menulis semua itu sendiri (tapi serius, lihat mengikat YAML untuk bahasa Anda), Anda menggunakan semacam kerangka DI.
Bergantung pada kematangan kerangka kerja itu, Anda mungkin tidak memiliki opsi untuk menggunakan konstruktor-injeksi, bahkan ketika itu masuk akal (kolaborator tidak berubah selama masa objek), sehingga memaksa Anda untuk menggunakan Setter Injection (bahkan ketika kolaborator tidak berubah selama masa objek, dan bahkan ketika tidak ada alasan logis mengapa semua implementasi konkret antarmuka harus memiliki kolaborator dari tipe tertentu). Jika demikian, Anda saat ini berada dalam neraka penggabungan yang kuat, meskipun telah rajin 'menggunakan antarmuka' di seluruh basis kode Anda - horor!
Semoga saja, Anda menggunakan kerangka kerja DI yang memberi Anda opsi injeksi konstruktor, dan pengguna Anda hanya sedikit pemarah pada Anda karena tidak menghabiskan lebih banyak waktu untuk memikirkan hal-hal spesifik yang mereka butuhkan untuk mengonfigurasi dan memberi mereka UI yang lebih cocok untuk tugas tersebut. di tangan. (Meskipun untuk bersikap adil, Anda mungkin memang mencoba memikirkan cara, tetapi JavaEE mengecewakan Anda dan Anda harus menggunakan hack yang mengerikan ini).
Bootnote
Pada titik mana pun Anda tidak pernah menggunakan Google Guice, yang memberi Anda pembuat kode cara untuk menghilangkan tugas menyusun objek-grafik dengan kode ... dengan menulis kode. Argh!