Dalam aplikasi Rails kami, kami menambahkan pemberitahuan. Beberapa di antaranya adalah blocking
: Mereka menghentikan kemajuan sumber daya apa pun yang mereka tambahkan, karena beberapa informasi tentang sumber daya itu hilang.
Pemberitahuan lainnya adalah pemberitahuan sederhana, dan hanya memberikan informasi.
Hari ini saya berdiskusi dengan programmer lain di tim kami. Saya telah membuat struktur warisan seperti ini:
Namun dia, lebih suka saya hanya menambahkan blocking
sebagai metode pengembalian boolean pada setiap Pemberitahuan, dan tentukan daftar subkelas yang memblokir di dalam kelas induk Pemberitahuan.
Perbedaan antara pendekatan ini tidak terlalu besar; dalam pendekatan saya seseorang tidak harus menentukan daftar ini, menjaga pembersih kelas root. Di sisi lain, logika khusus yang terjadi Notification::Blocking
saat ini juga tidak terlalu besar.
Jenis abstraksi apa yang lebih cocok untuk masalah ini?
Jawaban:
Anda ingin menghindari kelas dasar mengetahui tentang kelas turunan. Ini memperkenalkan kopling ketat dan merupakan sakit kepala pemeliharaan karena Anda harus ingat untuk menambahkan ke daftar setiap kali Anda membuat kelas turunan baru.
Ini juga akan mencegah Anda untuk dapat menempatkan kelas Notifikasi ke dalam paket / perakitan yang dapat digunakan kembali jika Anda ingin menggunakan kelas ini di beberapa proyek.
Jika Anda benar-benar ingin menggunakan kelas basis tunggal, cara lain untuk menyelesaikan ini adalah dengan menambahkan properti virtual atau metode IsBlocking pada kelas Pemberitahuan dasar. Kelas turunan kemudian dapat menimpanya untuk mengembalikan benar atau salah. Anda akan memiliki solusi kelas tunggal tanpa kelas dasar mengetahui tentang kelas turunan.
sumber
Itu terlihat sangat aneh dan merupakan bau kode tertentu.
Saya akan memberikan subkelas jika Anda memiliki perbedaan perilaku di antara kelas-kelas, dan Anda ingin memperlakukan semua pemberitahuan ini dengan cara yang sama (yaitu menggunakan polimorfisme ).
sumber
Sebagai kebalikan dari jawaban yang ada, saya akan menyarankan bahwa properti boolean adalah pilihan terbaik jika mode yang akan digunakan harus diubah secara dinamis (misalnya melalui file konfigurasi yang memberikan daftar jenis yang akan diblokir. dan yang tidak).
Yang mengatakan, desain yang lebih baik bahkan dalam situasi ini mungkin menggunakan objek Dekorator.
sumber
Saya akan mengatakan itu tergantung pada seberapa banyak hal khusus tentang pemberitahuan pemblokiran, meskipun pemikiran pertama saya adalah pergi dengan "keduanya":
Dengan begitu, Anda bisa menggunakan
n.Blocking
ataun is BlockingNotification
(semua dalam pseudo-code), meskipun, jika Anda akan mengizinkan kelas untuk menerapkan nilai konteks-sensitifBlocking
, mengingat Anda harus memeriksa nilai itu setiap kali,BlockingNotification
kelas menjadi kurang bermanfaat.Bagaimanapun, saya setuju dengan jawaban lain bahwa Anda tidak ingin implementasi kelas dasar
Blocking
harus tahu tentang kelas turunan.sumber
Alih-alih membuat dua kelas dasar dan beberapa instance masing-masing, buat satu kelas notifikasi dengan bool untuk menunjukkan apakah notifikasi tersebut memblokir dan informasi lain yang diperlukan untuk mengkomunikasikan notifikasi kepada pengguna.
Ini memungkinkan Anda untuk menggunakan satu set kode untuk memproses dan menyajikan notifikasi dan mengurangi kompleksitas kode Anda.
sumber