Bagaimana injeksi ketergantungan tidak hanya memindahkan kompleksitas ke kelas yang terpisah?


9

Saya telah mencari ke dalam menggunakan kerangka Topan untuk injeksi ketergantungan minggu ini. Saya mendapatkan bahwa memisahkan konstruksi objek bermanfaat untuk mengganti komponen acak dengan mengolok-olok selama pengujian unit, dan sejauh ini saya telah melihat manfaat dari ini saja.

Tapi saya tidak bisa tidak berpikir bahwa di mana sebelumnya saya memiliki kelas pengendali tampilan humongous yang memiliki puluhan impor header, saya sekarang memiliki kelas pabrik humongous yang memiliki puluhan impor header. Apakah saya harus menghindari kelas pabrik yang besar?


6
Dalam satu dekade saya berharap DI mengambil alih daftar bashing dari Singleton, tapi kali ini untuk alasan yang bagus. Ini memiliki beberapa kegunaan yang baik tetapi saya menyarankan untuk sangat berhati-hati mengevaluasi dampaknya.
Balog Pal

5
Saya tidak berpikir bahwa injeksi dependensi adalah cara untuk mengurangi kompleksitas tetapi cara untuk menghindari dependensi implisit (penggunaan simbol global / variabel bebas) yang mendukung dependensi eksplisit (menggunakan parameter eksplisit / variabel terikat). Jadi, kerumitannya masih ada, tetapi Anda terpaksa menghadapinya karena Anda membuatnya eksplisit dalam metode / tanda tangan konstruktor Anda.
Giorgio

7
Perhatikan bahwa hampir semua sistem untuk mengatur kode dapat digambarkan sebagai "hanya memindahkan kompleksitas di tempat lain". Ini bukan tentang menghilangkan kerumitan sebanyak mengaturnya dengan cara yang paling logis dan bermanfaat.

1
Jika Anda harus mengimpor 50 header, Anda harus melakukannya di suatu tempat. DI membantu Anda dengan cara unit yang lebih mudah menguji kode Anda.
BЈовић

2
Jadi, apakah Anda mengatakan bahwa sekarang kontroler Anda difokuskan untuk mengontrol dan pabrik impor header Anda difokuskan pada impor header? Bagaimana itu bisa menjadi hal yang buruk, apakah Anda menggunakan kerangka kerja DI atau tidak?
pdr

Jawaban:


16

Ketergantungan Injeksi hanya membantu menentukan bagaimana satu objek tahu tentang objek dependen lainnya. Ini tidak akan membantu Anda mengurangi kerumitan keseluruhan sistem. Jika Anda membutuhkan puluhan impor sebelum DI, Anda masih perlu puluhan impor setelah. Perbedaannya adalah bahwa impor ini akan berada di lokasi (kelas) yang lebih masuk akal (pabrik, pembangun, dll).

Dengan memungkinkan dependensi disediakan melalui konstruktor atau metode, Anda memberi diri Anda fleksibilitas untuk memasok objek yang berbeda, namun masih valid, ke kelas Anda dan meningkatkan kohesi kelas tersebut dengan menghilangkan kekhawatiran.

Ada beberapa prinsip yang serupa dan sering digunakan bersama: Dependency Injection (DI), Inversion of Control (IoC), dan Dependency Inversion Principle (DIP)

Dari artikel ini http://martinfowler.com/articles/dipInTheWild.html

DI adalah tentang kabel, IoC adalah tentang arah, dan DIP adalah tentang bentuk


2
+1, untuk kutipan terakhir. Ini adalah klarifikasi terbaik dari 3 konsep ini yang sering disalahpahami orang.
haylem

Artikel tertaut di atas sangat luar biasa. Penjelasan yang cukup dalam dan sangat jelas.
DemetriKots

10

Injeksi ketergantungan tidak mengurangi kompleksitas, tetapi meningkatkan kemampuan manitainabilitas melalui pemisahan masalah dan mengurangi kopling.

Tapi saya tidak bisa tidak berpikir bahwa di mana sebelumnya saya memiliki kelas pengendali tampilan humongous yang memiliki puluhan impor header, saya sekarang memiliki kelas pabrik humongous yang memiliki puluhan impor header. Apakah saya harus menghindari kelas pabrik yang besar?

Anda seharusnya menghindari kelas "humongous", titik. Jadi katakanlah Anda membagi pengontrol tampilan ke dalam kelas yang lebih kecil dan lebih dapat dikelola. Sekarang mereka semua bertanggung jawab untuk mendapatkan ketergantungan mereka. DI membantu Anda untuk memindahkan manajemen ketergantungan ini dari semua kelas tersebut ke kelas pabrik / konfigurasi yang hanya bertanggung jawab untuk manajemen ketergantungan - lihat Prinsip Tanggung Jawab Tunggal. Dan meskipun itu pasti akan jauh lebih sedikit "humongous" daripada pengontrol tampilan asli, jika terlalu besar Anda selalu memiliki pilihan untuk membaginya menjadi kelas manajemen ketergantungan yang lebih kecil yang bertanggung jawab untuk berbagai bagian aplikasi.


2

Dalam kata-kata awam:

Injeksi ketergantungan memindahkan kompleksitas ke tempat yang tidak terlalu membahayakan.

EDIT untuk @gnat: DI tidak hanya memindahkan kompleksitas ke kelas yang terpisah, itu juga memindahkannya ke tempat yang menyebabkan kerugian lebih sedikit.


bagaimana ini menjawab pertanyaan yang diajukan?
nyamuk

@gnat menambahkan edit, jawaban saya menjelaskan menurut pendapat saya bagaimana DI tidak hanya memindahkan kompleksitas ke kelas yang terpisah.
Tulains Córdova
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.