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 userId
sebagai 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 User
objek, 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.
I
di SOLID
dalamnya? MyConstructor
pada dasarnya mengatakan sekarang "Aku butuh a Guid
dan a string
". Jadi mengapa tidak memiliki antarmuka yang menyediakan a Guid
dan a string
, biarkan User
implementasikan antarmuka itu dan biarkan MyConstructor
bergantung pada instance yang mengimplementasikan antarmuka itu? Dan jika perlu MyConstructor
perubahan, 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".