Subido por germancaeiro

20181 DPOO Prac1 ES

Anuncio
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
Descargar