La tarea va a consistir en modelar la gestión de un negocio de alquiler de vehículos. Nuestro nuevo cliente se dedica a alquilar vehículos a sus clientes. En este primer spring, el cliente nos pide que sólo contemplemos el alquiler de turismos, de los que guarda su marca, modelo, cilindrada y matrícula. Para los clientes guarda información sobre su nombre, DNI y teléfono.
Cuando un cliente alquila un turismo se crea un nuevo alquiler en el que se almacena el cliente que lo alquila, el turismo que alquila y la fecha en que lo alquila. Cuando el cliente devuelve el turismo se almacena la fecha de devolución.
El precio que cobra por alquiler de un turismo es el siguiente: (precioDia + factorCilindrada) * numDias. El precioDia es 20, el factorCilindrada depende de la cilindrada del turismo alquilado y es igual a la cilindrada del turismo / 10 y numDias son los días transcurridos entre la fecha de alquiler y la de devolución.
Tu tarea consiste en realizar una primera versión de una aplicación para gestionar el negocio de nuestro nuevo cliente.
En este repositorio de GitHub hay un esqueleto de proyecto gradle con las dependencias necesarias del proyecto y que ya lleva incluidos todos los test necesarios que el programa debe pasar.
Para ello te muestro un diagrama de clases para el mismo y poco a poco te iré explicando los diferentes pasos a realizar:
- Lo primero que debes hacer es un fork del repositorio donde he colocado el esqueleto de este proyecto.
- Clona tu repositorio remoto recién copiado en GitHub a un repositorio local que será donde irás realizando lo que a continuación se te pide. Modifica el archivo
README.md
para que incluya tu nombre en el apartado "Alumno". Realiza tu primer commit.
- Crea la clase
Cliente
con los atributos y visibilidad adecuados. Crea los métodos de acceso y modificación de cada atributo, teniendo en cuenta que un nombre estará compuesto de palabras separadas por un espacio y cada palabra comenzará con una mayúscula y continuará con minúsculas. El DNI y el teléfono deben también tener un formato válido. Además debes comprobar que la letra del DNI sea correcta. Debes crear las constantes para las expresiones regulares que luego utilizarás en los métodos de modificación. Los métodos de modificación lanzarán las excepciones adecuadas en caso de que el valor que se pretenda asignar al atributo no sea adecuado. También debes tener en cuenta que tanto el nombre como el teléfono de un cliente pueden cambiar. - Crea el constructor con parámetros que hará uso de los métodos de modificación.
- Crea el constructor copia.
- Crea el método de clase que se indica en el diagrama, que dado un DNI correcto nos devuelva un cliente válido con ese DNI y que será utilizado en las futuras búsquedas.
- Un cliente será igual a otro si su DNI es el mismo. Basándote en ello crea los métodos
equals
yhashCode
. - Crea el método
toString
que devuelva la cadena que esperan los tests. - Comprueba que la clase pasa los test para la misma y cuando lo haga realiza un commit.
- Crea la clase
Turismo
con los atributos y visibilidad adecuados. - Crea los métodos de acceso y modificación de cada atributo, teniendo en cuenta que la marca puede seguir alguno de los siguientes patrones: Seat, Land Rover, KIA, Rolls-Royce, SsangYong. El modelo simplemente no debe estar en blanco. La cilindrada estará comprendida entre 0 (exclusive) y 5000. La matrícula tendrá el formato de una matrícula española moderna (1111BBB). Debes crear las constantes para las expresiones regulares que luego utilizarás en los métodos de modificación. Los métodos de modificación lanzarán las excepciones adecuadas en caso de que el valor que se pretenda asignar al atributo no sea adecuado.
- Crea el constructor con parámetros que hará uso de los métodos de modificación.
- Crea el constructor copia.
- Crea el método de clase que se indica en el diagrama, que dada una matrícula correcta nos devuelva un turismo válido con dicha matrícula y que será utilizado en las futuras búsquedas.
- Un turismo será igual a otro si su matrícula es la misma. Basándote en ello crea los métodos
equals
yhashCode
. - Crea el método
toString
que devuelva la cadena que esperan los tests. - Comprueba que la clase pasa los test para la misma y cuando lo haga realiza un commit.
- Crea la clase
Alquiler
con los atributos y visibilidad adecuados. - Crea los métodos de acceso y modificación de cada atributo, teniendo en cuenta que es posible registrar un alquiler pasado (nuestro cliente a veces apunta los alquileres y luego los pasa a la aplicación). La fecha de alquiler no puede ser posterior a hoy. La fecha de devolución no puede ser igual o anterior a la fecha de alquiler y tampoco puede ser posterior a hoy. Los métodos de modificación lanzarán las excepciones adecuadas en caso de que el valor que se pretenda asignar al atributo no sea adecuado.
- Crea el constructor con parámetros que hará uso de los métodos de modificación.
- Crea el constructor copia que creará una copia y en el caso del cliente y el turismo creará una nueva instancia llamando a sus constructores copia.
- Crea el método
devolver
que se encargará de asignar la fecha de devoluión si ésta es correcta. - Crea el método
getPrecio
que devolverá el precio del alquiler conforme a la fórmula establecida por nuestro cliente y explicada anteriormente. - Un alquiler será igual a otro si es el mismo cliente, el mismo turismo y la fecha de alquiler. Basándote en ello crea los métodos
equals
yhashCode
. - Crea el método
toString
que devuelva la cadena que esperan los tests. - Comprueba que la clase pasa los test para la misma y cuando lo haga realiza un commit.
- Crea la clase
Clientes
que gestionará una lista de clientes (Cliente
) sin permitir elementos repetidos. - Crea el constructor por defecto que simplemente creará la lista.
- Crea el método
get
que devolverá una nueva lista con los mismos elementos (no debe crear nuevas instancias). - Crea el método
getCantidad
que devolverá la cantidad de elementos que contiene la lista. - Crea el método
insertar
que añadirá un cliente a la lista si éste no es nulo y no existe aún en la lista. - Crea el método
buscar
que devolverá el cliente si éste se encuentra en la lista ynull
en caso contrario. - Crea el método
borrar
que borrará el cliente si éste existe en la lista o lanzará una excepción en caso contrario. - Crea el método
modificar
que permitirá cambiar el nombre o el teléfono (si estos parámetros no son nulos ni blancos) de un cliente existente y si no lanzará la correspondiente excepción. - Comprueba que la clase pasa los test para la misma y cuando lo haga realiza un commit.
- Crea la clase
Turismos
que gestionará una lista de turismos (Turismo
) sin permitir elementos repetidos. - Crea el constructor por defecto que simplemente creará la lista.
- Crea el método
get
que devolverá una nueva lista con los mismos elementos (no debe crear nuevas instancias). - Crea el método
getCantidad
que devolverá la cantidad de elementos que contiene la lista. - Crea el método
insertar
que añadirá un turismo a la lista si éste no es nulo y no existe aún en la lista. - Crea el método
buscar
que devolverá el turismo si éste se encuentra en la lista ynull
en caso contrario. - Crea el método
borrar
que borrará el turismo si éste existe en la lista o lanzará una excepción en caso contrario. - Comprueba que la clase pasa los test para la misma y cuando lo haga realiza un commit.
- Crea la clase
Alquileres
que gestionará una lista de alquileres (Alquiler
) sin permitir elementos repetidos. - Crea el constructor por defecto que simplemente creará la lista.
- Crea el método
get
que devolverá una nueva lista con los mismos elementos (no debe crear nuevas instancias). - Crea el método
get
para un cliente dado, que devolverá una nueva lista con los alquileres para dicho cliente (no debe crear nuevas instancias). - Crea el método
get
para un turismo dado, que devolverá una nueva lista con los alquileres para dicho turismo (no debe crear nuevas instancias). - Crea el método
getCantidad
que devolverá la cantidad de elementos que contiene la lista. - Crea el método
comprobarAlquiler
que comprobará que en la lista no existe ningún alquiler sin devolver ni para el cliente ni para el turismo y que tampoco hay un alquiler devuelto, del cliente o del turismo, con fecha de devolución posterior a la fecha en la que se pretende alquiler. - Crea el método
insertar
que añadirá un alquiler a la lista si éste no es nulo y pasa la comprobación anterior. - Crea el método
devolver
que devolverá (asignará la fecha de devolución) si éste existe en la lista o lanzará la excepción en caso contrario. - Crea el método
buscar
que devolverá el alquiler si éste se encuentra en la lista y null en caso contrario. - Crea el método
borrar
que borrará el alquiler si éste existe en la lista o lanzará una excepción en caso contrario. - Comprueba que la clase pasa los test para la misma y cuando lo haga realiza un commit.
- Crea la clase
Modelo
que gestionará todo el modelo de nuestra aplicación. Será la encargada de comunicarse con las tres clases anteriores. - Crea el método
comenzar
que creará la instancia de las clases de negocio anteriores. - Crea le método
terminar
que simplemente mostrará un mensaje informativo indicando que el modelo ha terminado. - Crea los diferentes métodos
insertar
, teniendo en cuenta que ahora ya si insertaremos nuevas instancias utilizando los constructores copia y que en el caso de los alquileres, primero debe buscar el cliente y el turismo y utilizar dichas instancias encontradas. - Crea los diferentes métodos
buscar
, que devolverá una nueva instancia del elemento encontrado si éste existe. - Crea el método
modificar
que invocará a su homólogo en la clase de negocio. - Crea el método
devolver
que realizará la devolución, si es posible, del alquiler pasado. - Crea los diferentes métodos
borrar
, teniendo en cuenta que los borrados se realizarán en cascada, es decir, si borramos un cliente también borraremos todos sus alquileres y lo mismo pasará con los turismos. - Crea los diferentes métodos
get
, que deben devolver una nueva lista pero que contenga nuevas instancias no una copia de los elementos. - Comprueba que la clase pasa los test para la misma y cuando lo haga realiza un commit.
- Crea el enumerado
Opcion
que contendrá las diferentes opciones de nuestro menú de opciones y que será utilizado posteriormente para mostrar las posibles opciones a realizar. Cada instancia debe estar parametrizada con una cadena con el texto adecuado a mostrarnos. - Crea el atributo con el texto a mostrar que será asignado en el constructor con parámetro, que también debes crear.
- Crea el método
esOrdinalValido
que comprobará si el ordinal pasado se encuentra entre los ordinales válidos o no. - Crea el método
get
que devolverá la opción adecuada si el ordinal pasado es correcto y lanzará una excepción en caso contrario. - Crea el método
toString
que devuelva una cadena con el ordinal y el texto de la opción que luego utilizaremos para mostrar las diferentes opciones del menú. - Realiza un commit.
- Crea la clase de utilidades
Consola
que contendrá métodos que serán utilizados desde la vista para mostrar información por consola o leer información de la misma. - Crea el constructor adecuado.
- Crea el método
mostrarCabecera
que mostrará por pantalla el mensaje pasado por parámetro y luego mostrará un subrayado compuesto de guiones con su misma longitud. - Crea el método
mostrarMenu
que mostrará una cabecera informando del cometido de la aplicación y mostrará las diferentes opciones del menú. - Crea el método
leerCadena
que mostrará el mensaje pasado por parámetro y devolverá la cadena que lea por consola. - Crea el método
leerEntero
que hará lo mismo pero con un entero. - Crea el método
leerFecha
que hará lo mismo, pero con una fecha. Deberá repetir la lectura mientras la fecha no se haya podido crear correctamente. - Crea el método
elegirOpcion
que leerá un entero (utilizando el método anteriormente creado) asociado a la opción y devolverá la opción correspondiente. Si el entero introducido no se corresponde con ninguna opción deberá volver a leerlo hasta que éste sea válido. - Crea los demás métodos de la clase que harán uso de los métodos privados anteriormente creados y que son autodescriptivos. Si tienes alguna duda con alguno, no dudes en preguntarme.
- Realiza un commit.
- Crea la clase
Vista
que será la encargada de la interacción con el usuario y que se comunicará con el controlador para pedirle realizar las diferentes acciones. Crea el atributo correspondiente, aunque aún no existe su clase y te lo marcará como erróneo. - Crea el método
setControlador
que asignará el controlador pasado al atributo si éste 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 clase Consola y llamará al método ejecutar de esta clase que describiré a continuación. - Crea el método
terminar
que simplemente mostrará un mensaje de despedida por consola. - Crea el método
ejecutar
que dependiendo de la opción pasada por parámetro invocará a un método o a otro. - Crea los métodos asociados a cada una de las opciones. Estos métodos deberán mostrar una cabecera informando en que opción nos encontramos, pedirnos los datos adecuados y realizar la operación adecuada llamando al método correspondiente de nuestro controlador. También deben controlar todas las posibles excepciones.
- Realiza un commit.
- Crea la clase
Controlador
que será la encargada de hacer de intermediario entre la vista y el modelo. - Crea los atributos 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 que simplemente harán una llamada al correspondiente método del modelo.
- Realiza un commit.
- Crea la clase
MainApp
con 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.
-
Se valorará la corrección ortográfica tanto en los comentarios como en los mensajes que se muestren al usuario.