Pada halaman Wikipedia tentang injeksi ketergantungan, bagian kerugian memberitahu kita ini:
Ketergantungan injeksi meningkatkan kopling dengan mengharuskan pengguna subsistem untuk menyediakan kebutuhan subsistem itu.
dengan tautan ke artikel yang menentang injeksi ketergantungan .
Ketergantungan injeksi membuat kelas menggunakan antarmuka bukan implementasi konkret. Itu akan menghasilkan penurunan kopling , bukan?
Apa yang saya lewatkan? Bagaimana peningkatan ketergantungan injeksi kopling antar kelas?
dependency-injection
coupling
BЈовић
sumber
sumber
Jawaban:
Dependency Injection mengurangi sambungan antara kelas dan ketergantungannya. Tapi itu meningkatkan sambungan antara kelas dan penggunanya (karena konsumen membutuhkan lebih banyak info untuk membuatnya) dan ketergantungan dan penggunannya (karena konsumen perlu mengetahui ketergantungan untuk digunakan).
Sangat sering, ini merupakan trade off yang baik. Kelas seharusnya tidak mengetahui detail tentang dependensinya di luar antarmuka, dan itu harus menjadi tanggung jawab aplikasi untuk mengikat bit kode tertentu bersama-sama.
sumber
Misalkan Anda memiliki subsistem
S
yang bergantung pada koneksi basis dataD
. Tanpa injeksi ketergantungan, ada sambungan yang relatif ketat antaraS
danD
, karenaS
perlu tahu cara menggunakanD
dan cara membuatnya. Sisa dari sistem, bagaimanapun, bisa sangat tidak menyadari ketergantungan antaraS
danD
.Dengan injeksi ketergantungan, kopling antara
S
danD
menjadi lebih longgar, karena Anda menghapus dariS
pengetahuan cara membuatD
.S
hanya perlu tahu cara menggunakannya. Peningkatan keseluruhan kopling berasal dari kenyataan bahwa bagian lain dari sistem sekarang perlu tahu tentangD
dan mungkin cara membuatnya. Tingkat kenaikan kopling ini tergantung pada bagaimana ketergantungan padaD
disuntikkan keS
:S
kebutuhan bergantung padaD
dan mungkin pengetahuan cara membuatnya.S
yangD
akan disuntikkan memerlukan ketergantunganD
dan mungkin pengetahuan cara membuatnya.Dalam kedua kasus, jumlah kelas yang tergantung pada
D
peningkatan dan pengetahuan cara membuatD
masih perlu hadir di suatu tempat dalam sistem. Ini menciptakan peningkatan kopling secara keseluruhan.sumber
S
kebutuhan untuk memasok pabrikD
, yang berarti perlu mengetahuiS
penggunaan ituD
(atau setidaknya beberapa antarmuka itu).Saya sangat tidak setuju bahwa itu meningkatkan kopling.
Tanpa injeksi ketergantungan Anda memiliki kopling ketat antara sub sistem dan implementasi dependensi yang konkret.
Dengan injeksi dependensi Anda telah memisahkan sub sistem dari implementasi dependensi.
Membuat argumen bahwa itu meningkatkan kopling antara konsumen dan sub sistem ini SANGAT dipertanyakan karena menyiratkan bahwa konsumen sekarang sangat erat dengan ketergantungan yang diperlukan oleh sub sistem. Maksudnya adalah Anda menulis kode yang dipasangkan dengan ketat yang menyatukan konsumen Anda dengan ketergantungan. Idealnya SEMUA kode Anda dipisahkan.
Injeksi Konstruktor:
Resolusi ketergantungan ditangani oleh wadah injeksi ketergantungan atau pabrik. Konsumen bisa mendapatkan implementasi nyata dari sistem sub dari wadah injeksi ketergantungan atau pabrik.
Konsumen tidak perlu tahu seperti apa konstruktor dari sub sistem itu. Tidak ada sambungan ke ketergantungan sub sistem.
Metode Injeksi:
Sama seperti injeksi konstruktor kecuali bahwa sekarang konsumen perlu mendapatkan contoh nyata ketergantungan dari wadah atau pabrik (atau bahkan menyuntikkan metode / konstruktor) dan menyuntikkannya ke dalam metode. Sekali lagi, konsumen tidak digabungkan dengan implementasi konkret dari ketergantungan.
TL; DR Kasus terburuk untuk injeksi ketergantungan dalam sub sistem adalah bahwa kopling dialihkan ke kode konsumen. TIDAK ADA PENINGKATAN SECARA KESELURUHAN DALAM COUPLING.
Kasus terbaik adalah bahwa semua sistem sekarang longgar digabungkan dan injeksi ketergantungan dikontrol melalui wadah atau pabrik injeksi ketergantungan.
sumber