Estou escrevendo um aplicativo bastante simples que trata da reserva de quartos de hotel. Eu tenho um problema em um estágio.
Estou processando uma fila de pedidos. Para cada pedido, um dos recepcionistas deve escolher um quarto (um ou nenhum) para o cliente, de acordo com sua estratégia. Por isso decidi ir com Java Optional
. O problema é que, se simplesmente não houver salas livres na data desejada, o pedido deverá ser cancelado, mas se houver algumas salas disponíveis e nenhuma delas se encaixar na estratégia da recepcionista, essa ordem deverá ser colocada de volta na fila.
A escolha dos quartos definitivamente deve ser um dever da recepcionista. Qual você acha que é a melhor maneira de lidar com esse problema de maneira limpa? Devo lançar uma exceção em vez de retornar vazio Optional
quando não há quartos na data? Infelizmente, as exceções geralmente não são uma boa solução para controlar o fluxo 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);
}
fonte
Respostas:
Eu acho que você poderia modelá-lo de duas maneiras:
Opção 1: Usando um wrapper + enum para a resposta da recepcionista:
Opção 2: Ou você pode criar uma classe de interface e fazer com que cada uma das respostas seja herdada. Algo como:
O
chooseRoom
método seria:E o código do cliente para a opção 1:
Resposta ReceptionistResponse = receptionist.chooseRoom (rooms, order.getQuestionnaire ());
fonte
Existem algumas abordagens que se poderia aplicar para modelar isso.
Primeiro, podemos ter a recepcionista passiva. A recepcionista passiva decide o que fazer, mas não faz nada. Em vez disso, temos classe algo como
Agora, você pode perceber que essa é a mesma ideia básica que a opcional, mas a ampliamos para três opções em vez de apenas uma. Cada método estático cria e retorna uma resposta específica. Então sua recepcionista tem um método
O código de chamada pega o ReceptionistResponse e realiza a resposta necessária.
Como alternativa, você pode ter uma recepcionista ativa. O recepcionista ativo realmente executa as ações:
fonte
Retornar o Opcional parece OK, mas se não houver valor, a lógica não deve continuar. Cada hóspede tem uma sala real atribuída a ele ou não é um hóspede. Assim, quando a recepcionista decidir devolver um Opcional vazio, o pedido deverá ser colocado novamente na fila e nada mais.
Não há problema em primeiro receber o pedido da fila e, em seguida, executar o receptionist.chooseRoom e, se voltar vazio, adicione novamente o pedido ao final da fila. Eu o encerraria em uma tentativa - finalmente, para garantir que nenhum pedido seja perdido.
Se uma sala for selecionada, ela deverá prosseguir como uma sala, não como opcional. Opcional deve ser usado como uma variável temporária apenas porque seu único objetivo é detectar que a recepcionista decidiu não lidar com o pedido no momento.
fonte