Menurut makalah yang ditulis oleh Martin Fowler , inversi kontrol adalah prinsip di mana aliran kontrol suatu program terbalik: alih-alih programmer mengendalikan aliran program, sumber eksternal (kerangka kerja, layanan, komponen lain) mengambil kendali Itu. Sepertinya kita memasukkan sesuatu ke sesuatu yang lain. Dia menyebutkan contoh tentang EJB 2.0:
Misalnya antarmuka Session Bean mendefinisikan ejbRemove, ejbPassivate (disimpan ke penyimpanan sekunder), dan ejbActivate (dipulihkan dari keadaan pasif). Anda tidak bisa mengendalikan ketika metode ini dipanggil, hanya apa yang mereka lakukan. Wadah itu memanggil kami, kami tidak menyebutnya.
Ini mengarah ke perbedaan antara kerangka kerja dan perpustakaan:
Inversion of Control adalah bagian penting dari apa yang membuat kerangka kerja berbeda dengan perpustakaan. Pustaka pada dasarnya adalah serangkaian fungsi yang dapat Anda panggil, hari ini biasanya diatur ke dalam kelas. Setiap panggilan berfungsi dan mengembalikan kontrol ke klien.
Saya pikir, sudut pandang bahwa DI adalah IOC, berarti ketergantungan suatu objek terbalik: alih-alih mengendalikan dependensinya sendiri, siklus hidup ... sesuatu yang lain melakukannya untuk Anda. Tapi, seperti yang Anda katakan tentang DI dengan tangan, DI belum tentu IOC. Kami masih bisa memiliki DI dan tidak ada IOC.
Namun, dalam makalah ini (dari pococapsule, Kerangka kerja IOC lain untuk C / C ++), ini menunjukkan bahwa karena IOC dan DI, wadah IOC dan kerangka kerja DI jauh lebih unggul daripada J2EE, karena J2EE mencampur kode kerangka kerja ke dalam komponen , dengan demikian tidak membuatnya menjadi Plain Old Java / C ++ Object (POJO / POCO).
Pembalikan Kontain Kontrol selain dari pola Injeksi Ketergantungan (Archive link)
Bacaan tambahan untuk memahami apa masalahnya dengan Kerangka Pengembangan Berbasis Komponen yang lama, yang mengarah ke makalah kedua di atas: Mengapa dan bagaimana dengan Inversion of Control (tautan Arsip)
Pertanyaan Saya : Apa sebenarnya IOC dan DI? Saya bingung. Berdasarkan pococapsule, IOC adalah sesuatu yang lebih penting daripada hanya inversi kontrol antara objek atau programmer dan kerangka kerja.
Jawaban:
IoC adalah makna istilah umum daripada meminta aplikasi memanggil metode dalam suatu framework, framework memanggil implementasi yang disediakan oleh aplikasi.
DI adalah bentuk IoC, di mana implementasi dilewatkan ke objek melalui konstruktor / setter / layanan pencarian, yang objek akan 'bergantung' untuk berperilaku dengan benar.
IoC tanpa menggunakan DI , misalnya akan menjadi pola Templat karena implementasinya hanya dapat diubah melalui subklasifikasi.
Kerangka DI dirancang untuk memanfaatkan DI dan dapat mendefinisikan antarmuka (atau Anotasi di Jawa) agar mudah dilewatkan dalam implementasi.
IoC Containers adalah kerangka kerja DI yang dapat bekerja di luar bahasa pemrograman. Di beberapa Anda dapat mengkonfigurasi implementasi yang digunakan dalam file metadata (misalnya XML) yang kurang invasif. Dengan beberapa Anda dapat melakukan IoC yang biasanya tidak mungkin seperti menyuntikkan implementasi di pointcuts .
Lihat juga artikel Martin Fowler ini .
sumber
Singkatnya, IoC adalah istilah yang jauh lebih luas yang mencakup, tetapi tidak terbatas pada, DI
Istilah Inversion of Control (IoC) awalnya berarti segala jenis gaya pemrograman di mana kerangka kerja keseluruhan atau run-time mengontrol aliran program
Sebelum DI memiliki nama, orang-orang mulai merujuk pada kerangka kerja yang mengelola Ketergantungan sebagai Pembalikan Wadah Kontrol, dan segera, makna IoC perlahan-lahan melayang ke makna tertentu: Pembalikan Kontrol atas Ketergantungan.
Inversion of Control (IoC) berarti bahwa objek tidak membuat objek lain di mana mereka bergantung untuk melakukan pekerjaan mereka. Sebagai gantinya, mereka mendapatkan objek yang mereka butuhkan dari sumber luar (misalnya, file konfigurasi xml).
Dependency Injection (DI) berarti bahwa ini dilakukan tanpa intervensi objek, biasanya oleh komponen kerangka kerja yang melewati parameter konstruktor dan mengatur properti.
sumber
sumber
IOC ( Saya nVersi o f C ontrol): - Ini adalah istilah generik dan diimplementasikan dalam beberapa cara (peristiwa, delegasi dll).
DI ( D ependency I njection): - DI adalah sub-jenis IOC dan dilaksanakan oleh injeksi konstruktor, injeksi setter atau Antarmuka injeksi .
Tapi, Spring hanya mendukung dua jenis berikut:
NullPointerException: bean does not exist
. Injeksi konstruktor adalah praktik terbaik untuk menyuntikkan dependensi.sumber
DI adalah subset dari IoC
Berikut adalah beberapa teknik lain untuk mencapai IOC .
sumber
IOC (Inversion Of Control) : Memberi kontrol ke wadah untuk mendapatkan instance objek disebut Inversion of Control, berarti alih-alih Anda membuat objek menggunakan operator baru, biarkan wadah melakukan itu untuk Anda.
DI (Dependency Injection) : Cara menyuntikkan properti ke suatu objek disebut Dependency Injection .
Kami memiliki tiga jenis Injeksi Ketergantungan :
Spring hanya mendukung Constructor Injection dan Setter / Getter Injection .
sumber
Karena semua jawaban menekankan pada teori saya ingin menunjukkan dengan contoh pendekatan pertama:
Misalkan kita sedang membangun aplikasi yang berisi fitur untuk mengirim pesan konfirmasi SMS setelah pesanan telah dikirim. Kami akan memiliki dua kelas, satu bertanggung jawab untuk mengirim SMS (Layanan SMS), dan lainnya bertanggung jawab untuk mengambil input pengguna (UIHandler), kode kami akan terlihat seperti di bawah ini:
Implementasi di atas tidak salah tetapi ada beberapa masalah:
-) Misalkan pada lingkungan pengembangan, Anda ingin menyimpan SMS yang dikirim ke file teks daripada menggunakan SMS gateway, untuk mencapai ini; kami pada akhirnya akan mengubah implementasi konkret (SMSService) dengan implementasi lain, kami kehilangan fleksibilitas dan dipaksa untuk menulis ulang kode dalam kasus ini.
-) Kita akan berakhir dengan memadukan tanggung jawab kelas, (UIHandler) kita seharusnya tidak pernah tahu tentang implementasi konkret dari (Layanan SMS), ini harus dilakukan di luar kelas menggunakan "Antarmuka". Ketika ini diterapkan, itu akan memberi kita kemampuan untuk mengubah perilaku sistem dengan menukar (SMSService) yang digunakan dengan layanan tiruan lain yang mengimplementasikan antarmuka yang sama, layanan ini akan menyimpan SMS ke file teks daripada mengirim ke nomor ponsel.
Untuk memperbaiki masalah di atas kami menggunakan Antarmuka yang akan diimplementasikan oleh (SMSService) kami dan yang baru (MockSMSService), pada dasarnya Antarmuka baru (ISMSService) akan memaparkan perilaku yang sama dari kedua layanan seperti kode di bawah ini:
Kemudian kami akan mengubah implementasi (SMSService) kami untuk mengimplementasikan antarmuka (ISMSService):
Sekarang kita akan dapat membuat layanan mock up baru (MockSMSService) dengan implementasi yang sama sekali berbeda menggunakan antarmuka yang sama:
Pada titik ini, kita dapat mengubah kode di (UIHandler) untuk menggunakan implementasi konkret dari layanan (MockSMSService) dengan mudah seperti di bawah ini:
Kami telah mencapai banyak fleksibilitas dan menerapkan pemisahan masalah dalam kode kami, tetapi kami masih perlu melakukan perubahan pada basis kode untuk beralih di antara dua Layanan SMS. Jadi kita perlu menerapkan Injeksi Ketergantungan .
Untuk mencapai hal ini, kita perlu mengimplementasikan perubahan pada konstruktor kelas (UIHandler) kita untuk meneruskan dependensi, dengan melakukan ini, kode yang menggunakan (UIHandler) dapat menentukan implementasi konkret dari (Layanan ISMS) yang akan digunakan:
Sekarang bentuk UI yang akan berbicara dengan kelas (UIHandler) bertanggung jawab untuk melewati implementasi antarmuka mana (ISMSService) untuk dikonsumsi. Ini berarti kami telah membalikkan kontrol, (UIHandler) tidak lagi bertanggung jawab untuk memutuskan implementasi yang akan digunakan, kode panggilan tidak. Kami telah menerapkan prinsip Inversion of Control yang DI adalah salah satu jenisnya.
Kode bentuk UI akan seperti di bawah ini:
sumber
Tetapi dokumentasi musim semi mengatakan mereka sama.
http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-introduction
Di baris pertama " IoC juga dikenal sebagai injeksi ketergantungan (DI) ".
sumber
IoC - Pembalikan kontrol adalah istilah umum, tidak tergantung pada bahasa, sebenarnya bukan menciptakan objek tetapi menjelaskan di mana objek mode dibuat.
DI - Ketergantungan Injeksi adalah istilah konkret, di mana kami menyediakan dependensi objek pada saat dijalankan dengan menggunakan teknik injeksi yang berbeda yaitu. Setter, Injeksi Konstruktor atau Injeksi Antarmuka.
sumber
Inversion of control adalah paradigma desain dengan tujuan memberikan lebih banyak kontrol ke komponen yang ditargetkan dari aplikasi Anda, yang menyelesaikan pekerjaan.
Ketergantungan injeksi adalah pola yang digunakan untuk membuat instance objek yang bergantung pada objek lain tanpa mengetahui pada waktu kompilasi kelas mana yang akan digunakan untuk menyediakan fungsionalitas itu.
Ada beberapa teknik dasar untuk menerapkan inversi kontrol. Ini adalah:
1). Suntikan konstruktor
2). Suntikan setter
3). Injeksi antarmuka
sumber
DI dan IOC adalah dua pola desain yang terutama berfokus pada penyediaan kopling longgar antara komponen , atau hanya cara di mana kita memisahkan hubungan ketergantungan konvensional antara objek sehingga objek tidak saling ketat.
Dengan contoh-contoh berikut, saya mencoba menjelaskan kedua konsep ini.
Sebelumnya kami menulis kode seperti ini
Dengan injeksi Dependency, injector dependensi akan menangani instantiasi objek
Proses pemberian kontrol di atas kepada orang lain (misalnya wadah) untuk instantiasi dan injeksi dapat disebut sebagai Inversion of Control dan proses di mana wadah IOC menyuntikkan dependensi bagi kita dapat disebut sebagai injeksi dependensi.
IOC adalah prinsip di mana aliran kontrol suatu program terbalik: alih-alih programmer mengontrol aliran suatu program , program mengontrol aliran dengan mengurangi overhead ke programmer . Dan proses yang digunakan oleh program untuk menyuntikkan ketergantungan disebut sebagai DI
Dua konsep bekerja bersama memberi kita cara untuk menulis kode yang jauh lebih fleksibel, dapat digunakan kembali, dan dienkapsulasi, yang menjadikannya sebagai konsep penting dalam merancang solusi berorientasi objek.
Juga merekomendasikan untuk membaca.
Apa itu injeksi ketergantungan?
Anda juga dapat memeriksa salah satu jawaban serupa saya di sini
Perbedaan antara Pembalikan Kontrol & Ketergantungan Injeksi
sumber
Inversion of Control adalah prinsip desain generik arsitektur perangkat lunak yang membantu menciptakan kerangka kerja perangkat lunak modular yang dapat digunakan kembali dan mudah dipelihara.
Ini adalah prinsip desain di mana Flow of Control "diterima" dari perpustakaan yang ditulis secara umum atau kode yang dapat digunakan kembali.
Untuk memahaminya dengan lebih baik, mari kita lihat bagaimana kita menggunakan kode pada hari-hari awal pengkodean kita. Dalam bahasa prosedural / tradisional, logika bisnis umumnya mengontrol aliran aplikasi dan "Memanggil" kode / fungsi umum atau yang dapat digunakan kembali. Misalnya, dalam aplikasi Konsol sederhana, aliran kendali saya dikendalikan oleh instruksi program saya, yang dapat mencakup panggilan ke beberapa fungsi umum yang dapat digunakan kembali.
Dalam Kontras, dengan IoC, Kerangka adalah kode yang dapat digunakan kembali yang "Memanggil" logika bisnis.
Misalnya, dalam sistem berbasis windows, kerangka kerja sudah tersedia untuk membuat elemen UI seperti tombol, menu, jendela dan kotak dialog. Ketika saya menulis logika bisnis dari aplikasi saya, itu akan menjadi peristiwa kerangka kerja yang akan memanggil kode logika bisnis saya (ketika suatu peristiwa dipecat) dan BUKAN sebaliknya.
Meskipun, kode kerangka kerja ini tidak mengetahui logika bisnis saya, masih akan tahu cara memanggil kode saya. Ini dicapai dengan menggunakan acara / delegasi, panggilan balik dll. Di sini Kontrol aliran adalah "Terbalik".
Jadi, alih-alih bergantung pada aliran kontrol pada objek yang terikat secara statis, aliran tersebut bergantung pada grafik objek keseluruhan dan hubungan antara objek yang berbeda.
Dependency Injection adalah pola desain yang menerapkan prinsip IoC untuk menyelesaikan dependensi objek.
Dengan kata sederhana, ketika Anda mencoba menulis kode, Anda akan membuat dan menggunakan kelas yang berbeda. Satu kelas (Kelas A) dapat menggunakan kelas lain (Kelas B dan / atau D). Jadi, Kelas B dan D adalah dependensi kelas A.
Analogi sederhana akan menjadi Mobil kelas. Mobil mungkin bergantung pada kelas lain seperti Engine, Ban, dan lainnya.
Ketergantungan Injeksi menunjukkan bahwa alih-alih kelas Ketergantungan (Kelas Mobil di sini) menciptakan dependensinya (Kelas Mesin dan kelas Ban), kelas harus disuntikkan dengan contoh konkret ketergantungan.
Mari kita pahami dengan contoh yang lebih praktis. Pertimbangkan bahwa Anda sedang menulis TextEditor Anda sendiri. Antara lain, Anda bisa memiliki pemeriksa ejaan yang menyediakan fasilitas kepada pengguna untuk memeriksa kesalahan ketik dalam teksnya. Implementasi sederhana dari kode semacam itu dapat:
Pada pandangan pertama, semua tampak kemerahan. Pengguna akan menulis beberapa teks. Pengembang akan menangkap teks dan memanggil fungsi CheckSpellings dan akan menemukan daftar Typos yang akan ditampilkan kepada Pengguna.
Segalanya tampak bekerja dengan baik sampai suatu hari ketika seorang pengguna mulai menulis bahasa Prancis di Editor.
Untuk memberikan dukungan untuk lebih banyak bahasa, kita perlu memiliki lebih banyak Pemeriksa Ejaan. Mungkin Perancis, Jerman, Spanyol dll.
Di sini, kami telah membuat kode yang dipasangkan dengan SpellChecker "Bahasa Inggris" yang dipasangkan dengan kelas TextEditor kami, yang berarti kelas TextEditor kami bergantung pada EnglishSpellChecker atau dengan kata lain EnglishSpellCheker adalah ketergantungan untuk TextEditor. Kami harus menghapus ketergantungan ini. Lebih lanjut, Editor Teks kami membutuhkan cara untuk menyimpan referensi konkret dari Pemeriksa Ejaan apa pun berdasarkan kebijaksanaan pengembang pada waktu berjalan.
Jadi, seperti yang kita lihat dalam pengenalan DI, ini menunjukkan bahwa kelas harus disuntikkan dengan dependensinya. Jadi, itu harus menjadi tanggung jawab kode panggilan untuk menyuntikkan semua dependensi ke kelas / kode yang dipanggil. Jadi kami dapat menyusun kembali kode kami sebagai
Dalam contoh kami, kelas TextEditor harus menerima contoh konkret dari tipe ISpellChecker.
Sekarang, ketergantungan dapat disuntikkan di Konstruktor, Properti Publik atau metode.
Mari kita coba mengubah kelas kita menggunakan Constructor DI. Kelas TextEditor yang diubah akan terlihat seperti:
Sehingga kode panggilan, saat membuat editor teks dapat menyuntikkan SpellChecker Type yang sesuai ke instance dari TextEditor.
Anda dapat membaca artikel selengkapnya di sini
sumber
IOC (Inversion Of Control): Memberi kendali ke wadah untuk mendapatkan instance objek disebut Inversion of Control. Itu berarti alih-alih Anda membuat objek menggunakan operator baru , biarkan wadah melakukannya untuk Anda.
DI (Dependency Injection): Melewati parameter yang diperlukan (properti) dari XML ke objek (dalam POJO CLASS) disebut Dependency injection.
sumber
IOC menunjukkan bahwa kelas eksternal mengelola kelas aplikasi, dan kelas eksternal berarti wadah mengelola ketergantungan antara kelas aplikasi. konsep dasar IOC adalah programmer tidak perlu membuat objek Anda tetapi menjelaskan bagaimana mereka harus dibuat.
Tugas utama yang dilakukan oleh wadah IoC adalah: untuk membuat instance kelas aplikasi. untuk mengkonfigurasi objek. untuk merakit dependensi antara objek.
DI adalah proses penyediaan dependensi suatu objek pada saat dijalankan dengan menggunakan setter injection atau injector injection.
sumber
IOC (Inversion of Control) pada dasarnya merancang konsep pola menghilangkan ketergantungan dan memisahkan mereka untuk membuat aliran non-linear, dan membiarkan wadah / atau entitas lain mengelola penyediaan dependensi. Ini sebenarnya mengikuti kepala sekolah Hollywood, “Jangan panggil kami, kami akan memanggilmu”. Jadi rangkum perbedaannya.
Inversi kontrol: - Ini adalah istilah umum untuk memisahkan dependensi dan mendelegasikan provisi mereka, dan ini dapat diimplementasikan dalam beberapa cara (acara, delegasi dll).
Ketergantungan injeksi: - DI adalah subtipe dari IOC dan diimplementasikan dengan injeksi konstruktor, injeksi setter atau injeksi metode.
Artikel berikut menggambarkannya dengan sangat rapi.
https://www.codeproject.com/Articles/592372/Dependency-Injection-DI-vs-Inversion-of-Control-IO
sumber
Saya pikir ide itu dapat didemonstrasikan dengan jelas tanpa masuk ke gulma Berorientasi Objek, yang tampaknya mengacaukan ide.
Jika Anda memiringkan kepala dan menyipitkan mata, Anda akan melihat bahwa DI adalah implementasi khusus IoC dengan masalah khusus. Alih-alih menyuntikkan model dan perilaku ke dalam kerangka kerja aplikasi atau operasi tingkat tinggi, Anda menyuntikkan variabel ke dalam fungsi atau objek.
sumber
Mari kita mulai dengan D SOLID dan lihat DI dan IoC dari buku Scott Millett "Professional ASP.NET Design Patterns":
Millett, C (2010). Pola Desain ASP.NET Profesional. Penerbitan Wiley. 7-8.
sumber
// ICO, DI, 10 tahun yang lalu, begini caranya:
Sekarang dengan Spring 3,4 atau terbaru seperti di bawah ini
Secara keseluruhan kontrol terbalik dari konsep lama kode digabungkan ke kerangka kerja seperti Spring yang membuat objek tersedia. Jadi itulah IOC sejauh yang saya tahu dan injeksi Ketergantungan seperti yang Anda ketahui saat kami menyuntikkan objek dependen ke objek lain menggunakan Konstruktor atau setter. Suntikan pada dasarnya berarti meneruskannya sebagai argumen. Pada musim semi kita memiliki konfigurasi berbasis XML & anotasi di mana kita mendefinisikan objek bean dan meneruskan objek dependen dengan gaya injeksi Constructor atau setter.
sumber
Saya menemukan contoh terbaik di Dzone.com yang sangat membantu untuk memahami perbedaan nyata antara IOC dan DI
Baca artikel lengkap IOC dan Baca artikel Lengkap DI
sumber
1) DI is Child-> obj tergantung pada parent-obj. Ketergantungan kata kerja itu penting. 2) IOC adalah Child-> obj tampil di bawah platform. di mana platform bisa menjadi sekolah, perguruan tinggi, kelas dansa. Performa di sini adalah aktivitas dengan implikasi berbeda di bawah penyedia platform apa pun.
contoh praktis: `
`
-AB
sumber
Adapun pertanyaan ini, saya akan mengatakan wiki telah memberikan penjelasan yang terperinci dan mudah dipahami. Saya hanya akan mengutip yang paling signifikan di sini.
Implementasi IoC
Adapun Injeksi Ketergantungan
sumber
Konsep IoC pada awalnya terdengar selama era pemrograman prosedural. Oleh karena itu dari konteks historis, IoC berbicara tentang inversi kepemilikan aliran kendali, yaitu siapa yang memiliki tanggung jawab untuk menjalankan fungsi dalam urutan yang diinginkan - apakah itu fungsi itu sendiri atau haruskah Anda membalikkannya ke entitas eksternal.
Namun begitu OOP muncul, orang-orang mulai berbicara tentang IoC dalam konteks OOP di mana aplikasi berkaitan dengan pembuatan objek dan hubungan mereka juga, terlepas dari aliran kontrol. Aplikasi seperti itu ingin membalikkan kepemilikan objek-penciptaan (bukan kontrol-aliran) dan membutuhkan wadah yang bertanggung jawab untuk pembuatan objek, siklus hidup objek & menyuntikkan dependensi objek aplikasi sehingga menghilangkan objek aplikasi dari membuat objek beton lainnya.
Dalam hal ini DI tidak sama dengan Io C , karena ini bukan tentang kontrol-aliran, namun itu semacam Io * , yaitu Pembalikan kepemilikan atas penciptaan objek.
Apa yang salah dengan cara saya menjelaskan DI dan IOC?
sumber
IoC alias Inversion of Control mengacu pada kontrol menciptakan instance yang dilakukan oleh wadah Spring. Kontrol untuk membuat dan membangun objek diurus oleh wadah. Wadah menciptakan objek dan menyuntikkannya ke dalam aplikasi kita.
sumber