Bos saya memberi saya proyek dengan logika tertentu. Saya harus mengembangkan halaman web yang harus memimpin navigator melalui banyak kasus sampai dia tiba di produk.
Ini adalah skema jalur navigasi di situs:
PENTING!
Di halaman Produk, navigator dapat memilih filter mana yang diinginkan.
- Jika A, dia HARUS melalui B (dan kemudian C tentu saja) atau C dan mencapai produk.
- Jika B, ia harus melalui C dan mencapai produk.
- Jika C, ia langsung mencapai produk.
Tentu saja jika saya mulai dari AI mengikuti jalur terpanjang dan ketika saya mencapai produk saya, saya memiliki 3 filter aktif.
Sampai sekarang saya mengembangkan kode berikut yang berfungsi dengan baik.
if filter_A
if filter_B
filter_C()
.. else ..
else
filter_C
.. else ..
else
if filter_B
filter_C()
.. else ..
else
filter_C()
.. else ..
Saya di sini untuk bertanya apa yang akan dilakukan oleh programmer yang lebih ahli dalam situasi ini. Saya tidak menghormati prinsip KERING, saya tidak suka dan saya ingin tahu cara alternatif untuk mengembangkan logika semacam ini.
Saya berpikir tentang memecah setiap bagian dari kode dalam fungsi tetapi apakah itu ide yang baik dalam kasus ini?
sumber
filter_C
, tetapi pernyataan bersyarat menunjukkan bahwa aliran kontrol dapat berputarfilter_C
. Apakahfilter_C
opsional?Jawaban:
Anda belum mengatakan apakah filter mengambil parameter. Misalnya,
filter_A
mungkin filter kategori, jadi itu bukan hanya pertanyaan "apakah saya harus menerapkanfilter_A
", itu bisa "saya perlu menerapkanfilter_A
dan mengembalikan semua catatan dengan bidang kategori =fooCategory
".Cara paling sederhana untuk mengimplementasikan apa yang telah Anda jelaskan (tapi pastikan untuk membaca bagian kedua dari jawaban di bawah) mirip dengan jawaban yang lain, tetapi saya tidak akan mendapatkan boolean sama sekali. Saya akan mendefinisikan interface:
FilterA, FilterB, FilterC
. Maka Anda dapat memiliki sesuatu seperti (Saya seorang programmer Java, jadi ini akan menjadi sintaks Java-esque):Maka Anda dapat memiliki sesuatu seperti ini (menggunakan pola enum singleton dari Java Efektif ):
Tetapi jika Anda benar-benar ingin beberapa item difilter, Anda bisa memberikan contoh
FilterA
implementasi yang benar-benar melakukan sesuatu. Metode penyaringan Anda akan menjadi sangat sederhanaTapi saya baru memulai.
Saya menduga bahwa
applyFilter
panggilan itu sebenarnya akan sangat mirip untuk ketiga jenis filter. Jika itu masalahnya, saya bahkan tidak akan melakukannya dengan cara yang dijelaskan di atas. Anda bisa mendapatkan kode yang lebih bersih dengan hanya memiliki satu antarmuka, lalu melakukan ini:Kemudian, saat pengguna Anda menavigasi halaman, Anda hanya menambahkan contoh baru dari filter apa pun yang Anda butuhkan saat yang tepat. Ini akan memungkinkan Anda untuk dapat menerapkan beberapa contoh dari filter yang sama dengan argumen yang berbeda jika Anda memerlukan perilaku itu di masa depan, dan juga menambahkan filter tambahan di masa depan tanpa harus mengubah desain Anda .
Selain itu, Anda dapat menambahkan sesuatu seperti di
NoOpFilter
atas atau Anda tidak bisa menambahkan filter tertentu sama sekali ke daftar, apa pun yang lebih mudah untuk kode Anda.sumber
Filter
sebagaiPredicate
maka Anda dapat menggunakannya secara langsung diStream
API. Banyak bahasa memiliki konstruksi fungsional yang serupa.Dalam hal ini, penting untuk memisahkan logika pemfilteran, dan aliran kontrol tentang bagaimana filter berjalan. Logika filter harus dipisahkan menjadi fungsi-fungsi individual, yang dapat berjalan secara independen satu sama lain.
Dalam kode contoh diposting, ada 3 boolean
filter_A
,filter_B
danfilter_C
. Namun, dari diagram,filter_C
selalu berjalan, sehingga dapat diubah menjadi tanpa syarat.CATATAN: Saya berasumsi bahwa diagram alur kontrol sudah benar. Ada perbedaan antara kode sampel yang diposting dan diagram alir kontrol.
Sepotong kode terpisah mengontrol filter mana yang dijalankan
Ada pemisahan yang berbeda antara mengendalikan filter mana yang berjalan, dan apa yang dilakukan filter. Pisahkan kedua potongan logika itu.
sumber
Saya berasumsi, bahwa Anda menginginkan algoritma paling sederhana dan paling jelas.
Dalam hal ini, mengetahui bahwa filter c selalu diterapkan, saya akan menjalankannya dari logika if dan menerapkannya di akhir. Seperti yang terlihat dalam diagram alur Anda, setiap filter sebelum c, adalah opsional, karena masing-masingnya dapat diterapkan, atau tidak. Dalam hal ini, saya akan hidup seandainya terpisah dari setiap filter, tanpa bersarang dan merantai:
jika Anda memiliki diagram alur dengan sejumlah variabel filter, sebelum yang wajib, saya akan, sebagai gantinya, menyimpan semua filter ke array, dalam urutan yang akan muncul. Kemudian proses filter opsional dalam loop dan terapkan yang wajib di akhir, di luar loop:
atau:
keberanian, Anda harus mendefinisikan subrutin pemrosesan filter.
sumber
Saya akan menganggap filterA, filterB, dan filterC benar-benar mengubah daftar produk. Kalau tidak, jika mereka hanya jika-cek, maka filterA dan filterB dapat diabaikan karena semua jalur akhirnya mengarah ke filterC. Deskripsi Anda tentang persyaratan tampaknya menyiratkan bahwa setiap filter akan mengurangi daftar produk.
Jadi dengan asumsi filter benar-benar mengurangi daftar produk, inilah sedikit pseudo-code ...
Dalam persyaratan Anda, filterC tidak diterapkan secara otomatis, tetapi dalam diagram, itu. Jika persyaratannya adalah setidaknya filterC harus diterapkan tidak peduli apa pun, maka Anda akan memanggil applyFilter (filterC, produk) tanpa memeriksa apakah filterC dipilih.
sumber
Saya ingin tahu apakah pemodelan filter Anda menjadi semacam objek dalam grafik akan masuk akal. Setidaknya itulah yang saya pikirkan ketika melihat diagram.
Jika Anda memodelkan ketergantungan filter seperti grafik objek, maka kode yang menangani jalur aliran yang mungkin cukup lurus ke depan tanpa logika berbulu. Juga, grafik (logika bisnis) dapat berubah, sedangkan kode yang menginterpretasikan grafik tetap sama.
sumber