2 sen saya ...
Iya dan tidak.
Anda seharusnya tidak pernah benar - benar melanggar prinsip-prinsip yang Anda adopsi; tetapi, prinsip Anda harus selalu diberi nuansa dan diadopsi untuk mencapai tujuan yang lebih tinggi. Jadi, dengan pemahaman yang dikondisikan dengan baik, beberapa jelas pelanggaran mungkin tidak aktual pelanggaran "roh" atau "isi prinsip secara keseluruhan."
Prinsip-prinsip SOLID khususnya, selain membutuhkan banyak nuansa, pada akhirnya tunduk pada tujuan "memberikan perangkat lunak yang berfungsi dan dapat dirawat." Jadi, mematuhi prinsip SOLID tertentu adalah merugikan diri sendiri dan bertentangan dengan diri sendiri ketika melakukan hal tersebut bertentangan dengan tujuan SOLID. Dan di sini, saya sering perhatikan bahwa memberikan mengalahkan rawatan .
Jadi, bagaimana dengan D di SOLID ? Yah, itu berkontribusi pada peningkatan rawatan dengan membuat modul yang dapat digunakan kembali relatif agnostik untuk konteksnya. Dan kita dapat mendefinisikan "modul yang dapat digunakan kembali" sebagai "kumpulan kode yang Anda rencanakan untuk digunakan dalam konteks lain yang berbeda." Dan itu berlaku untuk satu fungsi, kelas, set kelas, dan program.
Dan ya, mengubah implementasi logger mungkin menempatkan modul Anda ke dalam "konteks lain yang berbeda."
Jadi, izinkan saya menawarkan dua peringatan besar saya :
Pertama: Menggambar garis di sekitar blok kode yang merupakan "modul yang dapat digunakan kembali" adalah masalah penilaian profesional. Dan penilaian Anda tentu terbatas pada pengalaman Anda.
Jika Anda tidak saat ini berencana untuk menggunakan modul dalam konteks lain, itu adalah mungkin OK untuk itu bergantung tak berdaya di atasnya. Peringatan ke peringatan: Rencana Anda mungkin salah - tetapi itu juga OK. Semakin lama Anda menulis modul demi modul, semakin intuitif dan akurat perasaan Anda apakah "Aku akan membutuhkan ini lagi suatu hari nanti". Tetapi, Anda mungkin tidak akan pernah bisa secara retrospektif berkata, "Saya telah memodulasi dan memisahkan segala sesuatu sejauh mungkin, tetapi tanpa kelebihan ."
Jika Anda merasa bersalah tentang kesalahan penilaian Anda, buka pengakuan dan lanjutkan ...
Kedua: Pembalikan kontrol tidak sama dengan ketergantungan injeksi .
Ini terutama benar ketika Anda mulai menyuntikkan dependensi dan mual . Dependency Injection adalah taktik yang berguna untuk strategi IoC yang menyeluruh. Tapi, saya berpendapat bahwa DI kurang manjur dibandingkan beberapa taktik lain - seperti menggunakan antarmuka dan adaptor - satu titik paparan konteks dari dalam modul.
Dan mari kita benar-benar fokus pada ini sebentar. Karena, walaupun Anda menyuntikkan Logger
mual iklan , Anda harus menulis kode pada Logger
antarmuka. Anda tidak dapat mulai menggunakan yang baru Logger
dari vendor yang berbeda yang mengambil parameter dalam urutan yang berbeda. Kemampuan itu berasal dari pengkodean, di dalam modul, terhadap antarmuka yang ada di dalam modul dan yang memiliki submodule tunggal (Adaptor) di dalamnya untuk mengelola ketergantungan.
Dan jika Anda mengkode terhadap Adaptor, apakah Logger
disuntikkan ke Adaptor itu atau ditemukan oleh Adaptor umumnya sangat tidak signifikan untuk tujuan rawatan keseluruhan. Dan yang lebih penting, jika Anda memiliki Adaptor tingkat modul, mungkin hanya masuk akal untuk menyuntikkannya ke apa saja. Ini ditulis untuk modul.
tl; dr - Berhentilah meributkan prinsip tanpa mempertimbangkan mengapa Anda menggunakan prinsip tersebut. Dan, lebih praktisnya, hanya membangun sebuah Adapter
untuk setiap modul. Gunakan penilaian Anda saat memutuskan di mana Anda menggambar batas "modul". Dari dalam setiap modul, silakan dan merujuk langsung ke Adapter
. Dan tentu saja, menyuntikkan logger nyata ke Adapter
- tetapi tidak ke setiap hal kecil yang mungkin membutuhkannya.