Estoy escribiendo una aplicación bastante simple que se ocupa de la reserva de habitaciones de hotel. Tengo un problema en una etapa.
Estoy procesando una cola de pedidos. Para cada pedido, uno de los recepcionistas debe elegir una habitación (una o ninguna) para el cliente de acuerdo con su estrategia. Es por eso que decidí ir con Java Optional
. El problema es que si simplemente no hay habitaciones libres en la fecha deseada, el pedido debe cancelarse, pero si hay algunas habitaciones disponibles y ninguna de ellas se ajusta a la estrategia de la recepcionista, ese pedido debe volver a la cola.
La elección de las habitaciones definitivamente debería ser un deber de recepcionista. ¿Cuál crees que es la mejor manera de lidiar con ese problema de manera limpia? ¿Debo lanzar una excepción en lugar de volver vacía Optional
cuando no hay habitaciones en la fecha? Desafortunadamente, las excepciones no suelen ser una buena solución para controlar el flujo de código.
Fragmento de código:
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);
}
fuente
Respuestas:
Creo que podrías modelarlo de dos maneras:
Opción 1: uso de un contenedor + enumeración para la respuesta de la recepcionista:
Opción 2: O podría una clase de interfaz y hacer que cada una de las respuestas herede de ella. Algo como:
El
chooseRoom
método sería:Y el código del cliente para la opción 1:
ReceptionistResponse response = receptionist.chooseRoom (rooms, order.getQuestionnaire ());
fuente
Hay un par de enfoques que uno podría aplicar para modelar esto.
Primero, podríamos tener la recepcionista pasiva. La recepcionista pasiva decide qué hacer, pero no hace nada. En cambio, tenemos clase como
Ahora, puede notar que esta es la misma idea básica que opcional, pero la hemos extendido a tres opciones en lugar de solo una. Cada método estático crea y devuelve una respuesta particular. Entonces tu recepcionista tiene un método
El código de llamada toma la Respuesta del Recepcionista y realiza la respuesta necesaria.
Alternativamente, puede tener una recepcionista activa. La recepcionista activa realmente hace las acciones:
fuente
Devolver el Opcional parece estar bien, pero si no hay ningún valor, la lógica no debería continuar. Cada invitado tiene una habitación real asignada o no es un invitado. Entonces, una vez que la recepcionista decidió devolver un Opcional vacío, el pedido debe volver a ponerse en la cola y nada más.
Está bien tomar primero el pedido de la cola, luego realizar el receptionist.chooseRoom y si vuelve vacío, volver a agregar el pedido a (el final de) la cola. Lo envolvería en un intento, finalmente, para asegurarme de que no se pierdan órdenes.
Si se selecciona una habitación, debe proceder como una habitación, no como Opcional. Opcional debe usarse como una variable temporal solo porque su único propósito es detectar que la recepcionista decidió no manejar la orden por el momento.
fuente