Diseño y Programación Orientada al Objeto · Práctica 1 · Otoño 2018 · Estudios de Informática Multimedia y Telecomunicación PRACTICA 1 Formato y fecha de entrega La entrega se debe efectuar en el apartado “Entrega y registro de EC” del aula de teoría antes del día 18 de noviembre de 2018 a las 23:59. Se debe entregar un fichero en formato ZIP que contenga un directorio ‘src’ con el código resultante de los ejercicios, respetando la jerarquía de directorios marcada por los paquetes (packages). Presentación Durante la primera práctica codificaremos un conjunto de clases a partir de un diagrama UML y una descripción del problema que se quiere resolver. En el primer ejercicio se crearán las estructuras de todas las clases. Durante el resto de ejercicios se pedirá una serie de funcionalidades que se deberá implementar, modificando sólo las clases implicadas. En la segunda práctica de la asignatura se trabajará sobre este mismo problema, por lo tanto, es especialmente importante dedicar el tiempo necesario a entender el enunciado y la solución UML propuesta. Durante la implementación es normal que surjan dudas relacionadas con el lenguaje, tanto con la sintaxis como en la forma de trabajar orientada a objetos. Dirigid vuestras dudas sobre la programación al foro del laboratorio de Java. Objetivos Los objetivos de esta práctica son: • Consolidar los conceptos vistos anteriormente • Iniciar al estudiante en el uso de librerías de terceros • Codificar un programa a partir de una descripción y diagrama UML • Finalizar la ingeniería del software con las fases de diseño e implementación • Aprender el funcionamiento de la biblioteca JUNIT y las pruebas unitarias sobre el código 1 Diseño y Programación Orientada al Objeto · Práctica 1 · Otoño 2018 · Estudios de Informática Multimedia y Telecomunicación Competencias Transversales • Capacidad de comunicación en lengua extranjera. Específicas • Capacidad de diseñar y construir aplicaciones informáticas mediante técnicas de desarrollo, integración y reutilización. Recursos Para realizar esta práctica disponéis de los siguientes recursos: Materiales • Módulo 4: Estructura de objetos • Módulo 5: Herencia y polimorfismo • Módulo 7: El lenguaje de programación Java. Bloque I y Bloque II • El propio enunciado de la Práctica: Este enunciado explica cómo realizar ciertas partes de la programación. Complementarios • Buscador web: La forma más rápida de obtener información actualizada sobre UML y Java es mediante un buscador web. • Tutorial de Java: La web de Oracle tiene tutoriales interesantes sobre el lenguaje Java. A continuación, hay algunos links que pueden ser útiles durante esta práctica: Collections: http://docs.oracle.com/javase/tutorial/collections/ Enums: http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html Packages: http://docs.oracle.com/javase/tutorial/java/package/packages.html Date: https://docs.oracle.com/javase/8/docs/api/java/util/Date.html • Tutorial de JUnit. Junto con la práctica se entrega un documento con un tutorial de JUnit que explica cómo funciona y cómo se utiliza para verificar el correcto funcionamiento de la práctica. 2 Diseño y Programación Orientada al Objeto · Práctica 1 · Otoño 2018 · Estudios de Informática Multimedia y Telecomunicación Criterios de valoración Cada ejercicio indica qué se pide y qué materiales se deben entregar. De entrada, el código deberá compilar, en caso contrario no se puntuará el ejercicio. Si el código compila y pasa los juegos de prueba, se tendrá en cuenta los siguientes factores: • El código pasa los juegos de prueba públicos. • El código pasa los juegos de prueba privados. O sea, obtiene el resultado esperado dadas una condiciones y datos de entrada diseñados para probar algunas situaciones del funcionamiento normal y otros casos especiales. El formato de los juegos de prueba privados, será similar al de los públicos, entregados con el enunciado. • Sigue la guía de estilo y buenas prácticas de programación. • Está correctamente documentado, valorando especialmente la utilización de comentarios en inglés. • El grado de optimización en tiempos y recursos. • El código es modular y estructurado, teniendo en cuenta la programación orientada a objetos. Enunciado En previsión al aumento de los abandonos durante las fiestas de Navidad, una pequeña protectora nos ha pedido ayuda para diseñar e implementar un sistema de gestión de los rescates de animales de compañía. Esta aplicación (PetRescue) debe facilitar la coordinación entre los voluntarios (Volunteer) que ayudan a la protectora y se encargan de rescatar a los animales (Pet), y los hogares (Home) donde irán a vivir. Inicialmente, todas las mascotas rescatadas irán una a un hogar de acogida (Shelter), para finalmente ir a vivir con una familia de adopción (Adoption). Por tanto, las estancias (Stay) de los animales en casas de acogida son temporales, mientras que se espera que las estancias en las casas de adopción sean permanentes. Para poder avisar a los voluntarios cuando haya alguna situación que les afecte, la aplicación tendrá un sistema de alertas (Alert). A nivel funcional, el sistema debe permitir: • Gestionar los voluntarios. Para cada voluntario guardaremos el nombre, correo electrónico (que identificará al voluntario en el sistema) y si puede aceptar perros potencialmente peligrosos (Potential Dangerous Dogs [PDD]), los cuales requieren tener una licencia especial. 3 Diseño y Programación Orientada al Objeto · Práctica 1 · Otoño 2018 · Estudios de Informática Multimedia y Telecomunicación • Gestionar los hogares. Para cada hogar tendremos el nombre del responsable, la dirección, el correo electrónico (que identificará el hogar en el sistema), si tiene jardín o no y si acepta perros potencialmente peligrosos. También tendremos la lista de tipos de animales que puede aceptar (PetType). En el caso de los hogares de acogida, además necesitamos saber la capacidad que tienen (número de animales que pueden acoger), la duración máxima en días de la acogida y si tienen servicio de veterinario. En el caso de las casas de adopción, guardaremos la edad en años de la mascota que buscan. • Llevar el registro de animales que han pasado por la protectora. Todos los animales deben estar identificados con un chip (si no lo tienen cuando se rescatan, se les pone uno). El chip identifica al animal con un código con el formato: 100-200-300-400-500 (5 bloques numéricos de 3 dígitos). Además del identificador, para cada animal guardaremos su tipo, si es un perro potencialmente peligroso, el nombre, la edad en años y la fecha en que se ha rescatado. En esta primera versión, sólo tendremos en consideración gatos (CAT) y perros (DOG). • Gestionar las acogidas de animales en los hogares de acogida y adopción. Queremos saber para cada animal a qué hogares ha ido, y para cada una de ellas, la fecha de entrada, y si ha salido, la fecha de salida. • Un sistema de alertas asociadas a un animal. Para cada alerta queremos saber cuándo se ha creado la alerta, cuándo se ha asignado a un voluntario (inicialmente no están asignadas a nadie) y cuándo se da por cerrada. Las alertas deben poder registrar los siguientes casos: • • o Cuando se rescata un nuevo animal (NEW_RESCUE). o Cuando hay una nueva adopción (NEW_ADOPTION). o Cuando se ha asignado un hogar de acogida (SHELTERING_START). o Cuando se acerca la fecha límite de la acogida (SHELTERING_LIMIT). La aplicación deberá facilitar la búsqueda de voluntarios que se puedan asignar a las alertas. Para asignar una alerta a un voluntario se tiene en cuenta: o No tiene ninguna otra alerta asignada y no cerrada. o En casos de perros potencialmente peligrosos, es necesario que el voluntario disponga de la licencia correspondiente. La aplicación deberá facilitar la búsqueda de hogares donde llevar un animal rescatado. Para asignar un hogar, se tendrá en cuenta: o Al ser rescatado, se le deberá asignar un hogar de acogida. Además, se priorizará los hogares de acogida que tengan servicio de veterinario. o Cuando finaliza la acogida, se priorizará los hogares de adopción, y en caso de no tener ninguno disponible, se buscará otro hogar de acogida, priorizando los que permiten estancias más largas. o En caso de perros potencialmente peligrosos, será necesario que el hogar pueda acogerlos. o En caso de tratarse de un hogar de acogida, será necesario que no esté ocupado (no se haya llegado a su capacidad). 4 Diseño y Programación Orientada al Objeto · Práctica 1 · Otoño 2018 · Estudios de Informática Multimedia y Telecomunicación o En caso de que el animal haya estado en otra casa de adopción con jardín, se priorizará una nueva casa de adopción que también lo tenga. o Para casas de adopción, se tendrá en cuenta que la edad del animal sea menor o igual a la solicitada. Después de hacer el análisis de requerimientos del sistema, hemos llegado al siguiente al siguiente diagrama UML. 5 Diseño y Programación Orientada al Objeto · Práctica 1 · Otoño 2018 · Estudios de Informática Multimedia y Telecomunicación 6 Diseño y Programación Orientada al Objeto · Práctica 1 · Otoño 2018 · Estudios de Informática Multimedia y Telecomunicación A continuación, se detallan los distintos ejercicios que se deben realizar. Leed las indicaciones que se os dan, tanto a nivel de formato de entrega como a clarificaciones para facilitar la realización de los ejercicios. No tenéis que implementar todos los métodos, sólo tenéis que implementar los necesarios para que todas las pruebas proporcionadas funcionen correctamente. Ejercicio 1: Transformación a lenguaje Java [40%] A partir del enunciado del problema y su diagrama UML, se pide que codifiquéis el esquema básico de todas las clases y compiléis su resultado. Para cada clase debe codificar: • • • • • La definición de la clase. Cada clase se codifica en un fichero .java con el mismo nombre. La definición de sus atributos. Se definen tanto los atributos explícitos como los que provienen de relaciones entre clases. Utilizaremos el tipo List para declarar las relaciones de cardinalidad múltiple. La definición de su constructor. Los constructores no están definidos en el diagrama por lo tanto será necesario que hagáis una propuesta para cada clase. La definición de sus métodos. Si el método debe devolver un valor se puede devolver 0 en caso de que espere un número, null en caso de que espere un objeto o false en caso de booleanos. No tenéis que implementar las funcionalidades de estos métodos en este ejercicio. Añadid los métodos get y set para todos los atributos privados de las clases, tanto los explícitos como los implícitos. Todas las clases tienen que estar en el package edu.uoc.dpoo.rescue y compilar a la primera sin ninguna modificación. Debéis entregar todas las clases en ficheros de texto con la extensión .java separados. No peguéis el código en archivos de Word o PDF. No enviéis el resultado de la compilación (archivos .class). Nota: Fijaros en la relación asociativa entre Home y Pet. Debéis decidir cómo implementáis esta relación y la clase Stay asociada. Nota: Fijaros que el método accept de clase Home es abstracto, lo que hace abstracta esta clase. Tened en cuenta que las clases que hacen la especialización deberán implementar este método. 7 Diseño y Programación Orientada al Objeto · Práctica 1 · Otoño 2018 · Estudios de Informática Multimedia y Telecomunicación Ejercicio 2: Gestión de voluntarios [15%] Implementa los siguientes métodos de la clase PetRescue: • registerVolunteer: Añade un nuevo voluntario (Volunteer) al sistema. Si ya existe un voluntario con el mismo correo electrónico, el voluntario no se añadirá y se retornará un valor null. En caso contrario se devuelve el nuevo voluntario creado. • getRegisteredVolunteers: Devuelve la lista de voluntarios registrados en el sistema. Para probar el correcto funcionamiento del código desarrollado en esta tarea, dispone de la clase de pruebas: PR1_Ex2_Test. Tened en cuenta que, si no se ha definido los métodos get y set en el ejercicio 1, las pruebas pueden fallar o incluso no compilar. Ejercicio 3: Envío de Correos [15%] Queremos que el sistema pueda enviar correos electrónicos, y para simular el envío de los correos, hemos definido las clases Mailbox y Mail. Implementa los siguientes métodos de la clase Mailbox: • SendMail: Añade un nuevo correo electrónico (Mail) en el buzón de correo (Mailbox) • getSentMails: Devuelve una lista con todos los correos enviados a una determinada dirección de correo electrónico. Para probar el correcto funcionamiento del código desarrollado en esta tarea, dispone de la clase de pruebas: PR1_Ex3_Test. Tened en cuenta que, si no se ha definido los métodos get y set en el ejercicio 1, las pruebas pueden fallar o incluso no compilar. 8 Diseño y Programación Orientada al Objeto · Práctica 1 · Otoño 2018 · Estudios de Informática Multimedia y Telecomunicación Ejercicio 4: Gestión de hogares [30%] Implementa los siguientes métodos de la clase PetRescue: • registerShelter: Añade un nuevo hogar de acogida (Shelter) al sistema. Si ya existe un hogar (de acogida o adopción) con el mismo correo electrónico, el hogar de acogida no se añadirá y se retornará un valor null. En caso contrario se devuelve el nuevo hogar creado. Inicialmente no hay ningún tipo de animal asignado. • registerAdoption: Añade un nuevo hogar de adopción (Adoption) al sistema. Si ya existe un hogar (de acogida o adopción) con el mismo correo electrónico, el hogar de adopción no se añadirá y se retornará un valor null. En caso contrario se devuelve el nuevo hogar creado. Inicialmente no hay ningún tipo de animal asignado. • getRegisteredHomes: Devuelve una lista con todos los hogares (de acogida y adopción) que existen en el sistema. Implementa los métodos siguientes de la clase Home: • addType: Añade un nuevo tipo de animal (PetType) a la lista de animales permitidos. Si ya existe, no se añadirá. • removeType: Elimina un tipo de animal (PetType) de la lista de animales permitidos. Si no existe, simplemente no se elimina nada. Para probar el correcto funcionamiento del código desarrollado en esta tarea, dispone de la clase de pruebas: PR1_Ex4_Test. Tened en cuenta que, si no se ha definido los métodos get y set en el ejercicio 1, las pruebas pueden fallar o incluso no compilar. 9 Diseño y Programación Orientada al Objeto · Práctica 1 · Otoño 2018 · Estudios de Informática Multimedia y Telecomunicación JUNIT Junto con la práctica se entregan una serie de clases y librerías que forman parte de la biblioteca de JUnit, y que sirven para realizar pruebas unitarias y de funcionalidad sobre el código. Desde Eclipse puedes ejecutar todas las pruebas a la vez ejecutando la clase de pruebas TestAll, o puedes probar funcionalidad a funcionalidad ejecutando cada una de las clases de pruebas que se proporcionan. Podéis crear vuestros propios ficheros de prueba, pero para evitar errores en el resultado de la práctica, no modifiquéis las pruebas que se proporcionan. Hay una clase de pruebas para cada funcionalidad que se debe codificar. El ejercicio será correcto cuando todas las pruebas se hayan superado satisfactoriamente, y siguiendo las indicaciones del enunciado. Codificación Cuando empecéis la programación de la práctica sugerimos seguir esta sencilla estrategia de codificación: 1. Estudiar y comprender el diagrama de clases UML que se proporciona. 2. Iniciar la programación de la funcionalidad en el mismo orden en que se ha descrito. Se pide codificar los métodos de las clases necesarios para realizar la funcionalidad descrita anteriormente. A partir del enunciado del problema y su diagrama UML se pide que codifiquéis el programa Java que cumpla la funcionalidad requerida. Todas las clases tienen que encontrarse al package edu.uoc.dpoo.rescue y compilar a la primera sin ninguna modificación. Debéis entregar todas las clases en ficheros de texto con la extensión .java separados. No peguéis el código en archivos de Word o PDF. No enviéis el resultado de la compilación (archivos .class) 10 Diseño y Programación Orientada al Objeto · Práctica 1 · Otoño 2018 · Estudios de Informática Multimedia y Telecomunicación Nota: Propiedad intelectual A menudo es inevitable, al producir una obra multimedia, hacer uso de recursos creados por terceras personas. Es por tanto comprensible hacerlo en el marco de una práctica de los estudios del Grado, siempre que ello se documente claramente y no suponga plagio en la práctica. Por lo tanto, al presentar una práctica que haga uso de recursos ajenos, se presentará junto con ella un documento en el que se detallen todos ellos, especificando el nombre de cada recurso, su autor, el lugar donde se obtuvo y el su estatus legal: si la obra está protegida por copyright o se acoge a alguna otra licencia de uso (Creative Commons, GNU, GPL ...). El estudiante deberá asegurarse de que la licencia que sea no impide específicamente su uso en el marco de la práctica. En caso de no encontrar la información correspondiente deberá asumir que la obra está protegida por copyright. Deberán, además, adjuntar los archivos originales cuando las obras utilizadas sean digitales, y su código fuente si corresponde. Otro punto a considerar es que cualquier práctica que haga uso de recursos protegidos por copyright no podrá en ningún caso publicarse en Mosaic, la revista del Graduado en Multimedia en la UOC, a no ser que los propietarios de los derechos intelectuales den su autorización explícita. 11