Saltar la navegación

e.- Obtener relaciones.

Con las clases ya extraídas y parcialmente definidas (aún faltan por añadir métodos y atributos inferidos de posteriores refinamientos y de nuestro conocimiento) podemos empezar a construir relaciones entre ellas.

Comenzaremos por las clases que hacen referencia a la estructura de los Ciclos, cada Ciclo se compone de una o más competencias profesionales, que no tienen la capacidad de existir por si mismas, es decir, la competencia no tiene sentido sin su ciclo, por lo que vamos a crear una relación entre ambas clases de composición. De igual manera una competencia profesional se compone de un conjunto de módulos formativos (1 o más) por lo que relacionaremos ambas, también mediante composición.

Conjunto de tres clases unidas por relaciones de composición. De izquierda a derecha vemos la clase”Módulo” que está formada por un rectángulo dividido en tres bandas horizontales. En la superior aparece el nombre de la clase que es Módulo, centrado y en negrita. En la banda central aparecen los atributos que son -Nombre: string, -Duración: int y -Contenidos: string, y en la inferior los métodos que son: +matricular(alumno:Alumno) : void y +asignarDuración(duracion: int): void., en el centro la clase “Competencia profesional” formada por un rectángulo azul dividido en dos bandas horizontales con el nombre en la superior y el atributo -Descripcion: string en la inferior. A la derecha está la clase “Ciclo Formativo” con los atributos -Nombre: string, -Descripcion: string y -Horas:int. Módulo se relaciona con Competencia profesional a través de una relación de composición formada por una linea recta  con un rombo de color negro en el extremo de Competencia profesional con cardinalidad 1..* en Módulo y 1 en Competencia profesional. Competencia profesional se relaciona con Ciclo Formativo  a través de una relación de composición formada por una linea recta  con un rombo de color negro en el extremo de Ciclo Formativo con cardinalidad 1..* en Competencia profesional y 1 en Ciclo Formativo.

