DIP vs IoC vs DI di dunia Android

Baru-baru ini saya ditanya dalam sebuah wawancara: “Apa perbedaan antara injeksi Ketergantungan dan prinsip inversi Ketergantungan dari SOLID”. Saya tahu definisi masing-masing, tetapi saya tidak dapat menarik garis yang jelas antara konsep-konsep ini. Pada artikel ini, saya ingin menjelaskan secara singkat perbedaan antara konsep prinsip inversi ketergantungan (DIP), pembalikan kontrol (IoC) dan injeksi ketergantungan (DI) menggunakan contoh arsitektur murni dan kerangka kerja Android. Jadi ayo pergi.



Prinsip inversi ketergantungan



Definisi

A. Modul tingkat tinggi sebaiknya tidak bergantung pada modul tingkat rendah. Kedua jenis modul harus bergantung pada abstraksi.

B. Abstraksi tidak harus bergantung pada detail. Detailnya harus bergantung pada abstraksi.


Definisi pertama mencakup konsep “modul”. Ini adalah konsep yang sangat penting yang tanpanya DIP tidak dapat dipahami.



modul - satu set elemen fungsional yang saling berhubungan secara logis



Untuk menghindari kesalahpahaman, pertimbangkan definisi dengan menggunakan contoh. Katakanlah kita perlu mendapatkan daftar buku yang sudah dibaca dan menampilkannya kepada pengguna. Untuk ini kita akan menggunakan kelas BooksInteractor dan BooksRepository. Kami menempatkan masing-masing kelas ini dalam modul BI dan BR masing-masing. Modul kelas BooksInteractor bergantung pada kelas BooksRepository.







BooksInteractor'y perlu mendapatkan daftar buku dari BooksRepository. Interactor sama sekali tidak peduli bagaimana repositori menerima data ini, yang berarti bahwa dalam kasus ini, BooksInteractor adalah abstraksi untuk BooksRepository. Menurut definisi kedua, BooksInteractor (abstraction) TIDAK harus bergantung pada BooksRepository (implementasi). Di sisi lain, repositori harus mengetahui tentang modul BI. Jadi apa yang terjadi: interaksinya harus ada di dalam repositori? Tidak, untuk membalikkan dependensi, kita hanya perlu menutupi BooksRepository dengan antarmuka IBooksRepository, dan meletakkan antarmuka ini ke dalam modul kelas BooksInteractor. Sekarang mari kembali ke definisi pertama DIP dan lihat diagramnya.







Lihat, modul tingkat yang lebih tinggi (modul BI) tidak bergantung pada modul tingkat yang lebih rendah (modul BR). Dan kedua modul bergantung pada abstraksi (dari antarmuka IBooksRepository). Jika Anda telah menangkap keajaiban inversi dependensi dengan menutupi repositori dengan antarmuka, Anda memahami prinsip inversi dependensi. Selamat! Bagian tersulit yang Anda pahami. Anda dapat membaca lebih lanjut tentang DIP dalam artikel ini di Habré.



Pembalikan Kontrol



Kami mempelajari konsep "Dependency Inversion Principle". Sekarang mari beralih ke inversi lain - kontrol inversi. Konsepnya sendiri sangat luas dan dalam pemrograman dapat berarti salah satu dari tiga hal:



  1. Inversi antarmuka - pendelegasian hubungan antar modul ke antarmuka perantara. Dimana itu berlaku? Misalnya di DIP, yang kita pelajari sebelumnya.
  2. — (, DI/IOC ).
  3. — , . , , — Android . Activity Fragment, .


Dependency Injection



Injeksi dependensi adalah mekanisme untuk meneruskan dependensinya ke kelas. Anda selalu menjumpai ini saat perlu meneruskan dependensi ke kelas lain. Ada beberapa cara untuk memasukkan dependensi: melalui konstruktor (Injeksi Pembuat), melalui metode (Injeksi Metode), dan melalui properti (Injeksi Properti). Masing-masing metode ini digunakan untuk tujuannya sendiri. Tetapi di sini penting untuk dipahami bahwa Injeksi Ketergantungan hanya meneruskan ketergantungan ke konstruktor, metode, atau properti.



Mempertimbangkan kasus tepi



  • Mungkinkah DI tanpa IoC dan DIP? Ya mungkin. Kami membuat instance kelas beton A dan meneruskannya ke objek kelas B melalui konstruktor, metode, atau properti.
  • Mungkinkah DIP tanpa IoC? Tidak, DIP adalah salah satu cara untuk mengimplementasikan Pembalikan Antarmuka di IoC.
  • Apakah bisa ada DIP tanpa DI? Ya, kami dapat mengikat modul yang lebih rendah ke antarmuka. Kelas modul atas akan bekerja dengan abstraksi antarmuka, tetapi implementasi konkret kelas modul bawah akan dibuat dalam konstruktor modul atas.


Anda dapat mengetahui perbedaan antara DIP, DI dan IoC dari penulis lain di sini dan di sini .



Saya akan senang menerima komentar dan tanggapan Anda!



All Articles