Saya memahami manfaat injeksi ketergantungan itu sendiri. Mari kita ambil contoh Spring. Saya juga memahami manfaat fitur Spring lainnya seperti AOP, helper dari berbagai jenis, dll. Saya hanya ingin tahu, apa saja manfaat konfigurasi XML seperti:
<bean id="Mary" class="foo.bar.Female">
<property name="age" value="23"/>
</bean>
<bean id="John" class="foo.bar.Male">
<property name="girlfriend" ref="Mary"/>
</bean>
dibandingkan dengan kode java lama biasa seperti:
Female mary = new Female();
mary.setAge(23);
Male john = new Male();
john.setGirlfriend(mary);
yang lebih mudah di-debug, waktu kompilasi diperiksa dan dapat dipahami oleh siapa saja yang hanya mengetahui java. Jadi apa tujuan utama kerangka kerja injeksi ketergantungan? (atau sepotong kode yang menunjukkan manfaatnya.)
UPDATE:
Dalam kasus
IService myService;// ...
public void doSomething() {
myService.fetchData();
}
Bagaimana kerangka kerja IoC dapat menebak implementasi myService mana yang ingin saya masukkan jika ada lebih dari satu? Jika hanya ada satu implementasi dari antarmuka yang diberikan, dan saya membiarkan wadah IoC secara otomatis memutuskan untuk menggunakannya, itu akan rusak setelah implementasi kedua muncul. Dan jika hanya ada satu kemungkinan implementasi antarmuka, maka Anda tidak perlu memasukkannya.
Akan sangat menarik untuk melihat bagian kecil konfigurasi untuk IoC yang menunjukkan manfaatnya. Saya telah menggunakan Spring untuk sementara waktu dan saya tidak dapat memberikan contoh seperti itu. Dan saya dapat menunjukkan satu baris yang menunjukkan manfaat hibernate, dwr, dan framework lain yang saya gunakan.
UPDATE 2:
Saya menyadari bahwa konfigurasi IoC dapat diubah tanpa kompilasi ulang. Apakah ini benar-benar ide yang bagus? Saya dapat memahami ketika seseorang ingin mengubah kredensial DB tanpa kompilasi ulang - dia mungkin bukan pengembang. Dalam praktik Anda, seberapa sering orang lain selain pengembang mengubah konfigurasi IoC? Saya pikir untuk pengembang tidak ada upaya untuk mengkompilasi ulang kelas tertentu daripada mengubah konfigurasi. Dan untuk non-pengembang Anda mungkin ingin membuat hidupnya lebih mudah dan menyediakan beberapa file konfigurasi yang lebih sederhana.
PEMBARUAN 3:
Konfigurasi eksternal pemetaan antara antarmuka dan implementasi konkretnya
Apa bagusnya membuatnya menjadi ekstenal? Anda tidak membuat semua kode Anda eksternal, sementara Anda pasti bisa - cukup letakkan di file ClassName.java.txt, baca dan kompilasi secara manual dengan cepat - wow, Anda menghindari kompilasi ulang. Mengapa kompilasi harus dihindari ?!
Anda menghemat waktu pengkodean karena Anda memberikan pemetaan secara deklaratif, bukan dalam kode prosedural
Saya mengerti bahwa terkadang pendekatan deklaratif menghemat waktu. Misalnya, saya mendeklarasikan hanya sekali pemetaan antara properti kacang dan kolom DB dan hibernasi menggunakan pemetaan ini saat memuat, menyimpan, membangun SQL berdasarkan HSQL, dll. Di sinilah pendekatan deklaratif bekerja. Dalam kasus Spring (dalam contoh saya), deklarasi memiliki lebih banyak baris dan memiliki ekspresi yang sama dengan kode yang sesuai. Jika ada contoh ketika deklarasi tersebut lebih pendek dari kode - Saya ingin melihatnya.
Prinsip Inversion of Control memungkinkan pengujian unit yang mudah karena Anda dapat mengganti implementasi nyata dengan yang palsu (seperti mengganti database SQL dengan database dalam memori)
Saya memahami inversi manfaat kontrol (saya lebih suka menyebut pola desain yang dibahas di sini sebagai Injeksi Ketergantungan, karena IoC lebih umum - ada banyak jenis kontrol, dan kami hanya membalik salah satunya - kontrol inisialisasi). Saya bertanya mengapa seseorang membutuhkan sesuatu selain bahasa pemrograman untuk itu. Saya pasti dapat mengganti implementasi nyata dengan yang palsu menggunakan kode. Dan kode ini akan mengungkapkan hal yang sama dengan konfigurasi - kode ini hanya akan menginisialisasi bidang dengan nilai palsu.
mary = new FakeFemale();
Saya mengerti manfaat DI. Saya tidak mengerti manfaat apa yang ditambahkan oleh konfigurasi XML eksternal dibandingkan dengan kode konfigurasi yang melakukan hal yang sama. Saya tidak berpikir bahwa kompilasi harus dihindari - saya mengkompilasi setiap hari dan saya masih hidup. Saya pikir konfigurasi DI adalah contoh buruk dari pendekatan deklaratif. Deklarasi dapat berguna jika dideklarasikan sekali DAN digunakan berkali-kali dengan cara yang berbeda - seperti hibernate cfg, di mana pemetaan antara properti kacang dan kolom DB digunakan untuk menyimpan, memuat, membuat kueri penelusuran, dll. Konfigurasi Spring DI dapat dengan mudah diterjemahkan ke mengkonfigurasi kode, seperti di awal pertanyaan ini, bukan? Dan itu hanya digunakan untuk inisialisasi kacang, bukan? Yang berarti pendekatan deklaratif tidak menambahkan apapun di sini, bukan?
Ketika saya mendeklarasikan pemetaan hibernasi, saya hanya memberikan beberapa informasi pada hibernasi, dan bekerja berdasarkan itu - saya tidak memberi tahu apa yang harus dilakukan. Dalam kasus musim semi, deklarasi saya memberi tahu musim semi apa yang harus dilakukan - jadi mengapa mendeklarasikannya, mengapa tidak melakukannya saja?
PEMBARUAN TERAKHIR: Teman-teman
, banyak jawaban yang memberi tahu saya tentang injeksi ketergantungan, yang SAYA TAHU BAIK. Pertanyaannya adalah tentang tujuan konfigurasi DI daripada menginisialisasi kode - Saya cenderung berpikir bahwa menginisialisasi kode lebih pendek dan lebih jelas. Satu-satunya jawaban yang saya dapatkan sejauh ini untuk pertanyaan saya, adalah bahwa ia menghindari kompilasi ulang, ketika konfigurasi berubah. Saya kira saya harus memposting pertanyaan lain, karena ini adalah rahasia besar bagi saya, mengapa kompilasi harus dihindari dalam kasus ini.