Saya sedang menulis aplikasi yang cukup sederhana yang berkaitan dengan pemesanan kamar hotel. Saya punya masalah pada satu tahap.
Saya sedang memproses antrian pesanan. Untuk setiap pesanan, salah satu resepsionis harus memilih kamar (satu atau tidak sama sekali) untuk klien sesuai dengan strateginya. Itu sebabnya saya memutuskan untuk pergi dengan Java Optional
. Masalahnya adalah bahwa jika tidak ada kamar gratis pada tanggal yang diinginkan pesanan harus dibatalkan, tetapi jika ada beberapa kamar yang tersedia dan tidak ada yang sesuai dengan strategi resepsionis bahwa pesanan harus dikembalikan ke antrian.
Memilih kamar tentu harus menjadi tugas resepsionis. Menurut Anda apa cara terbaik untuk mengatasi masalah itu dengan cara yang bersih? Haruskah saya melemparkan pengecualian daripada mengembalikan kosong Optional
ketika tidak ada kamar di tanggal? Sayangnya, pengecualian biasanya bukan solusi yang baik untuk mengendalikan aliran kode.
Fragmen kode:
Optional<Room> selectedRoom = receptionist.chooseRoom(rooms,
order.getQuestionnaire());
boolean decision = selectedRoom
.map(room -> receptionist.askClient(order.getClient(),
room,
order.getQuestionnaire()))
.orElse(false);
if (shouldProcessAgain(order, selectedRoom.isPresent(), decision)) {
orders.add(order);
}
sumber
Jawaban:
Saya pikir Anda bisa memodelkannya dalam dua cara:
Opsi 1: Menggunakan pembungkus + enum untuk respons resepsionis:
Opsi 2: Atau Anda bisa kelas antarmuka, dan membuat masing-masing respons mewarisi darinya. Sesuatu seperti:
The
chooseRoom
Metode akan menjadi:Dan kode klien untuk opsi 1:
ReceptionistResponse response = receptionist.chooseRoom (kamar, order.getQuestionnaire ());
sumber
Ada beberapa pendekatan yang bisa diterapkan untuk pemodelan ini.
Pertama, kita mungkin memiliki resepsionis pasif. Resepsionis pasif memutuskan apa yang harus dilakukan, tetapi tidak melakukan apa-apa. Sebagai gantinya, kami memiliki kelas seperti
Sekarang, Anda mungkin memperhatikan bahwa ini adalah ide dasar yang sama dengan opsional, tetapi kami telah memperluasnya menjadi tiga opsi, bukan hanya satu. Setiap metode statis membuat dan mengembalikan respons tertentu. Kemudian resepsionis Anda memiliki metode
Kode panggilan mengambil ReceptionistResponse dan melakukan respons yang diperlukan.
Atau, Anda mungkin memiliki resepsionis yang aktif. Resepsionis aktif sebenarnya melakukan tindakan:
sumber
Mengembalikan Opsional tampaknya OK tetapi jika tidak ada nilai maka logika tidak boleh dilanjutkan. Setiap tamu memiliki ruang nyata yang ditugaskan atau bukan tamu. Jadi, begitu resepsionis memutuskan untuk mengembalikan Opsional kosong, pesanan harus dimasukkan kembali dalam antrian dan tidak lebih.
Tidak apa-apa untuk pertama-tama mengambil pesanan dari antrian, kemudian melakukan resepsionis. Pilih saja dan jika itu kembali kosong, tambahkan kembali pesanan ke (akhir) antrian. Saya akan membungkusnya dalam percobaan-akhirnya untuk memastikan tidak ada pesanan yang hilang.
Jika suatu ruangan dipilih, itu harus dilanjutkan sebagai ruangan, bukan opsional. Opsional harus digunakan sebagai variabel sementara hanya karena satu-satunya tujuan adalah untuk mendeteksi bahwa resepsionis memutuskan untuk tidak menangani pesanan untuk saat ini.
sumber