Kata-kata invert
atau control
tidak digunakan sama sekali untuk mendefinisikan Pembalikan Kontrol dalam definisi yang saya lihat.
Definisi
Wikipedia
inversion of control (IoC) adalah teknik pemrograman, diekspresikan di sini dalam hal pemrograman berorientasi objek, di mana kopling objek terikat pada saat dijalankan oleh objek assembler dan biasanya tidak dikenal pada waktu kompilasi menggunakan analisis statis. ~ http://en.wikipedia.org/wiki/Inversion_of_control
Martin Fowler
Inversion of Control adalah pola umum dalam komunitas Jawa yang membantu menyambungkan kontainer ringan atau merakit komponen dari berbagai proyek ke dalam aplikasi yang kohesif. ~ berdasarkan http://www.martinfowler.com/articles/injection.html (ditulis ulang)
Jadi mengapa Inversion of Control bernama Inversion of Control? Kontrol apa yang dibalik dan oleh apa? Apakah ada cara untuk mendefinisikan Inversion of Control menggunakan terminologi: invert and control ?
sumber
Jawaban:
Katakanlah Anda memiliki semacam kelas "repositori", dan repositori itu bertanggung jawab untuk memberikan data kepada Anda dari sumber data.
Repositori dapat membuat koneksi ke sumber data dengan sendirinya. Tetapi bagaimana jika itu memungkinkan Anda untuk mengirim koneksi ke sumber data melalui konstruktor repositori?
Dengan mengizinkan pemanggil menyediakan koneksi, Anda telah memisahkan ketergantungan koneksi sumber data dari kelas repositori, yang memungkinkan sumber data apa pun bekerja dengan repositori, bukan hanya yang ditentukan repositori.
Anda memiliki kontrol terbalik dengan menyerahkan tanggung jawab untuk membuat koneksi dari kelas repositori ke pemanggil.
Martin Fowler menyarankan menggunakan istilah "Injeksi Ketergantungan" untuk menggambarkan jenis Pembalikan Kontrol ini, karena Pembalikan Kontrol sebagai konsep dapat diterapkan secara lebih luas daripada hanya menyuntikkan dependensi dalam metode konstruktor.
sumber
Saya tidak berpikir ada yang bisa menjelaskannya lebih baik daripada Martin Fowler, lebih jauh ke bawah artikel yang Anda tautkan .
Ketika dia menjelaskan dalam paragraf di atas bahwa, ini tidak persis sama dengan alasan istilah "Pembalikan Kontrol" berasal.
Itulah sebabnya ia melanjutkan dengan istilah "Injeksi Ketergantungan" untuk mencakup implementasi khusus Pembalikan Kontrol ini.
Untuk sedikit memperjelas: Pembalikan Kontrol berarti segala sesuatu yang membalikkan struktur kontrol suatu program dari desain prosedural klasik.
Di masa lalu, contoh utama dari ini adalah membiarkan kerangka menangani komunikasi antara UI dan kode Anda, daripada meninggalkan kode Anda untuk menghasilkan UI secara langsung.
Dalam waktu yang lebih baru (ketika kerangka kerja seperti itu cukup banyak mendominasi, jadi pertanyaannya tidak lagi relevan), contohnya adalah membalikkan kontrol atas instantiasi objek.
Fowler, dan yang lainnya, memutuskan bahwa istilah Inversion of Control mencakup terlalu banyak teknik dan kami membutuhkan istilah baru untuk contoh spesifik objek Instansiasi (Injeksi Ketergantungan) tetapi, pada saat perjanjian telah dibuat, frasa "IoC Container "telah lepas landas.
Ini sangat mengotori air, karena wadah IoC adalah jenis Injeksi Ketergantungan khusus, tetapi Injeksi Ketergantungan adalah jenis Pembalikan Kontrol tertentu. Inilah sebabnya mengapa Anda mendapatkan jawaban yang membingungkan, di mana pun Anda melihat.
sumber
Inilah program aliran kontrol "biasa" yang biasanya diikuti:
Pembalikan Kontrol "membalikkan" aliran kontrol itu, yang berarti ia membalikkan kepalanya:
Baris terakhir itu yang penting. Alih-alih memanggil orang lain ketika Anda menginginkannya, orang lain memanggil Anda ketika mereka menginginkannya.
Contoh umum dari ini adalah kerangka kerja web seperti Rails. Anda mendefinisikan Pengontrol, tetapi Anda tidak benar-benar memutuskan kapan mereka dipanggil. Rails memanggil mereka ketika memutuskan ada kebutuhan.
sumber
Ini tentang siapa yang mengendalikan Instansiasi dependensi.
Secara tradisional, ketika suatu kelas / metode perlu menggunakan kelas lain (dependensi), ia dipakai oleh kelas / metode secara langsung. Ia mengontrol dependensinya.
Dengan Inversion of Control (IoC), penelepon meneruskan dependensi, oleh karena itu instantiates dependensi. Penelepon mengontrol dependensi.
Kontrol di mana dependensi adalah instantiated telah terbalik - alih-alih berada di "bawah", di mana kode yang membutuhkannya, itu dipakai di "atas", di mana kode yang membutuhkannya dipanggil.
sumber
Biasanya panggilan kode tingkat lebih tinggi (yaitu, kontrol) kode tingkat lebih rendah. Fungsi panggilan utama () (), fungsi () panggilan libraryFunction ().
Itu bisa dibalik, jadi fungsi pustaka tingkat rendah di bagian bawah memanggil fungsi tingkat lebih tinggi.
Kenapa kamu ingin melakukan itu? Middleware. Terkadang Anda ingin mengontrol level atas dan level bawah, tetapi ada banyak pekerjaan di tengah yang tidak ingin Anda lakukan. Mengambil pelaksanaan quicksort di C stdlib . Anda memanggil quicksort di tingkat atas. Anda memberikan qsort () pointer fungsi ke fungsi Anda sendiri yang mengimplementasikan komparator pada apa pun yang Anda suka. Ketika qsort () dipanggil, ia memanggil fungsi pembanding ini. qsort () mengendalikan / memanggil / mengarahkan fungsi tingkat tinggi Anda.
sumber
Berikut ini ikhtisar sederhana:
Di masa lalu, kontrol dimiliki oleh aplikasi pertama dan pengguna kedua. Jika aplikasi membutuhkan sesuatu dari pengguna, itu akan berhenti dan bertanya dan kemudian beralih ke tugas berikutnya. Interaksi pengguna sebagian besar menyediakan data daripada mengontrol apa yang dilakukan aplikasi selanjutnya. Ini agak asing bagi kita saat ini karena kita jarang melihat jenis perilaku ini.
Jika kami beralih itu dan memberikan kontrol utama pengguna, maka kami telah membalikkan kontrol. Ini berarti bahwa alih-alih pengguna menunggu aplikasi untuk memberikannya sesuatu untuk dilakukan, aplikasi duduk menunggu pengguna untuk memberikannya sesuatu untuk dilakukan. GUI adalah contoh yang bagus untuk ini dan hampir semua hal dengan loop acara memiliki kontrol terbalik.
Perhatikan bahwa contoh saya ada di tingkat atas dan konsep inversi kontrol ini dapat diabstraksikan ke berbagai lapisan kontrol dalam aplikasi (mis. Injeksi ketergantungan). Inilah sebabnya mengapa sangat sulit untuk mendapatkan jawaban langsung.
sumber
Mari kita coba memahaminya melalui dua contoh.
Contoh 1
Pada hari-hari sebelumnya, aplikasi yang digunakan untuk membuat perintah meminta untuk menerima input pengguna satu demi satu. Saat ini, kerangka kerja UI membuat berbagai elemen UI, mengulang berbagai peristiwa elemen UI tersebut (seperti mouse hover, klik dll.) Dan program pengguna / utama menyediakan pengait (misalnya pendengar acara UI di Jawa) untuk mendengarkan acara tersebut. Jadi aliran elemen utama UI "kontrol" dipindahkan dari program pengguna ke kerangka UI. Pada hari-hari sebelumnya, itu dalam program pengguna.
Contoh 2
Pertimbangkan kelas di
CustomerProcessor
bawah ini:Jika saya ingin
processCustomer()
mandiri dari implementasi apa pungetAllCusts()
, tidak hanya dari yang disediakan olehSqlCustRepo
, saya akan perlu menyingkirkan garis:SqlCustRepo custRepo = new SqlCustRepo()
dan menggantinya dengan sesuatu yang lebih umum, mampu menerima beragam jenis implementasi, sehinggaprocessCustomers()
hanya akan bekerja untuk implementasi yang disediakan. Kode di atas (instantiating class yang diperlukanSqlCustRepo
oleh logika program utama) adalah cara tradisional dan tidak mencapai tujuan decouplingprocessCustomers()
dari implementasigetAllCusts()
. Dalam inversi kontrol, wadah instantiates kelas implementasi yang diperlukan (seperti yang ditentukan oleh, katakanlah konfigurasi xml), menyuntikkannya dalam logika program utama yang akan terikat sesuai kait yang ditentukan (misalnya dengan@Autowired
penjelasan ataugetBean()
metode dalam kerangka kerja pegas).Mari kita lihat bagaimana ini bisa dilakukan. Pertimbangkan kode di bawah ini.
Config.xml
CustRepo.java
JsonCustRepo.java
App.java
Kita juga bisa punya
dan
dan kita tidak perlu mengubah App.java.
Di atas wadah (yang merupakan kerangka pegas) memiliki tanggung jawab untuk memindai file xml, membuat instance kacang jenis tertentu dan menyuntikkannya ke dalam program pengguna. Program pengguna tidak memiliki kontrol pada kelas mana yang dipakai.
PS: IoC adalah konsep umum dan dicapai dengan banyak cara. Contoh di atas mencapainya dengan injeksi ketergantungan.
Referensi: Artikel Martin Fowler .
sumber