Vous êtes sur la page 1sur 9

Diseño y Programación Orientada al Objeto · Práctica 2 · Otoño 2018 · Estudios de Informática Multimedia y Telecomunicación

PRACTICA 2

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 23 de diciembre de 2018 a las 23:59.
Se debe entregar un fichero en formato ZIP que contenga:
1. Todos los ficheros, tanto los de la solución como los que se os facilitan con el
enunciado, dentro de los directorios correspondientes. No se pueden
modificar os ficheros de prueba.
2. Las pruebas se deben poder ejecutar directamente con lo que entregáis, en
caso contrario no se evaluará. Por lo tanto, verificad vuestra entrega antes de
enviarla.
3. Es posible que algunos de los métodos no queden implementados. Sólo se
deben implementar aquellos que sean necesarios para cumplir con lo que se
estipula en el enunciado y los necesarios para que las pruebas pasen
correctamente.
Presentación
Durante la segunda práctica codificaremos el comportamiento de un conjunto de clases
a partir de un diagrama UML y una descripción del problema que se quiere resolver.
La práctica consta de diferentes ejercicios y pruebas unitarias y de funcionalidad
programadas con JUnit. La calificación máxima de la práctica estará relacionada con las
pruebas que se pasen correctamente.
Lo primero que hay que destacar es que esta práctica es un ejercicio académico, el
objetivo es la codificación de una aplicación de cierta complejidad utilizando la
Programación Orientada al Objeto.
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:
• Saber implementar un modelo de clases de una cierta complejidad cumpliendo
los principios de la programación orientada al objeto (encapsulación, herencia y
polimorfismo)
• Iniciar al estudiante en el uso de librerías de terceros
• Trabajar con excepciones
• Implementar interfaces
• 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 2 · 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 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:

Criterios de valoración
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.

2
Diseño y Programación Orientada al Objeto · Práctica 2 · Otoño 2018 · Estudios de Informática Multimedia y Telecomunicación

Enunciado

Tomando como punto de partida la solución de la práctica anterior, se quiere completar


la implementación de la aplicación propuesta.
En esta práctica incluiremos dos conceptos nuevos a nuestro diseño:
• Excepciones: Se quieren tratar los errores mediante excepciones. Todas las
excepciones serán del tipo RescueException. Cada ejercicio indica en qué
casos hay que lanzar una excepción, y las pruebas unitarias verificarán que se
lanzan las excepciones correctas.
• Patrón Observador: El patrón observador es una estrategia de programación
donde una o más clases observadoras registran su interés de ser notificadas
sobre los cambios que se producen en otra clase sujeto.
En términos prácticos el sujeto almacena una lista de observadores o listeners,
definidos por una interfaz, no por objetos o clases concretas. Cuando sucede
algún evento que debe ser notificado, el sujeto recorre todos los observadores
registrados y les notifica el evento (llamada al método adecuado).
Las clases observadoras implementan esta interfaz y se registran para recibir las
notificaciones. El registro se realiza mediante la llamada a métodos existentes
en la clase sujeto del tipo addListener o addXXXListener si se quieren tener
varios observadores y setListener o setXXXListener si sólo se quiere tener un
observador.
Para reflejar estos cambios, se ha modificado el diagrama UML original de la práctica
anterior. Concretamente, los cambios son:
• Adición de la interfaz EventListener
• Adición de la excepción RescueException
• Adición del método addListener en la clase PetRescue para registrar los
observadores.
Podéis ver el diagrama UML final a continuación:

3
Diseño y Programación Orientada al Objeto · Práctica 2 · Otoño 2018 · Estudios de Informática Multimedia y Telecomunicación

4
Diseño y Programación Orientada al Objeto · Práctica 2 · Otoño 2018 · Estudios de Informática Multimedia y Telecomunicación

A continuación, se detallan los diferentes ejercicios a realizar. Leed atentamente las


indicaciones que se dan, tanto a nivel de formato de entrega como clarificaciones para
facilitar la realización de los ejercicios. Hay que implementar todas las clases y métodos
necesarios para que la prueba pase correctamente (tanto los que se comentan en el
enunciado como los que no).
Todas las clases tienen que encontrarse dentro del package edu.uoc.dpoo.rescue y
compilar a la primera sin ninguna modificación. Para obtener la puntuación del
ejercicio, será necesario que todas las pruebas de la correspondiente clase de prueba
pasen correctamente.

