Apa itu inversi kontrol, dan kapan saya harus menggunakannya?

Jawaban:

62

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 listmenerapkan ffungsi pada masing-masing item itu. The IteratorFungsi 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 Foomemiliki konstruktor yang memerlukan argumen tipe Boountuk melakukan beberapa tindakan.

Anda bisa membuat instance kelas Foomenggunakan kode yang mirip dengan ini:

MyContainer.Create(typeof Foo)

MyContainer- adalah Kontainer IoC , yang menangani mendapatkan instance Boodan meneruskannya ke Fookonstruktor.

Singkatnya, IoC memungkinkan Anda memisahkan program Anda menjadi bagian-bagian yang terpisah. Ini bagus karena:

  • Komponen dapat dengan mudah diuji secara independen.
  • Kompleksitas program dapat dikurangi.
  • Anda dapat mengganti komponen ke implementasi lain.

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


sumber
1
Lima tahun kemudian, tetapi masih .... Itu deskripsi yang sangat bagus. Terima kasih.
Nick Hodges
4
Tidak banyak disebutkan di mana saja tentang IoC adalah fakta bahwa kode menjadi lebih sulit dibaca. Keterbacaan adalah prioritas nomor satu jika Anda ingin menulis perangkat lunak yang hebat. Itu bahkan mengalahkan Testability. Anda dapat memisahkan kode jauh di luar kegunaannya.
Arne Evertsson
Jadi, kode yang menggunakan solusi berbasis Antarmuka untuk semua dependensinya juga didasarkan pada desain IoC?
nikel
18

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.

Kris Erickson
sumber
4

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.


sumber
3

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.

codeLes
sumber