7. Identificación y modelado
7.5. Modelado de aspectos dinámicos
7.5.2. Diagrama de Secuencias de una operación del Problema
En este apartado sólo vamos a representar el diagrama de secuencias del caso de uso Solicitar Alquiler, que estará disponible para los clientes del sistema. Los otros tres casos de uso, Añadir Vehículos, Quitar Vehículo y Devolver Listado, son bastante más sencillos que el que hemos elegido, y por eso, animamos al lector a que lleve a cabo su realización tras finalizar la lectura de este apartado. Como ya comentamos al identificar las operaciones de nuestras clases, Soli- citar Alquiler es un método de la clase Empresa de Alquiler de Vehículos que ejecutará varias operaciones dentro del sistema y que se explica detalladamente a continuación.
En primer lugar, debe recorrer las instancias de Vehículos, buscando uno que sea del tipo y característica solicitado, y que esté disponible en las fechas pedidas. Para realizar este primer cometido, llama a la operación privada Bus- car Alquiler. Esta operación se compone de una serie de llamadas iterativas que, en primer lugar, se encaminan a encontrar una instancia de Vehículos con las propiedades requeridas (operaciones públicas de la clase Vehículos, Obtener Tipo y Obtener Característica), y, en segundo, a comprobar si la instancia de Vehículo, en caso de encontrar una, está disponible en las fechas pedidas. Para comprobar que un vehículo está libre en las fechas solicitadas, Buscar Vehículo llama a la operación privada Comprobar Disponibilidad, que deberá recorrer todas las instancias de la clase Alquiler, chequeando que el vehículo encontrado
CAPÍTULO 7. IDENTIFICACIÓN Y MODELADO
está libre en las fechas requeridas (operación Comprobar Solapamiento de la clase Alquiler).
Figura 7.19: Diagrama de Secuencias de Solicitar Alquiler
En caso de no encontrarse una instancia de vehículo con las características solicitadas, o de estar las instancias encontradas ocupadas, Buscar Alquiler debe comunicar la situación a Solicitar Alquiler para que le indique al cliente que no es posible realizar la operación.
Si Buscar Alquiler encuentra una instancia de Vehículos que cumpla to- dos los requisitos, Solicitar Alquiler debe continuar para formalizar el alquiler. Para este segundo cometido, llama a la operación privada Calcular Importe. Ésta, obtendrá el coste del alquiler a partir de la duración del mismo, y del precio del vehículo encontrado (operación privada de Vehículos, Obtener Pre-
CAPÍTULO 7. IDENTIFICACIÓN Y MODELADO
cio Día). Una vez que Solicitar Alquiler tiene el importe del alquiler, llama a la operación Crear Alquiler para concretar la operación. Crear Alquiler llama en primer lugar a la operación privada de Vehículos, Obtener Nº Vehículo, y a continuación crea una nueva instancia de Alquiler con todos los datos nece- sarios. Para terminar, Solicitar Alquiler devuelve al cliente el Nº de Vehículo que ha alquilado.
El diagrama de secuencias de toda la operación Solicitar Alquiler se muestra en la figura 7.19
7.6. Resumen
En este capítulo se ha presentado una propuesta de identificación de clases y se ha introducido UML como notación de modelado. La identificación de clases no es algo trivial, al contrario, es una tarea crítica en el diseño de un sistema, ya que si partimos de una mala identificación, este defecto se va a ir arrastrando hasta el sistema final implementado. Como hemos visto, el proceso de identifi- cación parte de un análisis gramatical del problema para la obtención de una serie de candidatos a ser clases o atributos (sustantivos), y a ser operaciones o relaciones (verbos). Es conveniente no quedarse sólo en el análisis gramatical, ya que diferentes estilos de escritura pueden llevar a diferentes modelados. Por eso, el siguiente paso debe ser evaluar los candidatos obtenidos, aceptándolos o rechazándolos según una serie de criterios. En el caso de la identificación de operaciones, hemos visto que existe una herramienta denominada Diagrama de Casos de Uso que puede sernos muy útil. Hay que señalar que puede ser igual de nefasto para el sistema olvidarse de alguna clase o una operación como tener clases u operaciones inadecuadas.
A lo largo de todo el capítulo, se ha utilizado un problema de un posible sistema real, que se ha modelado para ilustrar todos los métodos presentados. Así, una vez obtenida la identificación de clases, atributos y operaciones, hemos visto como se puede representar gráficamente el modelo obtenido a nivel estático y dinámico, con la ayuda del diagrama de clases, en el primer caso, y, del diagrama de secuencias y de casos de uso en el segundo.
Capítulo 8
Otras características de C++
En este capítulo se realiza una breve exposición de características del len- guaje C++ que no están directamente relacionadas con el paradigma de progra- mación orientada a objetos, pero que tienen gran relevancia dentro del lenguaje. La finalidad de este apartado es servir de punto de partida hacia una mayor profundización en el lenguaje C++.
8.1. Programación genérica
La genericidad es una construcción interesante en un lenguaje orientado a objetos. No es de uso exclusivo en este tipo de lenguajes, pero en ellos adquie- re un significado más completo. La genericidad es uno de los conceptos más importantes utilizados en la reutilización; permite la utilización de tipos como parámetros en la definición de una clase o función, de forma que no requiere la declaración explícita del tipo de algún parámetro o parámetros; y así, per- mite que esta clase o función pueda adaptarse a distintos tipos de datos en su utilización.
La principal ventaja de la utilización de plantillas en funciones y clases es poder utilizarlas para distintos tipos de datos sin modificar la definición de dicha función o clase. Normalmente las plantillas se declaran en un fichero cabecera.
Veremos a continuación el formato de definición de plantillas de funciones y de clases así como ejemplos de usos de ambos tipos.
8.1.1. Formato de plantilla de función
Una plantilla de función se define escribiendo la palabra reservada template seguida del nombre de la función. Si la función puede recibir como parámetros distintos tipos de datos, o si el tipo de la función es un tipo no conocido previa-