Apakah kerangka kerja injeksi ketergantungan menimbulkan risiko ketergantungan?

13

Saya telah refactoring sistem yang ada untuk menggunakan injeksi ketergantungan, dan pekerjaan itu telah berjalan dengan lancar.

Setelah beberapa saat saya perhatikan bahwa sejumlah besar perpustakaan in-house menjadi tergantung pada kerangka DI yang saya gunakan. Akibatnya seluruh proyek sekarang tergantung pada kerangka kerja pihak ketiga ini.

Saya melihat sebuah ironi dalam memisahkan semua dependensi dengan membuatnya tergantung pada perpustakaan bersama.

Reaksi pertama saya adalah membuat perpustakaan pembungkus di sekitar kerangka kerja dependensi. Oleh karena itu, saya bisa mengganti kerangka kerja ini jika diperlukan. Setelah memperkirakan pekerjaan yang terlibat, saya menyadari bahwa API yang dihasilkan akan mirip dengan kerangka kerja yang ada, dan karenanya membuatnya lebih sulit untuk menggantinya. Jadi saya meninggalkan ide itu.

Kekhawatiran saya adalah bahwa kerangka kerja DI yang saya gunakan menjadi usang atau perlu diganti.

Apakah ada pola pengembangan saat bekerja dengan DI yang mengurangi sambungan antara proyek dan kerangka kerja DI?

Reactgular
sumber
4
Pola "jangan gunakan kerangka kerja DI". Meskipun saya harus bertanya-tanya apakah Anda menyelesaikan masalah yang sebenarnya tidak Anda miliki - seberapa besar kemungkinan Anda mengubah kerangka DI?
Oded
1
@Dilengkapi kerangka kerja DI yang baik harus dapat bekerja dengan kode secara transparan, tetapi ada kasus di mana itu tidak mungkin. Anda kemudian harus menggunakan API DI di dalam kelas Anda. Dalam kasus tersebut, sulit untuk membagikan atau mengubah kerangka kerja DI tanpa perlu mengubah kelas-kelas tersebut. Karena ini adalah pertama kalinya saya bekerja dengan kerangka DI itu. Saya tidak yakin apakah saya perlu menggantinya.
Reactgular
8
Sistem Anda juga tergantung pada listrik. Saya sarankan Anda memisahkan itu dulu.
Idan Arye
3
@MathewFoscarini Bukankah ini anti-pola? Anda dapat melakukannya, tetapi Anda seharusnya tidak melakukannya karena mengaburkan ketergantungan.
maaartinus
2
@MathewFoscarini DIFramework.Get<IService>()sebenarnya bukan injeksi ketergantungan; itu adalah pola terkait yang disebut Pencari Layanan. Banyak orang yang tidak menyukai Service Locator karena ia menyatukan Anda dengan framework dan karena terlalu mudah disalahgunakan (seperti Singleton). Martin Fowler memiliki artikel hebat tentang pola-pola ini: martinfowler.com/articles/injection.html
Benjamin Hodgson

Jawaban:

8

Anda sepenuhnya benar - menggunakan kerangka DI kemungkinan besar akan membuat kode Anda tergantung dari hal itu. Sebenarnya, itu terlalu mengejutkan, karena ini biasanya berlaku untuk setiap kerangka kerja atau pustaka dasar lainnya, terutama ketika lib mendukung proyek Anda dengan beberapa fitur umum yang digunakan di mana pun dalam kode Anda. Misalnya, ketika Anda memutuskan untuk menggunakan kerangka UI atau kerangka kerja Web tertentu, keputusan ini sulit diubah setelah Anda membangun sejumlah kode berdasarkan pustaka tersebut. Ketika Anda memutuskan untuk menggunakan kelas tertentu (mungkin non-standar) String, Anda tidak dapat dengan mudah mengubah keputusan itu nanti. Keputusan seperti itu adalah keputusan arsitektural, seperti memilih bahasa pemrograman tertentu dan mencoba mengubah keputusan itu setelah Anda menulis> 100 ribu baris kode.

