Inversion of control (IoC) adalah prinsip desain perangkat lunak yang menekankan bahwa suatu program dapat memperoleh manfaat seperti kemampuan untuk dikonfigurasi, diuji, digunakan, dan memiliki keterikatan yang longgar jika pengelolaan alur aplikasinya dipindahkan ke bagian lain dari aplikasi tersebut.
IoC sering disebut sebagai Prinsip Hollywood, dengan slogan: “Jangan hubungi kami, kami yang akan menghubungi Anda.” Kerangka kerja IoC mengambil alih pengelolaan implementasi aplikasi dari pengembang. Ketika terjadi interaksi yang membutuhkan logika bisnis kustom, kerangka kerja IoC akan memanggil kode yang disediakan oleh pengembang. Aspek “inversi” inilah yang menjadi inti dari prinsip desain IoC.
Kerangka Kerja IoC
Penerapan IoC paling umum terlihat dalam kerangka kerja aplikasi modern seperti Spring Boot, JAX-RS, Ruby on Rails, Hibernate, dan JavaServer Faces.
Kerangka kerja IoC menangani aktivitas umum, tingkat rendah, dan yang rentan terhadap masalah. Hal ini memungkinkan pengembang untuk fokus pada logika bisnis kustom, daripada bergelut dengan tugas-tugas infrastruktur atau konfigurasi yang rumit.
Kritik terhadap IoC
Keluhan umum terhadap pola desain IoC muncul dari kebingungan mengenai apa yang termasuk IoC dan apa yang tidak.
Prinsip desain IoC hanya menegaskan bahwa manfaat mungkin dapat diperoleh jika alur suatu aplikasi dibalik.
Sebagai contoh, prinsip desain IoC tidak secara spesifik menentukan domain masalah di mana prinsip ini harus diterapkan. Tidak jelas apa yang dimaksud dengan “kendali,” dan IoC tidak menentukan ke mana kendali aplikasi sebaiknya dibalik.
Selain itu, IoC tidak menjamin manfaat tertentu dari implementasinya. Prinsip desain IoC hanya menyatakan bahwa mungkin ada manfaat jika alur suatu aplikasi dibalik.
Contoh IoC
Perubahan-perubahan berikut pada sebuah program perangkat lunak dapat secara sah disebut sebagai IoC:
penggunaan antarmuka pengguna berbasis peristiwa (event-based) daripada yang dikendalikan oleh kode prosedural;
penggunaan cache komponen bersama, seperti Spring ApplicationContext, yang bertanggung jawab untuk pembuatan dan inisialisasi objek; dan
penggunaan kerangka kerja komprehensif yang menyederhanakan detail implementasi yang rumit.
Beragamnya perubahan pengembangan yang memenuhi kriteria IoC berkontribusi pada kurangnya ketepatan istilah ini.
IoC dan Dependency Injection
Untuk menghindari kebingungan terkait istilah IoC, istilah dependency injection (DI) digunakan untuk menjelaskan kasus penggunaan IoC tertentu di mana sebuah wadah perangkat lunak menyediakan konteks aplikasi yang dapat dikonfigurasi, di mana objek-objek dapat disisipkan, dibuat, diinisialisasi, disimpan dalam cache, dan dikelola. Wadah DI populer meliputi:
Spring ApplicationContext
Pico IoC Container
Guava Guice
Container Context and Dependency Injection Jakarta EE
Dependency injection adalah salah satu bentuk IoC, tetapi hubungan ini tidak berlaku dua arah. Tidak semua wadah IoC melakukan DI.
Penyesuaian dengan Teknologi Modern:
Kerangka Kerja Tambahan:
Sertakan kerangka kerja populer lainnya seperti Micronaut dan Quarkus, yang mendukung IoC untuk pengembangan layanan cloud-native.
Peran IoC di Cloud dan Microservices:
IoC menjadi esensial dalam pengembangan berbasis mikroservis karena membantu menyederhanakan manajemen komponen yang terdistribusi.
Peningkatan pada Wadah DI:
Perbarui referensi untuk mendukung penggunaan dengan bahasa modern seperti Kotlin dan Scala, yang bekerja baik dengan Spring dan Micronaut.