Diagramas de Secuencia
Entre los diagramas UML2.0 para representar comportamiento, están los diagramas que hacen énfasis en aspectos de interacción entre los objetos. Estos incluyen diagramas de comunicación, interacción, secuencia y tiempo.
Los diagramas de secuencia permiten modelar la secuencia de interacciones entre distintos objetos para lograr alguna tarea ya sea un escenario de un caso de uso, la lógica de un método o la lógica de un servicio.
Elementos básicos del diagrama
Los objetos y su línea de vida
En un diagrama de secuencia se representan objetos y no clases. Un objeto se representa con una caja rectangular y una línea punteada que sale de la caja hacia abajo. Se debe indicar la clase dela cual el objeto es una instancia y si se requiere mencionar el mismo objeto en otra parte del diagrama, se le da un nombre. En la siguiente figura, el objeto se llama u1 y es una instancia dela clase Universidad
:
La línea punteada que sale de la caja se llama la línea de la vida del objeto (lifeline). Esta línea sirve para definir un orden en las acciones que realiza el objeto (el orden de las acciones van de arriba hacia abajo). Cuando un objeto aparece en un diagrama de secuencia significa que éste está activo en ejecución, es decir que otros objetos se pueden comunicar con él.
Interacción entre objetos
La interacción entre los objetos se realiza a través de mensajes que se envían entre ellos. En la figura, el objeto obj3
de la clase Clase2
envía un mensaje llamado “mensajeEjemplo”
al objeto obj1
instancia de la clase Clase1.
Los mensajes pueden ser de distintos tipos: síncronos o asíncronos, perdidos, encontrados, llamados o señales. Por ahora vamos a focalizar en mensaje síncronos que corresponden a llamados de métodos.
La diferencia en el diagrama está en el tipo de flecha:
En el siguiente ejemplo, decimos que el objeto u1
de la clase Universidad
le envía un mensaje al objeto p1
de la clase Programa.
En este ejemplo, el mensaje corresponde al llamado del método darNombre().
Este es un mensaje síncrono. Lo que significa que una vez que se ejecute el método darNombre
en el objeto p1
, la secuencia (el control) regresa al objeto quien hizo el llamado, en este caso el objeto u1
.
En la siguiente figura, el obj3
de la clase Clase2
envía un mensaje al objeto obj1
de la clase Clase1.
Este mensaje es el llamado del método “nombreMetodo”
con sus argumentos arg1
y arg2.
Note que para que, en la figura anterior, este mensaje sea válido, se tienen que cumplir dos cosas:
- El objeto
obj3
“conoce” al objetoobj1.
- El método
nombreMetodo
está definido en la claseClase1
con los parámetros correspondientes para que el llamado sea válido
En el siguiente diagrama de clases, se cumple que todos los objetos de la clase Clase2
tienen una asociación con un objeto de Clase1
llamado obj1.
Así, el obj3
conoce al obj1.
Para la segunda condición, podemos observar que el método está efectivamente definido en la Clase1.
El rectángulo delgado en cada una de las líneas de vida de los objetos representa una ocurrencia de ejecución o activación de un foco de control. La siguiente imagen señala, para el ejemplo anterior, que la invocación al método, desde el obj3
, ocurrió durante ese foco de control. Durante la ejecución del método en el obj1
se creó un foco de control. Al terminar la ejecución se regresa al foco de control, donde iba, del obj3.
Fragmento Combinados: caminos alternativos
Para representar alternativas o ejecuciones condicionales en los diagramas de secuencia debemos recurrir a los fragmentos combinados.
Un fragmento combinado es un agrupamiento lógico, representado por un rectángulo que contiene la estructura condicional que afecta el flujo de los mensajes.
En la figura anterior, podemos observar la sintaxis básica que es el rectángulo que delimita el alcance del fragmento. El tipo del fragmento se escribe en la parte superior izquierda.
Los fragmentos combinados sirven para representar secuencias de interacción que dependen de que una condición o guarda se cumpla.
Sirven para denotar caminos alternativos, secuencias que se pueden ejecutar en paralelo, secuencias en orden estricto, ciclos de ejecución y varios más.
El caso de uso "crear una película", nos permite ilustrar el uso de un fragmento combinado alternativo. De acuerdo con lo planteado, queremos expresar que sólo crearemos la película en la cartelera si esta no existe. Necesitamos poder expresar que la creación de la película se ejecutará únicamente si la esta no existe
El fragmento se muestra en el siguiente diagrama. Adicionamos una guarda o condición que pregunta si el resultado del método buscarPelicula
es igual a null
( lo que implicará que la película no existe en la cartelera). Sólo si la condición es verdadera es posible crear un nuevo objeto de tipo Película.
Note que la interacción para la creación está ahora dentro del rectángulo que define el fragmento combinado.
Fragmento Combinados: ciclos
Suponga que ahora nos interesa modelar el comportamiento del caso de uso
“Calcular el número de estudiantes cuyo género es Femenino y que estén inscritas en un curso, dado su código, de un programa dado el nombre del programa.”
Hay varias preguntas que debemos hacernos.
- Quién es responsable de saber el género de un estudiante?
- Quién es responsable de saber cuántos estudiantes con genero femenino hay en un curso?
- Quién es responsable de encontrar el curso que corresponde a un código dado?
- Quién es responsable de encontrar el programa que corresponde a un nombre dado?
- Quién es el responsable de recibir del actor externo la información del nombre del programa y del código curso sobre el que se quiere saber cuántas mujeres hay?
Al responder las preguntas utilizando el patrón experto
, obtuvimos el diagrama de clases actualizado:
Respuestas a las preguntas:
"Quién es responsable de saber el género de un estudiante?": la clase Estudiante quien tiene la información.
"Quién es responsable de saber cuántos estudiantes con genero femenino hay en un curso?. LA clase curso que tiene acceso a la colección de estudiantes inscritos en él.
Quién es responsable de encontrar el curso que corresponde a un código dado?. Con esta pregunta decidimos que los cursos son de la
Universidad
y no de los programas por esa razón se creó una nueva relación a pesar de que con esto se aumenta el acoplamiento. Un curso puede ser dictado en más de un programa.Quién es responsable de encontrar el programa que corresponde a un nombre dado?. La universidad quien es la dueña de los programas.
Quién es el responsable de recibir del actor externo la información del nombre del programa y del código curso sobre el que se quiere saber cuántas mujeres hay?: La universidad.
El diagrama de secuencia con el fragmento combinado que representa el ciclo es:
Se itera sobre la colección de estudiantes y por cada uno se pregunta el género. Si es valor es F
, entonces se cuenta el la variable mujeres
. La instrucción estudiante=*next()
permite avanzar en el ciclo.