Ejercicio 1: Control de errores [10%]


En la práctica anterior se implementaron distintos métodos de la clase PetRescue. En
este ejercicio añadiremos el control de errores necesario a algunos de estos métodos.
Con el enunciado os hemos facilitado la clase RescueException, la cual contiene
ejemplos en su interior de cómo utilizarla.
Modifica la clase PetRescue para que se controlen las siguientes situaciones:

Método Tipo de error predefinido Motivos/Acciones

registerVolunteer DUPLICATED_VOLUNTEER Ya existe un voluntario con este correo


electrónico.

registerShelter DUPLICATED_HOME Ya existe un hogar con este correo


electrónico.

registerAdoption DUPLICATED_HOME Ya existe un hogar con este correo


electrónico.

addType DUPLICATED_TYPE Ya existe este tipo.

Nota: Para comprobar el correcto funcionamiento de esta tarea disponéis de la clase de


pruebas PR2_Ex1_Test.

5
Diseño y Programación Orientada al Objeto · Práctica 2 · Otoño 2018 · Estudios de Informática Multimedia y Telecomunicación

Ejercicio 2: Gestión de rescates [30%]


El sistema no guarda una lista explícita de animales, sino que la información de los
animales rescatados se encuentra en las alertas que se generan cuando se rescata un
nuevo animal. Al registrar un nuevo rescate, el sistema genera automáticamente una
alerta de tipo NEW_RESCUE, que contiene los datos del animal. Si hay voluntarios que
la puedan atender, se les asignará automáticamente, de lo contrario quedará sin
asignar.

Tarea 1: Registrar un nuevo rescate


Implementa el método newRescue de PetRescue, a fin de gestionar el registro de un
nuevo rescate.
A partir del tipo de animal (type), el código de su chip (id), su nombre (name) y si se trata
de un perro potencialmente peligroso (pdd) o no, este método genera una nueva alerta
(Alert) de tipo NEW_RESCUE para el animal rescatado. Esta alerta guardará el
momento de su creación (createdAt) e inicialmente estará abierta (closedAt será null) y
no estará asignada a ningún voluntario (assigned y assignedAt serán nulls).
Nota: Para comprobar el correcto funcionamiento de esta tarea disponéis de la clase de
pruebas PR2_Ex2_1_Test.

Tarea 2: Buscar un animal


Implementa el método findPet de PetRescue, que busca si existe un animal con un id
dado. En el caso de que no exista, este método devolverá un valor null. Si existen
diferentes alertas para este animal, se devolverá la información guardada en primera
alerta.
Nota: Para comprobar el correcto funcionamiento de esta tarea disponéis de la clase de
pruebas PR2_Ex2_2_Test.

Tarea 3: Gestionar las alertas abiertas


Implementa el método closeAlert de PetRescue, que, dada una alerta, la da por
cerrada, asignándole la fecha actual como fecha de cierre (closedAt)
Implementa el método getPetAlerts de PetRescue, que devuelve una lista de todas las
alertas "abiertas" para un animal dado. El animal se identifica con el código de su chip
(id).
Implementa el método getUnassignedAlerts de PetRescue, que devuelve todas las
alertas abiertas que no están asignadas.

Nota: Para comprobar el correcto funcionamiento de esta tarea disponéis de la clase de


pruebas PR2_Ex2_3_Test.

6
Diseño y Programación Orientada al Objeto · Práctica 2 · Otoño 2018 · Estudios de Informática Multimedia y Telecomunicación

Ejercicio 3: Gestión de acogidas [40%]


Rescatado un animal, debemos asignarle un voluntario que se encargue de él y una
casa de acogida donde llevarlo.

Tarea 1: Asignación de un voluntario


Implementa el método findVolunteer de PetRescue para que, dado el identificador de
un animal, busque los voluntarios que están disponibles para llevar el animal a la casa
de acogida. Con el fin de seleccionar los voluntarios nos fijaremos en:
1. En caso de que el animal sea un perro potencialmente peligroso (pdd), el
voluntario los ha de aceptar.
2. El voluntario no puede tener asignada ninguna alerta abierta.
Con el fin de saber si el voluntario tiene alertas abiertas, implementad el método
getVolunteerAlerts de PetRescue que, dado el correo electrónico de un voluntario, nos
devuelve la lista de alertas abiertas que tiene asignadas.
Implementa el método assignAlert de PetRescue para que, dada una alerta y un
voluntario, asigne la alerta a este voluntario. Para ello, debéis delegar la acción en el
método assign de la clase Alert.

