Pada tahun lalu, saya menciptakan sistem baru menggunakan Dependency Injection dan wadah IOC. Ini mengajari saya banyak hal tentang DI!
Namun, bahkan setelah mempelajari konsep dan pola yang tepat, saya menganggapnya sebagai tantangan untuk memisahkan kode dan memperkenalkan wadah IOC ke dalam aplikasi warisan. Aplikasi ini cukup besar sehingga implementasi yang benar akan luar biasa. Bahkan jika nilainya dipahami dan waktu diberikan. Siapa yang diberikan waktu untuk hal seperti ini ??
Tujuannya tentu saja adalah untuk membawa unit test ke logika bisnis!
Logika bisnis yang terkait dengan panggilan basis data pencegah pengujian.
Saya telah membaca artikel-artikel dan saya memahami bahaya Injeksi Ketergantungan Orang Miskin seperti yang dijelaskan dalam artikel Los Techies ini . Saya mengerti itu tidak benar - benar memisahkan apa pun.
Saya mengerti bahwa ini dapat melibatkan banyak refactoring seluruh sistem karena implementasi memerlukan dependensi baru. Saya tidak akan mempertimbangkan menggunakannya pada proyek baru dengan ukuran berapa pun jumlahnya.
Pertanyaan: Apakah saya tetap bisa menggunakan DIA Poor Man untuk memperkenalkan testability ke aplikasi lawas dan memulai penggulingan bola?
Selain itu, apakah menggunakan DIA Orang Miskin sebagai pendekatan akar rumput untuk Injeksi Ketergantungan sejati merupakan cara yang berharga untuk mendidik tentang kebutuhan dan manfaat prinsip?
Bisakah Anda refactor metode yang memiliki ketergantungan panggilan database dan abstrak yang memanggil ke belakang antarmuka? Cukup memiliki abstraksi itu akan membuat metode itu dapat diuji karena implementasi tiruan dapat diteruskan melalui konstruktor yang berlebihan.
Di ujung jalan, begitu upaya mendapatkan pendukung, proyek dapat diperbarui untuk menerapkan wadah IOC dan konstruktor akan berada di luar sana yang mengambil abstraksi.
I consider it a challenge to decouple code and introduce an IOC container into a legacy application
tentu saja itu. Ini bernama utang teknis. Inilah sebabnya mengapa sebelum ada perombakan besar, lebih disukai refaktor kecil dan kontinu. Mengurangi kelemahan desain utama dan pindah ke IoC akan lebih sulit.Jawaban:
Kritik tentang Poor Man's Injection di NerdDinner kurang berkaitan dengan apakah Anda menggunakan Container DI atau tidak daripada mengatur kelas Anda dengan benar.
Dalam artikel itu, mereka menyatakan itu
tidak benar karena, sementara konstruktor pertama memang menyediakan mekanisme mundur yang nyaman untuk membangun kelas, itu juga menciptakan ketergantungan yang terikat erat
DinnerRepository
.Obat yang benar tentu saja bukan, seperti yang disarankan Los Techies, untuk menambahkan wadah DI, melainkan untuk menghapus konstruktor yang menyinggung.
Kelas yang tersisa sekarang memiliki dependensi yang terbalik dengan benar. Anda sekarang bebas untuk menyuntikkan dependensi tersebut sesuka Anda.
sumber
XService
parameter meneruskan keXRepository
dan mengembalikan apa yang didapatnya kembali tidak terlalu berguna bagi siapa pun dan juga tidak memberi Anda banyak hal dalam ekstensibilitas. Tulis pengujian unit Anda untuk menguji perilaku yang bermakna dan pastikan komponen Anda tidak terlalu sempit sehingga Anda benar-benar memindahkan semua logika Anda ke root komposisi Anda.Anda membuat asumsi yang salah di sini tentang apa "DI orang miskin".
Menciptakan kelas yang memiliki konstruktor "pintas" yang masih membuat kopling bukanlah DIM orang miskin.
Tidak menggunakan wadah, dan membuat semua suntikan dan pemetaan secara manual, adalah DI orang miskin.
Istilah "DIA orang miskin" terdengar seperti hal yang buruk untuk dilakukan. Untuk alasan itu, istilah "DI murni" dianjurkan akhir-akhir ini karena kedengarannya lebih positif dan sebenarnya lebih akurat menggambarkan prosesnya.
Tidak hanya itu benar-benar baik untuk menggunakan DI orang miskin / murni untuk memperkenalkan DI ke dalam aplikasi yang sudah ada, itu juga merupakan cara yang valid untuk menggunakan DI untuk banyak aplikasi baru. Dan seperti yang Anda katakan, setiap orang harus menggunakan DI murni pada setidaknya satu proyek untuk benar-benar memahami cara kerja DI, sebelum menangani tanggung jawab atas "keajaiban" wadah IoC.
sumber
Pergeseran paragid di tim legacy / basis kode sangat berisiko:
Menggunakan Framework DI sebagai palu untuk menghancurkan semua kuku hanya akan membuat kode warisan lebih buruk daripada yang lebih baik dalam semua kasus. Ini juga sangat berisiko secara pribadi.
Bahkan dalam kasus-kasus yang paling terbatas seperti hanya sehingga dapat digunakan dalam kasus uji hanya akan membuat kasus-kasus uji "non-standar" dan "asing" kode yang paling baik hanya akan ditandai
@Ignore
ketika mereka rusak atau lebih buruk lagi terus-menerus dikeluhkan programmer lama dengan pengaruh paling kuat dengan manajemen dan ditulis ulang "dengan benar" dengan semua "waktu yang terbuang untuk tes unit" ini menyalahkan Anda.Ketergantungan Injeksi adalah solusi mencari masalah.
Injeksi ketergantungan hanya berguna dalam dosis kecil untuk rentang yang sangat sempit:
Hal-hal yang banyak berubah atau memiliki banyak implementasi alternatif yang terikat secara statis.
Sistem plugin yang memiliki plugin yang dapat dikonfigurasi yang dapat didefinisikan dalam kode konfigurasi dalam kerangka kerja Anda dan ditemukan secara otomatis saat startup dan dimuat / dimuat secara dinamis saat program sedang berjalan.
sumber