Kunci dari wadah DI adalah abstraksi . Wadah abstrak abstrak tentang desain ini untuk Anda. Seperti yang Anda tebak, itu memiliki dampak yang nyata pada kode, sering diterjemahkan ke dalam sejumlah konstruktor, setter, pabrik dan pembangun yang lebih sedikit. Karena itu, mereka membuat kode Anda lebih longgar digabungkan (karena IOC yang mendasarinya ), lebih bersih dan lebih sederhana. Meski bukan tanpa biaya.
Latar belakang
Bertahun-tahun yang lalu, abstraksi seperti itu mengharuskan kami untuk menulis berbagai file konfigurasi ( pemrograman deklaratif ). Sungguh luar biasa melihat jumlah LOC berkurang secara substansial, tetapi sementara LOCS menurun, jumlah file konfigurasi sedikit meningkat. Untuk proyek-proyek menengah atau kecil itu bukan masalah sama sekali, tetapi untuk proyek-proyek yang lebih besar, untuk memiliki "perakitan kode" yang tersebar 50% antara kode dan deskriptor XML menjadi masalah di ... Meskipun demikian, masalah utama adalah Paradigma itu sendiri. Itu cukup tidak fleksibel karena deskriptor menyisakan sedikit ruang untuk penyesuaian.
Paradigma bergeser semakin ke konvensi konfigurasi , yang memperdagangkan file konfigurasi untuk anotasi atau atribut. Itu membuat kode kami lebih bersih dan sederhana sambil memberikan kami fleksibilitas yang XML tidak bisa.
Mungkin, ini adalah perbedaan paling signifikan terkait dengan bagaimana Anda bekerja sampai sekarang. Lebih sedikit kode dan lebih banyak sihir.
Di sisi bawah ...
Konvensi tentang konfigurasi membuat abstraksi begitu berat sehingga Anda hampir tidak tahu cara kerjanya. Kadang-kadang tampak ajaib dan inilah satu kelemahan lagi. Setelah berhasil, banyak pengembang tidak peduli tentang cara kerjanya.
Ini adalah hambatan bagi mereka yang belajar DI dengan wadah DI. Mereka tidak sepenuhnya memahami relevansi pola desain, praktik yang baik dan prinsip-prinsip yang disarikan oleh wadah. Saya telah bertanya kepada pengembang apakah mereka terbiasa dengan DI dan kelebihannya dan mereka menjawab: - Ya, saya telah menggunakan Spring IoC -. (Apa artinya itu?!?)
Seseorang dapat setuju atau tidak dengan masing-masing "kelemahan" ini. Menurut pendapat saya yang sederhana, adalah suatu keharusan untuk mengetahui apa yang terjadi dalam proyek Anda. Kalau tidak, kita tidak memiliki pemahaman penuh tentang itu. Juga untuk mengetahui untuk apa DI dan untuk memiliki gagasan tentang bagaimana mengimplementasikannya merupakan nilai tambah untuk dipertimbangkan.
Di sisi positifnya ...
Produktivitas satu kata . Kerangka kerja mari kita fokus pada apa yang benar-benar penting. Bisnis aplikasi.
Terlepas dari kekurangan yang dikomentari, bagi banyak dari kita (pekerjaan yang dikondisikan oleh tenggat waktu dan biaya), alat-alat ini merupakan sumber daya yang tak ternilai. Menurut pendapat saya, ini harus menjadi argumen utama kami dalam mendukung penerapan wadah DI. Produktivitas .
Pengujian
Apakah jika kita menerapkan DI murni atau wadah, pengujian tidak akan menjadi masalah. Justru sebaliknya. Wadah yang sama sering memberi kita ejekan untuk pengujian unit di luar kotak. Selama bertahun-tahun saya telah menggunakan tes saya sebagai termometer. Mereka memberi tahu saya jika saya sangat mengandalkan fasilitas wadah. Saya mengatakan ini karena kontainer ini dapat menginisialisasi atribut pribadi tanpa setter atau konstruktor. Mereka dapat menyuntikkan komponen hampir di sembarang tempat!
Kedengarannya menggoda bukan? Hati-hati! Jangan jatuh ke dalam perangkap !!
Saran
Jika Anda memutuskan untuk menerapkan wadah, saya sangat menyarankan tetap berpegang pada praktik yang baik. Terus menerapkan konstruktor, setter dan antarmuka. Menerapkan kerangka / wadah untuk menggunakannya . Ini akan mempermudah migrasi yang mungkin ke kerangka kerja lain atau menghapus yang sebenarnya. Ini dapat mengurangi secara signifikan ketergantungan pada wadah.
Mengenai praktik ini:
Kapan menggunakan wadah DI
Jawaban saya akan menjadi bias oleh pengalaman sendiri yang terutama mendukung wadah DI (seperti yang saya komentari, saya sangat fokus pada produktivitas, jadi saya tidak pernah memiliki kebutuhan DI murni. Justru sebaliknya).
Saya pikir Anda akan menemukan artikel Mark Seeman yang menarik tentang subjek ini, yang juga menjawab pertanyaan tentang bagaimana menerapkan DI murni .
Akhirnya, jika kita berbicara tentang Jawa, saya akan mempertimbangkan terlebih dahulu melihat ke JSR330 - Dependency Injection .
Meringkas
Manfaat :
- Memotong biaya dan menghemat waktu. Produktifitas.
- Sejumlah kecil komponen.
- Kode menjadi lebih sederhana dan bersih.
Kekurangan :
- DI didelegasikan ke lib pihak ke-3. Kita harus menyadari pertukaran, kekuatan, dan kelemahan mereka.
- Kurva belajar.
- Mereka dengan cepat membuat Anda melupakan beberapa kebiasaan baik.
- Meningkatkan ketergantungan proyek (lebih banyak lib)
- Wadah berdasarkan refleksi memerlukan lebih banyak sumber daya (memori). Ini penting jika kita dibatasi oleh sumber daya.
Perbedaan dengan DI murni :
- Lebih sedikit kode dan lebih banyak file konfigurasi atau anotasi.