Katakanlah, misalnya, Anda memiliki aplikasi dengan kelas yang dibagikan secara luas User. Kelas ini memaparkan semua informasi tentang pengguna, ID mereka, nama, tingkat akses ke setiap modul, zona waktu dll.
Data pengguna jelas banyak direferensikan di seluruh sistem, tetapi untuk alasan apa pun, sistem ini diatur sehingga alih-alih mengirimkan objek pengguna ini ke kelas yang bergantung padanya, kami hanya meneruskan properti individual darinya.
Kelas yang membutuhkan id pengguna, hanya akan memerlukan GUID userIdsebagai parameter, kadang-kadang kita mungkin memerlukan nama pengguna juga, sehingga diteruskan sebagai parameter terpisah. Dalam beberapa kasus, ini diteruskan ke metode individual, sehingga nilai tidak dipegang di tingkat kelas sama sekali.
Setiap kali saya membutuhkan akses ke informasi yang berbeda dari kelas Pengguna, saya harus melakukan perubahan dengan menambahkan parameter dan di mana menambahkan kelebihan baru tidak sesuai, saya harus mengubah setiap referensi ke metode atau konstruktor kelas juga.
Pengguna hanyalah satu contoh. Ini banyak dipraktikkan dalam kode kita.
Apakah saya benar dalam berpikir bahwa ini merupakan pelanggaran prinsip Terbuka / Tertutup? Bukan hanya tindakan mengubah kelas yang ada, tetapi mengaturnya di tempat pertama sehingga perubahan luas sangat mungkin diperlukan di masa depan?
Jika kita baru saja melewati Userobjek, saya bisa membuat perubahan kecil ke kelas yang saya kerjakan. Jika saya harus menambahkan parameter, saya mungkin harus membuat lusinan perubahan pada referensi ke kelas.
Apakah ada prinsip lain yang dilanggar oleh praktik ini? Keterbalikan inversi mungkin? Meskipun kami tidak mereferensikan abstraksi, hanya ada satu jenis pengguna, jadi tidak ada kebutuhan nyata untuk memiliki antarmuka pengguna.
Apakah ada prinsip non-SOLID lainnya yang dilanggar, seperti prinsip dasar pemrograman defensif?
Haruskah konstruktor saya terlihat seperti ini:
MyConstructor(GUID userid, String username)
Atau ini:
MyConstructor(User theUser)
Edit Posting:
Disarankan bahwa pertanyaan dijawab dalam "Pass ID atau Object?". Ini tidak menjawab pertanyaan tentang bagaimana keputusan untuk pergi dengan cara apa pun mempengaruhi upaya untuk mengikuti prinsip-prinsip SOLID, yang merupakan inti dari pertanyaan ini.
Idi SOLIDdalamnya? MyConstructorpada dasarnya mengatakan sekarang "Aku butuh a Guiddan a string". Jadi mengapa tidak memiliki antarmuka yang menyediakan a Guiddan a string, biarkan Userimplementasikan antarmuka itu dan biarkan MyConstructorbergantung pada instance yang mengimplementasikan antarmuka itu? Dan jika perlu MyConstructorperubahan, ubah antarmuka. - Ini sangat membantu saya untuk memikirkan antarmuka untuk "milik" konsumen daripada penyedia . Jadi pikirkan "sebagai konsumen saya butuh sesuatu yang melakukan ini dan itu" daripada "sebagai penyedia saya bisa melakukan ini dan itu".