En este segundo sprint de la tarea consistente en modelar la gestión de las reservas del hotel IES Al-Ándalus, se va a continuar usando la implementación basada en arrays para la gestión de las colecciones. Pero añadiremos el patrón MVC, haciendo una primera aproximación al mismo que poco a poco iremos mejorando cuando se vayan adquiriendo los conocimientos necesarios. Por tal motivo, haremos una distinción entre la vista, encargada de interactuar con el usuario, el modelo, encargado de gestionar los datos y de interactuar con las colecciones y que dividiremos entre clases de dominio y clases de negocio. Por último, pero no menos importante, el controlador que será el encargado de dirigir toda esta orquesta.
Debes tener en cuenta el problema existente con las referencias, por lo que, al igual que en el primer sprint, para cada clase que sea cliente de otra deberás devolver referencias a objetos nuevos en los métodos de acceso. También crear nuevas referencias a nuevos objetos cuando los vayamos a asignar a atributos. Además, en los métodos de las clases de dominio deberás devolver una copia profunda de los elementos de la colección en dicho método de acceso.
Por otro lado, dado el buen hacer en la primera entrega, el cliente ha decidido que se añada al menú de usuario la posibilidad de realizar operación de Check-in y Check-out.
- Realiza un fork del repositorio de tu tarea anterior en otro nuevo llamado ReservasHotel_v1. Dicho repositorio lo clonarás localmente y realizarás las diferentes modificaciones que se piden en esta tarea.
- Modifica el archivo
README.md
. Realiza tu primer commit.
- Agrega el método
realizarCheckin
para que se establezca la fecha de check-in de la reserva indicada como parámetro. - Agrega el método
realizarCheckout
para que se establezca la fecha de check-out de la reserva indicada como parámetro. - Realiza el commit correspondiente.
- Modifica el enumerado
Opción
creado en el sprint anterior para que se añadan las operaciones realizar check-in y realizar check-out, tal y como aparece en el diagrama de clases. - Realiza un commit con la modificación de este enumerado.
- Modifica la clase
Consola
para que se incluya el métodoleerFechaHora
que nos pedirá que introduzcamos una cadena correspondiente a una fecha y hora en el formato adecuado y devolverá el objetoLocalDateTime
correspondiente. Esto se repetirá mientras la fecha introducida no sea válida. - Realiza el commit correspondiente.
- Crea la clase
Modelo
en el paquete indicado en el diagrama. Esta clase gestionará todo el modelo de nuestra aplicación. Será la encargada de comunicarse con las tres clases que hacen referencia a las colecciones de datos (huéspedes, habitaciones y reservas). - Crea el método
comenzar
que creará la instancia de las clases de negocio. - Crea el método
terminar
que simplemente mostrará un mensaje informativo indicando que el modelo ha terminado. - Crea los diferentes métodos
insertar
(para huésped, habitación y reserva). - Crea los diferentes métodos
buscar
, cada uno de los cuales devolverá una nueva instancia del elemento encontrado si este existe. - Crea los diferentes métodos
borrar
(para huésped, habitación y reserva). - Crea los diferentes métodos
get
, que deben devolver una nueva lista conteniendo nuevas instancias no una copia de los elementos. - Crea los métodos
realizarCheckin
yrealizarCheckout
. - Realiza un commit con la nueva clase creada.
- Crea la clase
Controlador
en el paquete indicado en el diagrama. Esta clase será la encargada de hacer de intermediario entre la vista y el modelo. - Crea los atributos con la visibilidad adecuados.
- Crea el constructor con parámetros que comprobará que no son nulos y los asignará a los atributos. Además, debe llamar al método
setControlador
de la vista con una instancia suya. - Crea los métodos
comenzar
yterminar
, que llamarán a los correspondientes métodos en el modelo y en la vista. - Crea los demás métodos, los cuales simplemente harán una llamada al correspondiente método del modelo.
- Realiza un commit con la nueva clase creada.
- Crea la clase
Vista
, en el paquete adecuado. - Crea los diferentes atributos que se indican en el diagrama de clases con su visibilidad adecuada.
- Excepto el método
main
, mueve todos los métodos existentes en la claseMainApp
del sprint anterior a la claseVista
. - Crea el método
setControlador
que asignará el controlador pasado al atributo si este no es nulo. - Crea el método
comenzar
que mostrará el menú, leerá una opción de consola y la ejecutará. Repetirá este proceso mientras la opción elegida no sea la correspondiente a salir. Utilizará los correspondientes métodos de la claseConsola
. - Crea el método
terminar
que simplemente mostrará un mensaje de despedida por consola. - Modifica el método
ejecutarOpción
para que permita realizar las operaciones realizar check-in y realizar check-out. - Crea el método
realizarCheckin
, que una vez localizada la reserva a la que realizar el check-in, deberá llamar al método correspondiente del controlador. Para localizar la reserva deberá preguntarse por el huésped de la misma, obtener su lista de reservas y establecer la fecha y hora de check-in de la reserva correspondiente. Hay que tener en cuenta que un huésped puede haber realizado varias reservas para el mismo día. Además, en caso de intentar hacer check-in de una reserva no existente en el día indicado para el huésped, la aplicación deberá informar con algún mensaje de lo sucedido. - Crea el método
realizarCheckout
, que una vez localizada la reserva a la que realizar el check-out, deberá llamar al método correspondiente del controlador. Para localizar la reserva deberá preguntarse por el huésped de la misma, obtener su lista de reservas y establecer la fecha y hora de check-out de la reserva correspondiente. Hay que tener en cuenta que un huésped puede haber realizado varias reservas para el mismo día. Además, en caso de intentar hacer check-out de una reserva no existente en el día indicado para el huésped, la aplicación deberá informar con algún mensaje de lo sucedido. - Realiza un commit con la nueva clase creada.
- Modifica la clase
MainApp
para que tenga un único métodomain
que será el método de entrada a nuestra aplicación. Este método simplemente creará una vista, un modelo y un controlador, pasándoles las instancias antes creadas. Luego simplemente invocará al método comenzar del controlador. - Realiza las pruebas que estimes oportunas y cuando consideres que todo es correcto, realiza el último commit y seguidamente realiza el push a tu repositorio remoto.
- La indentación debe ser correcta en cada uno de los apartados.
- El nombre de las variables debe ser adecuado.
- Se debe utilizar la clase
Entrada
para realizar la entrada por teclado. - El programa debe pasar todas las pruebas que van en el esqueleto del proyecto y toda entrada del programa será validada, para evitar que el programa termine abruptamente debido a una excepción. Además, que ni decir tiene, el programa no debe contener ningún error léxico, sintáctico, de dependencias, etc.
- La corrección ortográfica tanto en los comentarios como en los mensajes que se muestren al usuario.