Un módulo formativo a su vez, contiene un examen y una tarea, que tampoco tienen sentido por si mismos, de modo que también los vamos a relacionarlos mediante composición. El examen por su parte se compone de 30 preguntas, pero éstas pueden tener sentido por si mismas, y pertenecer a diferentes exámenes, además, el hecho de eliminar un examen no va a dar lugar a que las preguntas que lo forman se borren necesariamente, si leemos con atención el enunciado, podemos deducir que las preguntas se seleccionan de un repositorio del que pueden seguir formando parte [... [Los exámenes se componen de 30 preguntas que se eligen y ordenan al azar...], así que en este caso usaremos la relación de agregación para unirlos.

Conjunto de clases unidas por una relaciones de composición. Arriba vemos de izquierda a derecha la clase”Módulo” que está formada por un rectángulo dividido en tres bandas horizontales. En la superior aparece el nombre de la clase que es Módulo, centrado y en negrita. En la banda central aparecen los atributos que son -Nombre: string, -Duración: int y -Contenidos: string, y en la inferior los métodos que son: +matricular(alumno:Alumno) : void y +asignarDuración(duracion: int): void., en el centro la clase “Competencia profesional” formada por un rectángulo azul dividido en dos bandas horizontales con el nombre en la superior y el atributo -Descripcion: string en la inferior. A la derecha está la clase “Ciclo Formativo” con los atributos -Nombre: string, -Descripcion: string y -Horas:int. Módulo se relaciona con Competencia profesional a través de una relación de composición formada por una linea recta  con un rombo de color negro en el extremo de Competencia profesional con cardinalidad 1..* en Módulo y 1 en Competencia profesional. Competencia profesional se relaciona con Ciclo Formativo  a través de una relación de composición formada por una linea recta  con un rombo de color negro en el extremo de Ciclo Formativo con cardinalidad 1..* en Competencia profesional y 1 en Ciclo Formativo. Con Módulo Formativo se relacionan mediante relaciones de composición Examen y Tarea. Examen tiene como métodos +calificar(), +añadirPregunta(), +ordenarPreguntas() y +crearExamen(). Tarea tiene como atributo -Descripción: string. La cardinalidad en ambos casos y extremos de las relaciones es 1. Examen se relaciona por agregación con Pregunta, que tiene como atributos -Enunciado: string, -Respuestas: string[], y -RespuestaValida: int. La relación tiene una cardinalidad de 0..* en el extremo de examen y 30 en el extremo de pregunta.

Por otra parte alumnos y profesores comparten ciertas características, por necesidad del sistema, como son los datos personales, o el correo electrónico, esto induce a pensar que podemos crear una abstracción con los datos comunes, que de hecho, ya hemos obtenido del enunciado en la clase persona, que recoge las coincidencias entre alumnos y profesores y añadir una relación de herencia de la siguiente manera:

Tres clases en las que se aprecia la herencia. Las clases están representadas como rectángulos de color azul divididos en dos banda horizontales. En la banda superior aparece el nombre de la clase y en el inferior los atributos. En la zona superior de la imagen aparece la clase “Persona” con los atributos -Nombre: string, -Direccion: string, -Telefono: string, -FechaNacimiento: Date, y -correoElectronico: string. Aparece conectada por una línea en forma de T invertida con un triángulo blanco en el extremo de la clase Persona con las clases Profesor, con el atrinbuto -NRP: string y Alumno con  el atributo -notaMedia: float y los métodos +emitirCertificado() y +calcularNotaMedia().

Por último queda relacionar a alumnos y profesores con los módulos formativos. Un alumno se matricula de un conjunto de módulos formativos, y un profesor puede impartir uno o varios módulos formativos.

Más concretamente, de cara a la cardinalidad, un alumno puede estar matriculado en uno o varios módulos, mientras que un módulo puede tener, uno o varios alumnos matriculados. Por su parte un profesor puede impartir uno o varios módulos, aunque un módulo es impartido por un profesor.

Éste análisis da como resultado lo siguiente:

Conjunto de clases en las que se aprecia la herencia. Las clases están representadas como rectángulos de color azul divididos en dos o tres banda horizontales. En la banda superior aparece el nombre de la clase y en las inferiores los atributos y métodos. En la zona superior de la imagen aparece la clase “Persona” con los atributos -Nombre: string, -Direccion: string, -Telefono: string, -FechaNacimiento: Date, y -correoElectronico: string. Aparece conectada por una línea en forma de T invertida con un triángulo blanco en el extremo de la clase Persona con las clases Profesor, con el atrinbuto -NRP: string y Alumno con  el atributo -notaMedia: float y los métodos +emitirCertificado() y +calcularNotaMedia(). Debajode Alumno y Profesor aparece la clase MóduloFormativo con los atributos -Nombre: string, -Duración: int y -Contenidos: string, y los métodos +matricular(alumno:Alumno) : void y +asignarDuración(duracion: int): void. Alumno se relaciona con MóduloFormativo mediante una relación en forma de linea recta etiquetada con Matricula, con cardinalidad 0..* en Alumno y 1..* en ModuloFormativo y Profesor se relaciona con ModuloFormativo a través de un relación etiquetada con Imparte, con cardinalidad 1 en Profesor y 1..* en MóduloFormativo.
Este sería el diagrama de clases completo:
Conjunto de clases en las que se aprecia la herencia, composición y agregacion. Las clases están representadas como rectángulos de color azul divididos en dos o tres banda horizontales. En la banda superior aparece el nombre de la clase y en las inferiores los atributos y métodos. En la zona superior de la imagen aparece la clase “Persona” con los atributos -Nombre: string, -Direccion: string, -Telefono: string, -FechaNacimiento: Date, y -correoElectronico: string. Aparece conectada por una línea en forma de T invertida con un triángulo blanco en el extremo de la clase Persona con las clases Profesor, con el atributo -NRP: string y Alumno con  el atributo -notaMedia: float y los métodos +emitirCertificado() y +calcularNotaMedia(). Debajo de Alumno y Profesor aparece la clase MóduloFormativo con los atributos -Nombre: string, -Duración: int y -Contenidos: string, y los métodos +matricular(alumno:Alumno) : void y +asignarDuración(duracion: int): void. Alumno se relaciona con MóduloFormativo mediante una relación en forma de linea recta etiquetada con Matricula, con cardinalidad 0..* en Alumno y 1..* en ModuloFormativo y Profesor se relaciona con ModuloFormativo a través de un relación etiquetada con Imparte, con cardinalidad 1 en Profesor y 1..* en MóduloFormativo. A la derecha de ModuloFormativo está la clase “Competencia profesional” con el atributo -Descripcion: string. A su derecha está la clase “Ciclo Formativo” con los atributos -Nombre: string, -Descripcion: string y -Horas:int. MóduloFormativo se relaciona con Competencia profesional a través de una relación de composición formada por una linea recta con un rombo de color negro en el extremo de Competencia profesional con cardinalidad 1..* en Módulo y 1 en Competencia profesional. Competencia profesional se relaciona con Ciclo Formativo  a través de una relación de composición formada por una linea recta  con un rombo de color negro en el extremo de Ciclo Formativo con cardinalidad 1..* en Competencia profesional y 1 en Ciclo Formativo. Con Módulo Formativo se relacionan mediante relaciones de composición Examen y Tarea. Examen tiene como métodos +calificar(), +añadirPregunta(), +ordenarPreguntas() y +crearExamen(). Tarea tiene como atributo -Descripción: string. La cardinalidad en ambos casos y extremos de las relaciones es 1. Examen se relaciona por agregación con Pregunta, que tiene como atributos -Enunciado: string, -Respuestas: string[], y -RespuestaValida: int. La relación tiene una cardnalidad de 0..* en el extremo de examen y 30 en el extremo de pregunta.

Añadir Getters, Setters y constructores

Hay que evitar introducir información cuyo aporte funcional no sea muy relevante. Por ejemplo, en los programas aparecerán métodos constructores, getters, setters ..., todos ellos importantes en el código durante la programación, pero en ocasiones poco relevantes desde una perspectiva de definición de funciones de la clase.

Por último añadimos los métodos que permiten crear los objetos de las clases (constructores) así como los que permiten establecer los valores de los atributos no calculados y leerlos (getters y setters), recuerda que para tener éstos métodos completos es necesario que el atributo tenga establecido su tipo, para que sea tenido en cuenta.

Para añadir los getters y setters en Visual Paradigm, basta con desplegar el menú contextual del atributo y seleccionar la opción Create Getter and Setter.

También hay que añadir los métodos que no se infieren de la lectura del enunciado, por ejemplo los que permiten añadir módulos a las competencias, o competencias a los ciclos. Para comprobar estos métodos puedes descargar el diagrama de clases en un proyecto VP-UML un poco más adelante.