Masalah dasar yang sama sering Anda dapatkan dengan pemrograman berorientasi objek, aturan gaya dan hampir semua hal lainnya. Itu mungkin - sangat umum, pada kenyataannya - untuk melakukan terlalu banyak abstraksi, dan menambahkan terlalu banyak tipuan, dan secara umum menerapkan teknik yang baik secara berlebihan dan di tempat yang salah.
Setiap pola atau konstruksi lain yang Anda terapkan membawa kompleksitas. Abstraksi dan tipuan menyebarkan informasi, kadang-kadang mengeluarkan detail yang tidak relevan, tetapi terkadang membuat lebih sulit untuk memahami dengan tepat apa yang terjadi. Setiap aturan yang Anda terapkan membawa ketidakfleksibelan, mengesampingkan opsi yang mungkin merupakan pendekatan terbaik.
Intinya adalah untuk menulis kode yang melakukan pekerjaan dan kuat, dapat dibaca, dan dipelihara. Anda adalah pengembang perangkat lunak - bukan pembuat menara gading.
Tautan yang Relevan
http://thedailywtf.com/Articles/The_Inner-Platform_Effect.aspx
http://www.joelonsoftware.com/articles/fog0000000018.html
Mungkin bentuk injeksi ketergantungan yang paling sederhana (jangan tertawa) adalah sebuah parameter. Kode dependen tergantung pada data, dan data tersebut diinjeksi dengan cara melewatkan parameter.
Ya, itu konyol dan tidak membahas titik berorientasi objek injeksi ketergantungan, tetapi seorang programmer fungsional akan memberi tahu Anda bahwa (jika Anda memiliki fungsi kelas satu) ini adalah satu-satunya jenis injeksi ketergantungan yang Anda butuhkan. Intinya di sini adalah untuk mengambil contoh sepele, dan menunjukkan potensi masalah.
Mari kita ambil fungsi tradisional yang sederhana ini - sintaks C ++ tidak signifikan di sini, tapi saya harus mengejanya ...
void Say_Hello_World ()
{
std::cout << "Hello World" << std::endl;
}
Saya memiliki ketergantungan, saya ingin mengekstrak dan menyuntikkan - teks "Hello World". Cukup mudah...
void Say_Something (const char *p_text)
{
std::cout << p_text << std::endl;
}
Bagaimana itu lebih tidak fleksibel daripada aslinya? Nah, bagaimana jika saya memutuskan bahwa outputnya harus unicode. Saya mungkin ingin beralih dari std :: cout ke std :: wcout. Tapi itu berarti string saya harus dari wchar_t, bukan dari char. Baik setiap pemanggil harus diubah, atau (lebih masuk akal), implementasi lama akan diganti dengan adaptor yang menerjemahkan string dan memanggil implementasi baru.
Itu pekerjaan pemeliharaan di sana yang tidak diperlukan jika kita menyimpan yang asli.
Dan jika tampaknya sepele, lihatlah fungsi dunia nyata ini dari API Win32 ...
http://msdn.microsoft.com/en-us/library/ms632680%28v=vs.85%29.aspx
Itu 12 "dependensi" yang harus dihadapi. Misalnya, jika resolusi layar menjadi sangat besar, mungkin kita perlu nilai koordinat 64-bit - dan versi lain dari CreateWindowEx. Dan ya, sudah ada versi lama yang masih berkeliaran, yang mungkin dipetakan ke versi yang lebih baru di belakang layar ...
http://msdn.microsoft.com/en-us/library/ms632679%28v=vs.85%29.aspx
"Ketergantungan" itu bukan hanya masalah bagi pengembang asli - setiap orang yang menggunakan antarmuka itu harus mencari tahu apa dependensinya, bagaimana mereka ditentukan, dan apa artinya, dan mencari tahu apa yang harus dilakukan untuk aplikasi mereka. Di sinilah kata "default yang masuk akal" dapat membuat hidup lebih sederhana.
Injeksi ketergantungan objek-berorientasi pada prinsipnya tidak berbeda. Menulis kelas adalah overhead, baik dalam teks kode sumber dan waktu pengembang, dan jika kelas itu ditulis untuk memasok dependensi sesuai dengan beberapa spesifikasi objek dependen, maka objek dependen dikunci ke dalam mendukung antarmuka itu, bahkan jika ada kebutuhan untuk mengganti implementasi objek itu.
Tak satu pun dari ini harus dibaca sebagai mengklaim bahwa injeksi ketergantungan buruk - jauh dari itu. Tetapi teknik yang baik dapat diterapkan secara berlebihan dan di tempat yang salah. Sama seperti tidak setiap string perlu diekstraksi dan diubah menjadi parameter, tidak setiap perilaku tingkat rendah perlu diekstraksi dari objek tingkat tinggi dan berubah menjadi ketergantungan injeksi.