Ini lebih merupakan nomenklatur (penulisan teknis) daripada pertanyaan teknis semata. Saya mencoba menulis proposal refactoring (dan membuatnya ditugaskan untuk diri saya sendiri) yang berpusat pada perluasan injeksi ketergantungan dalam aplikasi kita. Meskipun kami menggunakan Spring untuk kacang autowiring, masih ada contoh yang menggunakan kacang instantiate MyClass obj = new MyClass(...)
, yang benar-benar bisa disuntikkan. Saya ingin membuat proposal saya menggunakan tata nama yang elegan dan merujuk pada pola desain yang berlawanan dengan DI dengan istilah yang tepat.
Apakah "kopling ketat" adalah istilah yang memadai yang merupakan antonim untuk DI?
Jawaban:
Tidak. Kopling ketat lebih dari apa yang ditawarkan injeksi ketergantungan.
Injeksi ketergantungan mengeksternalkan keputusan implementasi. Ini membutuhkan waktu lama untuk memisahkan tetapi penggabungan lebih dari ini.
Antonim yang baik untuk injeksi dependensi adalah pengkodean sulit ketergantungan . Saat Anda membangun (menggunakan pabrik baru atau langsung menggunakan pabrik) di dalam objek perilaku, Anda telah mencampuradukkan dua masalah berbeda. Pencari layanan membantu memisahkan tetapi membuat Anda digabungkan ke pencari layanan itu sendiri.
Kopling lebih dari sekadar memisahkan konstruksi dan perilaku. Jika saya memiliki 101 metode yang harus dipanggil dalam urutan tertentu dari kelas A ke kelas B saya sangat erat. Tidak masalah seberapa luar biasanya konstruksi dan perilaku yang dipisahkan.
Coupling adalah ukuran saling ketergantungan dari dua objek. Apa pun yang berkontribusi membuat sulit untuk membuat perubahan di satu tanpa berdampak yang lain berkontribusi pada penggandengan. Injeksi ketergantungan membantu dengan ini tetapi tidak semuanya.
sumber
N
berjam - jam ... Atau sampai jawaban dipilih. Saya tahu saya tidak sepenuhnya objektif ketika satu jawaban sudah memiliki 10 suara dan 5 jawaban lainnya tidak ada!Sebenarnya, Injeksi Ketergantungan hanya benar-benar menentang BUKAN Injeksi Ketergantungan - dan karenanya strategi manajemen ketergantungan yang bukan Injeksi Ketergantungan.
Sambungan [tidak diinginkan], meskipun bukan masalah orthogonal, dapat terjadi atau dikurangi dengan cara apa pun. Keduanya digabungkan ke
DependencyClass
:DependencyLookupConstructor
digabungkan ke tertentuDependencyClass
dalam hal ini. Tapi, keduanya digabungkanDependencyClass
. Kejahatan yang sebenarnya, jika ada satu di sini, bukan kopling, itu yangDependencyLookupConstructor
perlu diubah jikaDependencyClass
tiba-tiba membutuhkan ketergantungannya sendiri disuntikkan 1 .Namun, konstruktor / kelas ini bahkan lebih longgar digabungkan:
Jika Anda bekerja di C #, yang di atas akan memungkinkan Anda
ServiceLocator
untuk mengembalikan apa pun saatGetMyDoer()
dipanggil, asalkan itu dapatdo()
apa yangDependencyLocatingConstructor
memilikinyado()
. Anda mendapatkan manfaat dari validasi tandatangan waktu kompilasi bahkan tanpa digabungkan ke antarmuka 2 yang lengkap .Jadi, pilih racunmu.
Tetapi pada dasarnya, jika ada "kebalikan" konkret dari Injeksi Ketergantungan, itu akan menjadi sesuatu yang lain di bidang "Strategi Manajemen Ketergantungan." Di antara yang lain, jika Anda menggunakan hal-hal berikut dalam percakapan, saya akan mengenalinya BUKAN Injeksi Ketergantungan:
1. Ironisnya, beberapa masalah yang DI pecahkan pada level yang lebih tinggi adalah semacam akibat [over-] menggunakan DI pada level yang lebih rendah. Saya merasa senang bekerja dengan basis kode dengan kompleksitas yang tidak perlu di seluruh tempat sebagai hasil dari menampung beberapa tempat di mana kompleksitas itu sebenarnya membantu ... Saya diakui bias oleh paparan yang buruk.
2. Menggunakan lokasi layanan juga memungkinkan Anda untuk dengan mudah menentukan dependensi berbeda dari jenis yang sama dengan peran fungsionalnya dari kode yang digunakan , sementara sebagian besar masih agnostik tentang bagaimana dependensi dibangun. Misalkan Anda perlu menyelesaikan
User
atauIUser
untuk tujuan yang berbeda: Misalnya,Locator.GetAdministrator()
versusLocator.GetAuthor()
- atau apa pun. Kode saya dapat menanyakan apa yang dibutuhkan secara fungsional tanpa mengetahui antarmuka apa yang didukungnya.sumber
DependencyInjectedConstructor(DependencyClass dep)
adalah bahwa DependencyClass bisa menjadi antarmuka atau kelas abstrak. Inilah sebabnya mengapa saya sedih bahwa C # coders menggunakan awalan antarmuka, seperti padaIDependency
. Sebagai klien, ini bukan urusan saya apa Ketergantungan ini. Selama saya tidak membangunnya, yang saya harus tahu hanyalah bagaimana berbicara dengannya. Apa itu masalah orang lain.DependencyClass
menjadi antarmuka abstrak sama sekali. Ini hanya mensyaratkan bahwa logika konstruksi / konfigurasi / lokasi ada "di tempat lain." ... Yah, dan lebih tepatnya pada pertanyaan, intinya adalah bahwa DI bukan "kebalikan dari kopling ketat" :)dynamic
parameter. (Tapi bukanvar
parameter, jika memori berfungsi.) Jadi, dengan DI di C #, saya pikir saya harus kode terhadap antarmuka, atau saya harus benar-benar melupakan validasi kompilasi-waktu.dynamic
atauvar
dan mendapatkan objek dari locator mari kita abaikan antarmuka dan gunakan kelas apa pun yang dapatdo()
Anda butuhkan, terlepas dari apakah kelas itu mengimplementasikan beberapaIDoer
antarmuka. Dengan kata lain, jika kita memiliki A-> B <-C, DI memisahkan A dari C, tetapi membutuhkan A dan C untuk digabungkan ke B, dan mencegah penggunaan D, bahkan jika D maudo()
.Aku tidak tahu bahwa ada yang spesifik, terminologi industri diterima secara luas, tetapi alternatif yang datang ke pikiran termasuk penciptaan internal yang misalnya , penciptaan ketergantungan internal yang , dependensi lokal , atau scoped lokal dependensi .
sumber
instance creation
tetapi tidak cukup spesifik. DI menciptakan instance tetapi dengan cara controller dan tidak pada level aplikasi. mungkininternal instance creation
Saya akan pergi dengan enkapsulasi ketergantungan . Ini mengungkapkan ketergantungan yang terkunci daripada mengunjungi dan meninggalkan lagi.
sumber