it-swarm.dev

Apa perbedaan nyata antara "Injeksi Bajingan" dan "Injeksi Orang Miskin"

Dari buku "Dependency Injection in .Net" saya tahu bahwa objek grafik harus dibuat di Root Komposisi dari aplikasi yang masuk akal bagi saya ketika Anda menggunakan wadah IoC.

Dalam semua aplikasi yang pernah saya lihat ketika upaya untuk menggunakan DI sedang dibuat, selalu ada dua konstruktor: yang dengan dependensi sebagai parameter dan yang "default" tanpa parameter yang pada gilirannya memanggil yang lain "baru" semua dependensi tetapi, dalam buku yang disebutkan di atas ini disebut "anti-pola Injeksi Bajingan" dan itulah yang saya kenal sebagai "Injeksi Pria Miskin".

Sekarang mempertimbangkan semua ini, saya akan mengatakan bahwa "Poor Man's Injection" tidak akan menggunakan wadah IoC dan sebagai gantinya mengkode semua grafik objek dengan tangan pada kata Komposisi Root

Jadi pertanyaan saya adalah:

  1. Apakah saya memahami konsep-konsep ini dengan benar atau apakah saya sepenuhnya keluar jalur?
  2. Jika Anda masih perlu mendaftarkan semua dependensi dalam wadah IoC vs. mengkodekannya dengan tangan di Root Komposisi yang sama persis, apa manfaat sebenarnya dari menggunakan wadah IoC?
  3. Jika saya salah paham apa itu "Injeksi Orang Miskin" sebenarnya, bisakah seseorang tolong menjelaskannya?

Terima kasih

55
Sergio Romero

Ketika berbicara tentang DI, ada banyak penggunaan terminologi yang saling bertentangan di luar sana. Istilah Poor Man's DI tidak terkecuali. Bagi sebagian orang, itu berarti satu hal dan bagi orang lain itu berarti sesuatu yang berbeda.

Salah satu hal yang ingin saya lakukan dengan buku ini adalah menyediakan bahasa pola konsisten untuk DI. Ketika datang ke semua istilah dengan penggunaan yang bertentangan, saya memiliki dua pilihan: Munculkan istilah yang sama sekali baru, atau memilih penggunaan yang paling umum (menurut penilaian subjektif saya).

Secara umum, saya lebih suka menggunakan kembali terminologi yang sudah ada daripada membuat bahasa pola yang sama sekali baru (dan dengan demikian asing). Itu berarti bahwa dalam kasus-kasus tertentu (seperti DI, Poor Man), Anda mungkin memiliki gagasan yang berbeda tentang apa namanya daripada definisi yang diberikan dalam buku ini. Itu sering terjadi dengan buku-buku pola.

Setidaknya saya merasa yakin bahwa buku itu tampaknya telah melakukan tugasnya untuk menjelaskan secara tepat baik DIK dan juga Injeksi Bajingan, karena interpretasi yang diberikan dalam O.P tepat.

Mengenai manfaat nyata Kontainer DI, saya akan mengarahkan Anda ke jawaban ini: Argumen terhadap Pembalikan wadah Kontrol


PS 2018-04-13: Saya ingin menunjukkan bahwa saya sudah bertahun-tahun lalu mengakui bahwa istilah Poor Man's DI melakukan pekerjaan yang buruk (sic!) mengkomunikasikan esensi dari prinsip tersebut, jadi selama bertahun-tahun, sekarang, saya telah sebagai gantinya menyebutnya Pure DI .

50
Mark Seemann

Beberapa catatan pada bagian 2) dari pertanyaan.

Jika Anda masih perlu mendaftarkan semua dependensi dalam wadah IoC vs. mengkodekannya dengan tangan di Root Komposisi yang sama persis, apa manfaat sebenarnya dari menggunakan wadah IoC?

  • Jika Anda memiliki pohon dependensi (clasess yang bergantung pada dependensi yang bergantung pada dependensi lain dan seterusnya): Anda tidak dapat melakukan semua "berita" di root komposisi, karena Anda baru memulai contoh pada setiap "injeksi bajingan" konstruktor dari masing-masing kelas, sehingga ada banyak "akar komposisi" yang tersebar di sepanjang basis kode Anda

  • Apakah Anda memiliki pohon dependensi, atau tidak, menggunakan wadah IoC akan mengetikkan beberapa kode. Bayangkan Anda memiliki 20 kelas berbeda yang bergantung pada IDependency yang sama. Jika Anda menggunakan wadah, Anda dapat memberikan konfigurasi untuk memberi tahu contoh mana yang digunakan untuk IDependency. Anda akan membuat ini di satu tempat, dan wadah akan berhati-hati untuk memberikan contoh di semua kelas dependen

  • Wadah juga dapat mengontrol umur objek, yang menawarkan keuntungan lain.

Semua ini, terlepas dari keuntungan nyata lainnya yang disediakan oleh DI (testability, rawatan, decouplig code, extensibility ...)

4
JotaBe

Kami telah menemukan, ketika refactoring aplikasi lama dan dependensi decoupling, hal-hal cenderung lebih mudah ketika dilakukan dengan proses dua langkah. Prosesnya mencakup "orang miskin" dan sistem wadah IOC formal.

Pertama: mengatur antarmuka dan membangun "poor mans ioc" untuk mengimplementasikannya. 

  • Ini memisahkan ketergantungan tanpa tambahan overhead (dan pembelajaran Kurva) dari pengaturan IOC formal.
  • Ini juga mengurangi gangguan dengan kode lawas yang ada. Tidak ada yang seperti memperkenalkan serangkaian masalah lain untuk debug.
  • Anggota tim pengembangan tidak pernah memiliki tingkat keahlian atau pemahaman yang sama. Sehingga menghemat banyak waktu implementasi. 
  • Ini juga memungkinkan pijakan untuk kasus uji. 
  • Ini juga menetapkan standar untuk sistem wadah IoC formal nanti.
  • Ini dapat diimplementasikan dalam langkah-langkah dari waktu ke waktu oleh banyak orang.

Kedua: Setiap sistem IoC memiliki pro & kontra. 

  • Sekarang setelah standar aplikasi ditetapkan, keputusan yang berpendidikan Dapat dibuat dalam memilih sistem wadah IoC. 
  • Menerapkan sistem IoC menjadi tugas menukar kode "orang miskin" dengan Sistem IoC baru.
  • Ini dapat diimplementasikan dalam langkah-langkah dari waktu ke waktu dan secara paralel dengan "orang miskin". Lebih baik mengepalai ini dengan satu orang.
0
A A