Modelos de Desarrollo de Programas Junio, 2001 Parte B. Ejercicio práctico Se trata de hacer un programa que gestione un dispensador automático de películas de un videoclub que da servicio las 24 horas. El cajero dispone de películas en formato VHS y DVD. Los datos que se almacenan de cada película son su título, el nombre del director, el género (acción, drama, comedia, terror, policiaca, etc.), el tipo de soporte (VHS ó DVD) y su código (un número de 10 dígitos que es único para cada película). El sistema tendrá dos tipos de usuarios: • Cliente: es la persona que alquila y devuelve películas. Se almacena su nombre completo, su DNI, el estado de su cuenta en pesetas y su código de identificación personal de 4 dígitos (PIN). • Gestor: es la persona que realiza altas y bajas de clientes. Se almacena su nombre completo y su PIN. El gestor realiza estas operaciones cuando los clientes se ponen en contacto con él. Las acciones que pueden realizarse son las siguientes: • Por parte de un cliente: • Consultar los datos de una película, dado el tipo de soporte y su título. En el resultado de la consulta se deberá indicar si la película está disponible. Si hay varias películas con el mismo título se mostrará información de todas ellas. • Alquilar una película, dado su código. No se podrá alquilar si no hay dinero en la cuenta para pagar el al menos 24 horas de alquiler. Habrá que anotar la fecha y hora del comienzo del alquiler. • Devolver una cinta, dado su código, momento en el que se descuenta el importe de alquiler de la cuenta del usuario. El importe depende del tiempo de alquiler y del tipo de soporte, según la siguiente tabla: Menos de 6 horas Entre 6 y 12 horas Entre 12 y 24 horas Más de 24 horas VHS 300 500 700 900 x día DVD 450 700 950 1050 x día Si en el momento de la devolución de la película el cliente no tiene saldo suficiente, se mostrará un mensaje de error indicando que debe ingresar dinero antes de devolver la película. • Ingreso de dinero en la cuenta del cliente • Por parte del gestor • Resumen del estado del sistema, que indica el número total de películas y, para cada película sus datos completos, el número de veces que ha sido alquilada y su estado actual (libre o alquilada). • Alta de un cliente, dados todos sus datos: nombre completo, DNI, PIN y saldo inicial. No puede haber dos clientes con el mismo nombre. • Baja de un cliente, dado su nombre completo y su DNI. No se puede dar de baja a un cliente que tiene alguna película alquilada. Todas las acciones de los usuarios del sistema (gestor y clientes) deberán ir acompañadas por su nombre completo y su PIN. Se pide B.1 Metodología estructurada (10 puntos): a. Dado el DFD con procesos finales de la figura siguiente, obtener el diagrama de estructura refinado. Para ello habrá que aplicar las técnicas de análisis de transformaciones y de transacciones de forma razonada. Por simplicidad el DFD no representa los almacenes de la aplicación (5 puntos). 1 Leer comando Comprobar cliente Consultar películas Alquilar película Comprobar gestor Devolver película Ingresar dinero Consultar estado Agregar cliente Suprimir cliente Mostrar salida b. A partir del diagrama de estructura, determinar la forma más óptima de implementar el sistema: descendente, ascendente o mixta. Explicar la respuesta. Se tendrá en cuenta la siguiente tabla de costes (5 puntos): Stub Driver Aferente Eferente 7 4 4 7 Transformación 9 9 B.2 Metodología orientada a objetos (10 puntos): Se considera el siguiente diagrama inicial de clases de análisis 0..1 Cliente 0..1 Gestor * 1 1 1 VideoClub 1 * 1 * Película VHS * Película DVD * Seguidamente se muestra el DIO correspondiente a alguna de las tareas que debe realizar el sistema: 2 :MC • :VideoClub :Cliente :Gestor :VHS :DVD VideoClub(datos) Gestor(datos) VHS(datos) DVD(datos) ‚ CnsPelicula(datos) IgualNombre(nc) ComprobarPIN(pin) IgualTitulo(ti) EscribirDatos() IgualTitulo(ti) EscribirDatos() ƒ Ingresar(datos) IgualNombre(nc) ComprobarPIN(pin) Ingresar(c) „ Estado(datos) IgualNombre(ng) ComprobarPIN(pin) EscribirEstado() EscribirEstado() … BajaCliente(datos) IgualNombre(ng) ComprobarPIN(pin) IgualNombre(nc) TieneAlquiladas() ~Cliente() † ~VideoClub() ~Cliente() ~Gestor() ~VHS() ~DVD() Las acciones que aparecen en el DIO se detallan a continuación: 1. Se crea un videoclub, con un nombre de fichero donde residen los datos de un gestor y los datos de todas las películas. 2. Un cliente consulta una película. Datos: nombre y PIN del cliente, tipo y título de la película. Se comprueba la identidad del cliente antes de realizar la búsqueda. 3. Un cliente ingresa dinero en su cuenta. Datos: nombre, PIN del cliente y cantidad ingresada. Se comprueba la identidad del cliente antes de admitir el ingreso. 4. El gestor desea obtener información sobre el estado del sistema. Datos: nombre y PIN del gestor. Se comprueba la identidad del gestor y después se solicita el estado de cada película. 5. El gestor da de baja a un cliente. Datos: nombre y PIN del gestor y nombre completo del cliente. Se comprueba la identidad del gestor y luego se elimina el cliente (si éste se encuentra en el sistema). 6. Se termina la ejecución del sistema, eliminando a los usuarios y películas. 3 a. Partiendo de los diagramas anteriores, realizar el DIO correspondiente a las siguientes tareas (5 puntos): • Un cliente alquila una película • Un cliente devuelve una película • El gestor da de alta a un cliente b. Detallar todas las clases, indicando sus atributos y operaciones. Cada operación deberá especificarse completamente, indicando argumentos y tipo de retorno (2 puntos). c. Indicar, de forma razonada, si se podría aplicar reutilización en el diagrama de clases anterior en función de las operaciones identificadas. Realizar el diagrama refinado de análisis aplicando las estructuras de generalización correspondientes (3 puntos) OBSERVACIONES: •Duración total del examen: 3 horas •El examen se compone de tres partes, que hay que entregar por separado: - A: Fundamentos de los Modelos de Desarrollo de Programas (1/3 de la nota) - B.1: Metodología estructurada (1/3 de la nota) - B.2: Metodología orientada a objetos (1/3 de la nota) •Fechas estimadas: - Publicación de notas: martes 26 de junio - Revisión del examen: jueves 28 de junio 4 SOLUCIÓN PARTE B.1 a. Dado el DFD con procesos finales, obtener el diagrama de estructura refinado. Para ello habrá que aplicar las técnicas de análisis de transformaciones y de transacciones de forma razonada. Por simplicidad el DFD no representa los almacenes de la aplicación (5 puntos). Se aplica el análisis de transacciones, siguiendo los pasos vistos en teoría 1. Factorizar el primer nivel Hay tres ramas en el primer nivel: una aferente (leer comando), una de transformación (tratar comando) y una eferente (mostrar salida). Videoclub Leer comando Tratar comando Mostrar salida 2. Definir el centro de transacciones Se considera que Tratar Comando es el centro de transacciones 3. Factorizar siguiendo el modelo transaccional Una de las posibles formas de factorizar sería la siguiente Videoclub Leer comando Analizar comando Comprobar cliente Tratar comando Mostrar salida Despachar comando Comprobar gestor Consultar Alquilar Devolver Ingresar Consultar película película película dinero estado Agregar Suprimir cliente cliente 4. Refinar Aplicando el criterio de Fan-Out, se agrupan los módulos hijos de “Despachar Comando” en dos grupos, en función del tipo de usuario. 5 Videoclub Leer comando Tratar comando Despachar comando Analizar comando Comprobar cliente Mostrar salida Comprobar gestor Tratar cliente Tratar gestor Consultar Alquilar Devolver Ingresar Consultar película película película dinero estado Agregar Suprimir cliente cliente Nota: por claridad se han omitido los flujos de comunicación entre módulos c. A partir del diagrama de estructura, determinar la forma más óptima de implementar el sistema: descendente, ascendente o mixta. Explicar la respuesta. Se tendrá en cuenta la siguiente tabla de costes (5 puntos): Stub Driver Aferente 7 4 Eferente 4 7 Transformación 9 9 1. Implementación descendente Módulo V LC TCO MS ACO DC CC CG TC TG Resto Implementado V V, LC V, LC, TCO V, LC, TCO, MS V, LC, TCO, MS, ACO V, LC, TCO, MS, ACO, DC V, LC, TCO, MS, ACO, DC, CC V, LC, TCO, MS, ACO, DC, CC, CG V, LC, TCO, MS, ACO, DC, CC, CG, TC Todos Stub Coste LC (7), TCO(9), MS(4) 20 0 ACO(9), DC (9) 18 0 CC (9), CG (9) 18 TC (9), TG (9) 18 0 0 CP (9), AP (9), DP (9), ID (9) 36 CE (9), AC (9), SC (9) 27 0 TOTAL 137 2. Implementación ascendente 6 Módulo CP AP DP ID CE AC SC CC CG TC TG ACO DC LC TCO MS Implementado CP CP, AP CP, AP, DP CP, AP, DP, ID CP, AP, DP, ID, CE CP, AP, DP, ID, CE, AC CP, AP, DP, ID, CE, AC, SC CP, AP, DP, ID, CE, AC, SC, CC CP, AP, DP, ID, CE, AC, SC, CC, CG CP, AP, DP, ID, CE, AC, SC, CC, CG, TC CP, AP, DP, ID, CE, AC, SC, CC, CG, TC, ... CP, AP, DP, ID, CE, AC, SC, CC, CG, TC, ... CP, AP, DP, ID, CE, AC, SC, CC, CG, TC, ... CP, AP, DP, ID, CE, AC, SC, CC, CG, TC, ... CP, AP, DP, ID, CE, AC, SC, CC, CG, TC, ... Driver TC.1 (9) TC.2 (9) TC.3 (9) TC.4 (9) TG.1 (9) TG.2 (9) TG.3 (9) AC.1 (9) AC.2 (9) DC.1 (9) DC.2 (9) TCO.1 (9) TCO.2 (9) V.1 (4) V.2 (9) V.3 (7) TOTAL Coste 9 9 9 9 9 9 9 9 9 9 9 9 9 4 9 7 137 3. Implementación mixta Módulo LC V TC MS AC DC CC CG TC TG Resto Implementado V, LC V, LC, TC V, LC, TC, MS V, LC, TC, MS, AC V, LC, TC, MS, AC, DC V, LC, TC, MS, AC, DC, CC V, LC, TC, MS, AC, DC, CC, CG V, LC, TC, MS, AC, DC, CC, CG, TC Todos Stub / Driver Coste V (4) 4 TC(9), MS(4) 13 AC(9), DC (9) 18 0 CC (9), CG (9) 18 TC (9), TG (9) 18 0 0 CP (9), AP (9), DP (9), ID (9) 36 CE (9), AC (9), SC (9) 27 0 TOTAL 134 En consecuencia, la implementación con menor coste es la mixta PARTE B.2 a. DIO para alquilar, devolver, alta cliente 7 :MC • :VideoClub :Cliente :Gestor :VHS :DVD Alquilar(datos) IgualNombre(nc) ComprobarPIN(pin) IgualIdentif(id) ó IgualIdentif(id) Libre() ó Libre() Importe24h() ó Importe24h() ComprobarSaldo(i) AnotarPelicula(id) AnotarAlquiler(n,f) ó ‚ AnotarAlquiler(n, f) Devolver(datos) IgualNombre(nc) ComprobarPIN(pin) IgualIdentif(id) ó IgualIdentif(id) Libre() ó Libre() ImporteTotal(f) ó ImporteTotal(f) AnotarLibre() ó AnotarLibre() ComprobarSaldo(i) DevolverPelicula(id) RetirarImporte(i) ƒ AltaCliente(datos) IgualNombre(ng) ComprobarPIN(pin) IgualNombre(nc) Cliente(datos) Explicación de las operaciones: 1. Alquilar película: primero se comprueba la identidad del cliente. Después se busca la película dado su código. Si se encuentra, se averigua si está libre y se le pide su precio para 24 horas. Ese importe es verificado en la cuenta del cliente. Si todo va bien, se anota el alquiler, tanto para el cliente como para la película. 2. Devolver película: primero se comprueba la identidad del cliente. Después se busca la película dado su código. Si se encuentra, se averigua si está ocupada y se le pide su precio para la fecha de fin de alquiler. Ese importe es verificado en la cuenta del cliente. Si todo va bien, se descuenta el importe y se devuelve la película (en cliente y película). 3. Alta de cliente: primero se comprueba la identidad del gestor. Después se comprueba que no hay clientes con el mismo nombre. Si todo va bien, se crea un nuevo objeto cliente con todos sus datos. 8 b. Detalles de las clases VideoClub VideoClub(char *fichero); ~VideoClub(); bool CnsPelicula(char *nc, int pin, char *titulo, int tipo); // true == OK bool Alquilar(char *nc, int pin, long id, Fecha fecha); // true == OK bool Devolver (char *nc, int pin, long id, Fecha fecha); // true == OK bool Ingresar(char *nc, int pin, int importe); // true == OK bool Estado(char *ng, int pin); // true == OK bool AltaCliente(char *ng, int pin, char *nc, int pinc, long DNI,int ingreso); // true = OK bool BajaCliente(char *ng, int pin, char *nc); // Ture = OK Cliente char * nombre; int PIN; long DNI; int cuenta; Cliente(char *nombre, int pin, long DNI, int ingreso); ~Cliente(); bool IgualNombre(char *nc); bool ComprobarPIN(int pin); void Ingresar(int ingreso); bool TieneAlquiladas(); bool ComprobarSaldo (int importe); void AnotarPelicula(long id); void DevolverPelicula(long id); void RetirarImporte(int importe); Gestor char * nombre; int PIN; Gestor(char *nombre, int pin); ~Gestor(); bool IgualNombre(char *ng); bool ComprobarPIN(int pin); VHS char * título; char *director; char *género; long id; VHS(char *título, char *director, char *genero, long id); ~VHS(); bool IgualTitulo(char *titulo); void EscribirDatos(); void EscribirEstado(); 9 bool IgualIdentif(int id); bool Libre(); int Importe24h(); void AnotarAlquiler(char * nc, Fecha f); int ImporteTotal(Fecha f); void AnotarLibre(); DVD char * título; char *director; char *género; long id; DVD(char *título, char *director, char *genero, long id); ~DVD(); bool IgualTitulo(char *titulo); void EscribirDatos(); void EscribirEstado(); bool IgualIdentif(int id); bool Libre(); int Importe24h(); void AnotarAlquiler(char * nc, Fecha f); int ImporteTotal(Fecha f); void AnotarLibre(); c. Reutilización Se puede reutilizar: • Película: VHS y DVD tienen exactamente las mismas operaciones. Cambia alguna implementación: las operaciones “Importe24h” e “ImporteTotal” serán virtuales en la clase “Película”, con implementaciones diferentes para VHS y DVD. El resto es igual. • Personas: cliente y gestor tienen algo en común, pero se utilizan en casos distintos. No parece interesante aplicar herencia. Diagrama resultante Cliente 0..1 Gestor * 1 1 1 VideoClub 1 * Película VHS * Película Película DVD 10