Nota: Para comprobar el correcto funcionamiento de esta tarea disponéis de la clase de


pruebas PR2_Ex3_1_Test.

Tarea 2: Asignar una casa de acogida


Implementa el método isActive de Stay, que devuelve cierto (true) si la estancia es
activa (finishedAt es null) o falso (false) en caso contrario.
Implementa el método getCurrentPets de Home, que devuelve la lista de animales que
están alojados en la casa (tienen una estancia activa).
Implementa el método accept de Shelter para que nos indique si puede aceptar un
animal dado. Un hogar de acogida podrá aceptar un animal si:
1. En caso de que el animal sea un perro potencialmente peligroso (pdd), la casa
los acepta.
2. La casa todavía tiene capacidad para aceptarlo.
3. La casa acepta este tipo de animal.
Implementa el método findHome de PetRescue para que, dado el identificador de un
animal, busque las casas de acogida donde se puede alojar este animal.
Implementa el método assignHome de PetRescue, para que dado un hogar y un
animal, se asigne este anima a este hogar (hay que generar una estancia que comienza
en el momento de la asignación y sin finalización).

7
Diseño y Programación Orientada al Objeto · Práctica 2 · Otoño 2018 · Estudios de Informática Multimedia y Telecomunicación

Implementa el método getCurrentHome de PetRescue, que, dado el identificador de


un animal, nos devuelve la casa donde se encuentra. En caso de que no esté en ninguna
casa (no hay estancias activas), nos devolverá un valor null. Hay que delegar esta
funcionalidad al método getCurrentHome de Pet.
Nota: En todo momento podéis asumir que un animal sólo está en una casa. Si tiene
más de una estancia activa (Stay), podéis devolver la primera.
Nota: Para comprobar el correcto funcionamiento de esta tarea disponéis de la clase de
pruebas PR2_Ex3_2_Test.

Ejercicio 4: Gestión de eventos [20%]


Tal como se ha explicado previamente en el enunciado, en esta práctica se ha
modificado el diagrama UML con respecto a la práctica anterior para implementar el
patrón Observador.
Este patrón define un conjunto de eventos sobre los cuales uno o más observadores
quieren ser notificados. Los observadores se registran en aquellos componentes de los
que quieren recibir notificaciones, y estos los notifican cada vez que uno de los eventos
sucede. Para hacerlo, guardan una lista de todos los observadores interesados.
La lista de eventos se define mediante una interfaz, que los observadores deben
implementar. En nuestro caso, el observador será la clase MailBox, el cual se registrará
en la clase PetRescue para recibir notificaciones sobre los eventos definidos en la
interfaz EventListener.

Tarea 1: Gestión de observadores


Implementa el método addListener de la clase PetRescue para que guarde una lista
de los observadores registrados. Deberás actualizar la definición de la clase PetRescue
con la nueva relación del diagrama UML entre EventListener y PetRescue.

Tarea 2: Implementación de los observadores y eventos


Modifica la clase MailBox para que implemente la interfaz EventListener. En concreto,
queremos que:
1. Cuando se asigne una alerta a un voluntario se le envíe un correo con los datos
del animal relacionado. El título del correo (subject) será "New Alert", y en el
cuerpo del correo (body) dr indicará el identificador del animal.
2. Cuando se asigna un animal a una casa de acogida, envíe un correo a la casa
con los detalles del animal relacionado. El título del correo (subject) será "New
Stay", y en el cuerpo del correo (body) se indicará el identificador del animal.

Modificad los métodos assignAlert y assignHome de PetRescue, para que se generen


los eventos onNewAlert y onNewHome respectivamente. Estos métodos se
encargarán de enviar los correos.

8
Diseño y Programación Orientada al Objeto · Práctica 2 · Otoño 2018 · Estudios de Informática Multimedia y Telecomunicación

Nota: Os puede resultar de ayuda definir métodos auxiliares para gestionar las
notificaciones.
Nota: Para comprobar el correcto funcionamiento de este ejercicio disponéis de la clase
de pruebas PR2_Ex4_Test.

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.

Vous aimerez peut-être aussi