Saya sekarang dihadapkan dengan mengintegrasikan wadah inversi kontrol (IoC) ke dalam aplikasi yang sudah ada, dan saya sedang mencari beberapa rekomendasi tentang cara yang paling mudah dicapai dengan tujuan akhir untuk mengurangi kopling, sehingga meningkatkan testabilitas. Meskipun saya umumnya tidak akan mengklasifikasikan sebagian besar kelas sebagai objek dewa , masing-masing memiliki terlalu banyak tanggung jawab dan ketergantungan tersembunyi melalui statika, lajang, dan kurangnya antarmuka.
Berikut ini sedikit latar belakang beberapa tantangan yang perlu dihadapi:
- Injeksi ketergantungan jarang digunakan
- Metode statis berlimpah - baik sebagai metode pabrik dan pembantu
- Lajang cukup lazim
- Antarmuka, saat digunakan, tidak terlalu granular
- Objek sering menarik dependensi yang tidak dibutuhkan melalui kelas dasar
Maksud kami adalah bahwa lain kali kita perlu membuat perubahan di bidang tertentu, bahwa kita mencoba untuk menghilangkan ketergantungan yang, pada kenyataannya, ada tetapi tersembunyi di balik global seperti lajang dan statika.
Saya kira itu membuat wadah IoC sekunder untuk pengenalan injeksi ketergantungan, tetapi saya berharap bahwa ada serangkaian praktik dan rekomendasi yang dapat diikuti atau dipertimbangkan yang akan membantu kita keluar dari dependensi ini.
sumber
Jawaban:
Untuk melakukan sesuatu seperti ini, Anda harus bekerja dalam langkah-langkah, masing-masing tidak sepele tetapi mereka dapat dicapai. Sebelum Anda mulai, Anda harus memahami bahwa Anda tidak dapat mempercepat proses ini.
interface
untuk masing-masingnya. Antarmuka ini seharusnya hanya mendefinisikan metode yang akan digunakan bagian lain dari sistem untuk berbicara dengannya. CATATAN: Anda mungkin harus mengambil lebih dari satu pass pada ini.init()
metode servlet .Ketika Anda selesai, satu-satunya metode statis yang harus Anda miliki di sistem Anda adalah yang benar-benar berfungsi - misalnya melihat
Collections
kelas atauMath
kelas. Tidak boleh ada metode statis yang mencoba mengakses komponen lain secara langsung.Ini adalah sesuatu yang akan memakan banyak waktu, sesuai rencana. Pastikan bahwa saat Anda melakukan refactoring, Anda menjadi lebih SOLID dalam pendekatan desain Anda. Pada awalnya itu akan menyakitkan. Anda secara drastis mengubah desain aplikasi Anda secara iteratif.
sumber
Ambil Bekerja Efektif dengan Legacy Code dan ikuti sarannya. Mulailah dengan membangun pulau-pulau kode tertutup dan secara bertahap bergerak menuju aplikasi yang lebih terstruktur dengan baik. Mencoba untuk melakukan perubahan secara massal adalah resep untuk bencana.
sumber
Alasan utama untuk memperkenalkan IoC adalah decoupling modul. Masalah dengan khususnya Java adalah ikatan kuat luar biasa yang diberikan
new
operator, dikombinasikan dengan itu berarti kode panggilan tahu persis modul apa yang akan digunakan.Pabrik diperkenalkan untuk memindahkan pengetahuan ini ke tempat sentral tetapi pada akhirnya Anda masih bisa menggunakan modul-modul dalam menggunakan
new
/ singleton yang membuat hard binding, atau Anda membaca dalam file konfigurasi dan menggunakan refleksi / Class.forName yang rapuh saat refactoring .Jika Anda tidak memiliki target termodulasi maka IoC tidak akan memberi Anda apa pun.
Memperkenalkan tes Unit kemungkinan besar akan mengubah ini, karena Anda perlu mengejek modul yang tidak diuji, dan cara termudah untuk menangani ini serta modul produksi aktual dengan kode yang sama adalah dengan menggunakan kerangka kerja IoC untuk menyuntikkan yang sesuai modul.
sumber