Saya memiliki beberapa kelas Pembantu di proyek saya. Saya telah membaca bahwa ini adalah hal yang buruk, tetapi saya curiga bahwa "Helper" adalah sufiks yang salah bagi mereka. Saya akan memberi contoh.
Pertama, saya punya User
kelas. Saya perlu metode GetSuggestedFriends()
untuk pengguna. Saya ingin menjaga logika untuk menentukan daftar teman yang disarankan keluar dari User
kelas, sehingga tidak membengkak. Saat ini, saya memiliki FriendshipHelper
yang menerima User
dalam konstruktornya. Ini berisi logika untuk mendapatkan teman yang disarankan, dan sekarang saya dapat menelepon myUser.FriendshipHelper.GetSuggestedFriends()
.
Awalnya hanya FriendshipHelper
memiliki metode statis, dan sebuah User
objek diteruskan ke masing-masing. Jika saya menulis kelas dari awal sekarang, mungkin saya akan menyebutnya FriendshipManager
- itu juga melakukan hal-hal seperti menambah dan menghapus teman.
Saya juga pernah membaca bahwa ...Manager
kelas itu buruk. Apa yang harus saya sebut kelas ini? Atau, apakah ini "kode buruk"? Di mana logika untuk mendapatkan teman yang disarankan, teman saat ini, dan menambah dan menghapus teman secara langsung? Tentunya tidak semua di User
kelas raksasa ?
sumber
Facebook
?Jawaban:
Secara umum: dengan Desain yang bagus
Iya. A
user
memiliki hubungan dengan yang lainusers
. Dan hubungan tersebut dapat dinyatakan sebagai metodeuser
, misalnyauser.isFriend(user2)
. Ini adalah tanggung jawabuser
proyek. Selain itu, Anda meminta objek lain untuk membantu menemukan teman lain . Anda mendelegasikan tanggung jawab untuk menemukan teman ke objek lain dan itu cukup baik .Yang tidak per se buruk, tapi memiliki satu kelemahan: inisialisasi "Penolong" dengan satu
user
batas kemungkinan untuk yang satuuser
.Yang Anda butuhkan adalah objek , yang membantu menemukan teman ke pengguna mana pun . Jadi metode generik akan masuk akal:
userMatcher.findFriendsFor(user)
yang pada kembali memberikan koleksi dari teman yang mungkin (user
).Masalah Anda bukan menulis "kelas pembantu", tetapi menemukan nama yang tepat . ;)
Itu desain yang salah . Ambil contoh: Apakah ibu Anda menambahkan teman ke hidup Anda atau apakah Anda menambahkan mereka sendiri?
Tentu saja koleksi dari teman-teman adalah milik
user
sendiri dan begitu juga metodeuser.addFriend(user)
atauuser.removeFriend(user)
Seperti yang dikatakan sebelumnya: Anda hanya memiliki masalah penamaan dan "pembantu" Anda baik - baik saja . Tetapi Anda harus berpikir lebih hati-hati tentang tanggung jawab masing-masing objek.
Tidak. Ini adalah dua pekerjaan yang Anda perlukan satu objek terpisah , seperti dalam kehidupan nyata di mana Anda memiliki orang dan agen kencan .
sumber
Saya menyarankan agar Anda memiliki
FriendshipService
kelas yang memiliki metode (non-statis)GetSuggestedFriends(User)
. Hindari metode statis karena Anda tidak dapat mengimplementasikan antarmuka yang membuatnya lebih sulit untuk diuji. Hindari menambahkan objek pengguna ke konstruktor karena Anda mungkin ingin memperluas FriendshipService Anda dengan metode yang tidak secara spesifik terkait dengan satu pengguna. (Misalnya, Anda mungkin ingin menyarankan teman ke sekelompok pengguna, atau menyarankan teman berdasarkan sesuatu yang lain)Seorang pengguna kemungkinan besar tidak akan menyadari
FriendshipService
(karena Pola Tanggung Jawab Tunggal)sumber