Saya merancang sistem baru dan saya ingin tahu apa itu inversi kontrol (IOC), dan yang lebih penting, kapan menggunakannya.
Apakah harus diimplementasikan dengan antarmuka atau dapat dilakukan dengan kelas?
Saya merancang sistem baru dan saya ingin tahu apa itu inversi kontrol (IOC), dan yang lebih penting, kapan menggunakannya.
Apakah harus diimplementasikan dengan antarmuka atau dapat dilakukan dengan kelas?
Jawaban:
IoC (lihat Pembalikan Kontrol di Wikipedia) berlaku dalam kasus di mana komponen tidak dapat melakukan tugas sepenuhnya karena tidak memiliki beberapa informasi atau fungsi yang diperlukan.
Contoh paling sederhana dari pola IoC adalah fungsi callback di C. Misalnya Anda dapat mendeklarasikan fungsi:
void Iterator(void *list, Func* f)
Yang berulang kali list
menerapkan f
fungsi pada masing-masing item itu. The Iterator
Fungsi tidak tahu bagaimana setiap item akan diproses, Anda hanya menyediakan fungsi sebagai argumen, dan proses mereka.
Seperti yang ditunjukkan contoh sebelumnya, IoC memungkinkan Anda memisahkan program Anda menjadi komponen-komponen terpisah yang tidak saling mengenal. Salah satu versi yang paling umum dari IOC adalah dependecy Injection .
Dalam Injeksi Ketergantungan setiap komponen harus mendeklarasikan daftar dependensi yang diperlukan untuk melakukan tugasnya. Saat runtime, komponen khusus (umumnya) yang disebut IoC Container melakukan pengikatan di antara komponen-komponen ini. Mencoba memberikan nilai untuk dependensi komponen yang dipublikasikan.
Berikut ini adalah contoh dalam pseudo-code:
class Foo
{
<Require Boo>Constructor(Boo boo){ boo.DoSomething }
}
Dalam contoh ini kelas Foo
memiliki konstruktor yang memerlukan argumen tipe Boo
untuk melakukan beberapa tindakan.
Anda bisa membuat instance kelas Foo
menggunakan kode yang mirip dengan ini:
MyContainer.Create(typeof Foo)
MyContainer
- adalah Kontainer IoC , yang menangani mendapatkan instance Boo
dan meneruskannya ke Foo
konstruktor.
Singkatnya, IoC memungkinkan Anda memisahkan program Anda menjadi bagian-bagian yang terpisah. Ini bagus karena:
Namun dalam beberapa kasus, IoC dapat membuat kode lebih sulit untuk dipahami.
Jika Anda ingin melihat contoh yang baik dari penggunaan IoC di dunia nyata , lihat Blok Aplikasi UI Mircosoft Composite dan CompositeWPF
Saya harap penjelasan saya membantu Anda.
Salam,
aku
Karena saya menggali sendiri ini baru-baru ini, dan menyimpan semua bookmark, berikut ini saya temukan berharga untuk belajar tentang IOC / DI.
Martin Fowlers Artikel Asli tentang IOC / DI
Beberapa Konsep Yang Harus Diketahui Pertama
Koleksi yang luar biasa dari Tutorial IOC / DI
Buku tentang IOC / DI Dari Manning Press
Sumber dan Penjelasan tentang cara membuat IOC Anda sendiri - Karena membaca kode sumber selalu merupakan cara terbaik untuk memahami konsep.
Hai JMS, pada dasarnya IoC / DI akan memungkinkan Anda untuk menentukan implementasi yang Anda gunakan sekali, dan menyimpan salinan statis wadah Anda untuk referensi setiap kali Anda ingin referensi itu.
Wikipedia mungkin akan membantu Anda, tetapi saya ingin mereferensikan bagian kedua Anda - ya, ketergantungan injeksi dapat dilakukan untuk kelas (yaitu, setiap kali tipe kelas ini perlu diteruskan ke metode, gunakan kelas ini), tetapi lebih baik untuk gunakan antarmuka, karena dengan begitu Anda dapat mengubah versi penyedia, repositori, dll yang Anda gunakan hanya dengan mereferensikannya di pengaturan Anda.
IE, misalnya Anda memiliki antarmuka untuk membaca aliran, dan Anda memiliki implementasi XMLStreamReader dan SQLStreamReader. Kemudian Anda bisa meneruskan referensi ke antarmuka ke metode Anda dan kemudian di wadah IoC Anda kirim yang mana untuk digunakan.
Jadi, Anda dapat memiliki Daftar ReadPeople publik (pembaca IStreamReader) dan dalam pengaturan Anda untuk wadah IoC Anda katakan, setiap kali Anda mengharapkan IStreamReader gunakan SQLStreamReader.
Kemudian jika Anda berubah pikiran nanti, Anda hanya perlu mengubahnya di satu tempat (pengaturan wadah Anda) dan tidak masalah berapa banyak metode yang meminta IStreamReader, itu akan selalu mendapatkan default yang Anda kirim ke wadah Anda. menyajikan.
Katakanlah Anda memiliki validator untuk memeriksa apakah suatu bisnis valid atau tidak di sistem Anda. "BusinessValidator" Anda mungkin memiliki bidang tipe AddressValidator yang memvalidasi bagian alamat bisnis. Jika Anda ingin menguji BusinessValidator tanpa mengeksekusi kode luar (yaitu kode addressValidator) maka jika Anda telah menggunakan semacam IoC / DI dalam kerangka kerja Anda, Anda dapat dengan mudah "menyuntikkan" mock addressValidator di tempatnya dan tidak perlu khawatir tentang pengujian kode di luar lingkup kelas yang diuji.