Tampaknya ada banyak kebingungan tentang pola Inversion of Control (IoC). Sejumlah orang telah menyamakannya dengan Pola Strategi atau Model Komponen, tetapi perbandingan ini tidak benar-benar menangkap tentang apa itu IoC. IOC benar-benar tentang bagaimana ketergantungan diperoleh. Biarkan saya memberi Anda sebuah contoh:
class Game {
void Load() {
this.Sprite.Load(); // loads resource for drawing later
}
}
class Sprite {
void Load() {
FileReader reader = new FileReader("path/to/resource.gif");
// load image from file
}
}
Di atas jelas bahwa Sprite.Load
memiliki ketergantungan pada a FileReader
. Saat Anda ingin menguji metode ini, Anda memerlukan yang berikut ini:
- Sistem file di tempat
- File uji untuk memuat dari sistem file
- Kemampuan untuk memicu kesalahan sistem file yang umum
Dua yang pertama sudah jelas, tetapi jika Anda ingin memastikan bahwa penanganan kesalahan Anda berfungsi seperti yang diharapkan, Anda benar-benar membutuhkan # 3 juga. Dalam kedua kasus Anda berpotensi memperlambat tes Anda sedikit karena mereka sekarang harus pergi ke disk dan Anda cenderung membuat lingkungan pengujian Anda lebih rumit.
Tujuan dari IoC adalah untuk memisahkan penggunaan perilaku dari konstruksinya. Perhatikan bagaimana ini berbeda dari pola Strategi. Dengan pola Strategi, tujuannya adalah untuk merangkum sejumlah perilaku yang dapat digunakan kembali sehingga Anda dapat dengan mudah memperluasnya di masa depan; tidak ada yang bisa dikatakan tentang bagaimana strategi dibangun.
Jika kita menulis ulang Sprite.Load
metode di atas, kita mungkin akan berakhir dengan:
class Sprite {
void Load(IReader reader) {
// load image through reader
}
}
Sekarang, kami telah memisahkan konstruksi pembaca dari penggunaannya. Oleh karena itu, mungkin untuk menukar pembaca tes selama pengujian. Ini berarti bahwa lingkungan pengujian Anda tidak lagi membutuhkan sistem file, menguji file, dan dapat dengan mudah mensimulasikan peristiwa kesalahan.
Perhatikan bahwa saya melakukan dua hal dalam penulisan ulang. Saya membuat antarmuka IReader
yang merangkum beberapa perilaku - yaitu menerapkan pola Strategi. Selain itu, saya memindahkan tanggung jawab untuk menciptakan pembaca yang tepat ke kelas lain.
Mungkin kita tidak perlu nama pola baru untuk menggambarkan hal di atas. Itu menurut saya sebagai campuran dari Strategi dan pola Pabrik (untuk wadah IOC). Karena itu, saya tidak yakin dengan alasan apa orang keberatan dengan pola ini karena jelas bahwa itu memecahkan masalah nyata, dan, tentu saja, tidak jelas bagi saya apa hubungannya dengan Jawa.