Istilah teknis untuk menunjukkan kebalikan dari injeksi ketergantungan?


12

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?


1
Ya, kopling menjelaskan tindakan menggunakan nama kelas eksplisit di kelas lain dan keadaan yang dihasilkan dari basis kode.
Kilian Foth

11
Tidak, kopling ketat hanya menjelaskan properti kode yang dihasilkan, bukan kebalikan dari DI. Anda dapat menggunakan DI dan masih memiliki kopling ketat untuk alasan yang sangat berbeda.
Doc Brown


@EricKing pamer. Memberi +1 sebagai omong kosong.
candied_orange

1
"Hisap ketergantungan" .
SeldomNeedy

Jawaban:


30

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.


Ya, hard coding (dependensi), tidak seperti menyuntikkannya (saat runtime) adalah persis apa yang akan saya sarankan, juga, Anda hanya sedikit lebih cepat daripada saya.
Doc Brown

7
@DocBrown Saya kadang berharap tempat ini tidak terlalu menekankan pada kecepatan. Saya ingin mendengar bagaimana Anda mengatakannya.
candied_orange

Jawaban yang bagus - injeksi ketergantungan tidak menyiratkan decoupling. Percaya sebaliknya mengarah ke jalan yang buruk
Semut P

1
@CandiedOrange Mungkin seseorang harus menyarankan dalam meta bahwa jawaban tetap tersembunyi untuk jangka waktu tertentu. Dan / Atau suara disembunyikan dari tampilan publik selama Nberjam - jam ... Atau sampai jawaban dipilih. Saya tahu saya tidak sepenuhnya objektif ketika satu jawaban sudah memiliki 10 suara dan 5 jawaban lainnya tidak ada!
svidgen

1
@viden mencari "pistol tercepat di barat" pada meta. Masalahnya sudah memiliki sejarah panjang.
candied_orange

6

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:

public DependencyInjectedConstructor(DependencyClass dep) {
  dep.do();
}

public DependencyLookupConstructor() {
  var dep = new DependencyClass();
  dep.do();
}

DependencyLookupConstructordigabungkan ke tertentu DependencyClassdalam hal ini. Tapi, keduanya digabungkan DependencyClass. Kejahatan yang sebenarnya, jika ada satu di sini, bukan kopling, itu yang DependencyLookupConstructorperlu diubah jika DependencyClasstiba-tiba membutuhkan ketergantungannya sendiri disuntikkan 1 .

Namun, konstruktor / kelas ini bahkan lebih longgar digabungkan:

public DependencyLocatingConstructor() {
  var dep = ServiceLocator.GetMyDoer();
  dep.do();
}

Jika Anda bekerja di C #, yang di atas akan memungkinkan Anda ServiceLocatoruntuk mengembalikan apa pun saat GetMyDoer()dipanggil, asalkan itu dapat do()apa yang DependencyLocatingConstructormemilikinya do(). 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:

  • Pola Penunjuk Lokasi Layanan
  • Ketergantungan Lokasi / Lokasi
  • Objek langsung / konstruksi ketergantungan
  • Ketergantungan tersembunyi
  • "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 Useratau IUseruntuk tujuan yang berbeda: Misalnya, Locator.GetAdministrator()versus Locator.GetAuthor()- atau apa pun. Kode saya dapat menanyakan apa yang dibutuhkan secara fungsional tanpa mengetahui antarmuka apa yang didukungnya.


2
Keselamatan untuk DependencyInjectedConstructor(DependencyClass dep)adalah bahwa DependencyClass bisa menjadi antarmuka atau kelas abstrak. Inilah sebabnya mengapa saya sedih bahwa C # coders menggunakan awalan antarmuka, seperti pada IDependency. 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.
candied_orange

Poin menjadi, DI masih pasangan Anda untuk antarmuka itu, dan tidak memerlukan yang DependencyClassmenjadi 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" :)
svidgen

Sebenarnya ... Saya mungkin sedikit di luar batas dalam mengatakan DI tentu pasangan Anda ke antarmuka, bahkan dalam C #. Meskipun, saya telah menghindarinya dalam C #, saya mendapat kesan saya juga bisa menerima dynamicparameter. (Tapi bukan varparameter, jika memori berfungsi.) Jadi, dengan DI di C #, saya pikir saya harus kode terhadap antarmuka, atau saya harus benar-benar melupakan validasi kompilasi-waktu.
svidgen

Objek digabungkan ke antarmuka. Apakah Anda menggunakan kata kunci antarmuka atau tidak. Itulah antarmuka yang tepat. Segala sesuatu yang Anda HARUS digabungkan. Apa yang Anda rebus adalah detail implementasi dan hal-hal tambahan yang tidak Anda butuhkan. Kita dapat memformalkan ini dengan menggunakan kata kunci antarmuka untuk membiarkan klien memberi tahu dunia, "Yang saya butuhkan adalah ini". Tetapi kita tidak harus melakukannya. Heck kita bisa mengetik bebek, baik dalam beberapa bahasa.
candied_orange

Saya tidak yakin kita sama sekali tidak setuju. Tapi, untuk memperjelas ... Objek secara internal digabungkan ke antarmuka mereka sendiri , ya. Tapi, antarmuka itu sendiri hanya memaksakan dependensi-kopling jika antarmuka secara eksplisit diberi nama. Di C #, menggunakan dynamicatau vardan mendapatkan objek dari locator mari kita abaikan antarmuka dan gunakan kelas apa pun yang dapat do()Anda butuhkan, terlepas dari apakah kelas itu mengimplementasikan beberapa IDoerantarmuka. 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 mau do().
svidgen

2

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 .


2
Saya suka instance creationtetapi tidak cukup spesifik. DI menciptakan instance tetapi dengan cara controller dan tidak pada level aplikasi. mungkininternal instance creation
amfibi

1

Saya akan pergi dengan enkapsulasi ketergantungan . Ini mengungkapkan ketergantungan yang terkunci daripada mengunjungi dan meninggalkan lagi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.