Memiliki semua kode Anda bergantung pada kerangka kerja tertentu mungkin tidak menjadi masalah selama ia melakukan apa yang Anda harapkan darinya, dan selama itu dikelola dengan baik. Tapi itu bisa menjadi masalah jika bukan itu masalahnya. Ada beberapa strategi bagaimana menghadapi situasi itu:

  • pilih kerangka kerja dari vendor yang Anda yakini dapat memberikan Anda pembaruan dan rilis baru untuk beberapa tahun dari sekarang

  • pilih kerangka kerja open source yang memiliki sedikit garis kode (dan lisensi yang tepat), sehingga Anda dapat melakukan pemeliharaan sendiri, mengingat vendor menghilang dari pasar

  • tulis kerangka kerja Anda sendiri

  • hidup dengan situasi selama vendor tersedia, dan ketika dia benar-benar menghilang, pilih kerangka kerja yang berbeda dan cobalah untuk membuat adaptor yang mengemulasi kerangka lama menggunakan yang baru

Ide membuat perpustakaan pembungkus sebelumnya bukanlah hal yang baru sama sekali, tetapi saya jarang melihat itu berfungsi, karena Anda harus membuat asumsi untuk situasi di masa depan yang Anda tidak tahu apakah atau kapan itu akan memukul Anda, dan apa kerangka "baru" akan terlihat seperti. Di sisi lain, beberapa tahun yang lalu kami berhasil bertukar kerangka kerja UI lengkap dalam proyek C ++ dengan ~ 120K baris kode dengan menerapkan strategi adaptor yang saya sebutkan di atas.

Doc Brown
sumber
19

Injeksi konstruktor biasa tidak memerlukan kerangka sama sekali. Satu-satunya hal yang Anda kehilangan adalah kemampuan untuk memusatkan dependensi Anda dalam file konfigurasi.

Wadah DI adalah pola "perangkat lunak perusahaan", digunakan ketika grafik objek sangat besar dan kompleks. Saya menduga 95% aplikasi tidak memerlukannya.

Robert Harvey
sumber
5
Saya setuju bahwa proyek kecil tidak memerlukannya , tetapi 95 +% proyek dapat mengambil untung darinya.
maaartinus
11
@maaartinus: Kompleksitas tambahan yang tidak perlu untuk keuntungan minimal.
Robert Harvey
1
Apa itu? Ini adalah statistik saya per kelas: 0,5 anotasi, 0,1 baris konfigurasi. Jadi, apa kompleksitas yang Anda maksudkan ???
maaartinus
2
@ RobertTarvey: meskipun saya setuju 100% dengan pernyataan Anda di atas, OP menyatakan ia sudah memperkenalkan kerangka kerja DI. Memberi tahu dia "lebih baik jangan" bukanlah jawaban atas pertanyaannya.
Doc Brown
1
@maaartinus semakin banyak kerangka kerja mengotomatiskan dan semakin banyak hal yang dapat disuntikkan semakin kompleks. Ada file konfigurasi XML, injeksi konstruktor, injeksi properti, penghinaan objek otomatis, injeksi malas, dll. Dll. Kerangka kerja DI ini bisa menjadi sangat kompleks.
Reactgular
0

Saya tidak berpikir kerangka kerja DI benar-benar dapat menjadi usang dalam waktu dekat. Apa yang harus terjadi untuk membuatnya usang?

  • Penemuan pola baru dan lebih cerdas mungkin? Namun harus seperti, itu akan membutuhkan perubahan kode yang jauh lebih besar.
  • Perubahan bahasa mungkin? Lebih buruk lagi.

Saya akan mengatakan bahwa DI saat ini sudah cukup matang dan saya tidak menyadari banyak yang terjadi di sana. Anda belum menentukan bahasa Anda, jadi berbicara tentang Guice , ini cukup tidak mengganggu dan berfungsi dengan anotasi Java standar (juga menggunakan sendiri untuk hal-hal yang tidak terstandarisasi, tetapi Anda jarang membutuhkannya). Ini bersumber terbuka, banyak digunakan, dan berlisensi Apache. Apa yang bisa menjadi masalah?

Saya cukup yakin bahwa mengubah kerangka kerja DI akan menjadi urutan besarnya lebih mudah daripada mengubah perpustakaan lain (misalnya, perubahan UI berarti lebih banyak pekerjaan).

maaartinus
sumber