El diagrama de secuencia es un tipo de diagrama del lenguaje unificado de modelado (UML) que, a su vez, se trata de un lenguaje orientado a objetos y está compuesto por elementos gráficos. UML modela sistemas y procesos de la pro­gra­ma­ción orientada a objetos así como procesos de negocio con el objetivo de presentar asuntos complejos de manera clara. Para ello, UML establece una notación es­ta­n­da­ri­za­da y recurre a formas visuales para re­pre­se­n­tar un co­m­po­ne­n­te o co­m­po­r­ta­mie­n­to es­pe­cí­fi­co. El llamado me­ta­mo­de­la­do define las unidades li­n­güí­s­ti­cas y su si­g­ni­fi­ca­do dentro de UML y determina cómo pueden in­ter­ac­tuar ciertos elementos entre sí y qué je­ra­r­quías existen entre las re­s­pe­c­ti­vas unidades li­n­güí­s­ti­cas.

En UML los elementos y las re­la­cio­nes se re­pre­se­n­tan en forma de diagramas. UML2 distingue entre 14 tipos de diagramas di­fe­re­n­tes, que se ordenan en tres ca­te­go­rías distintas: diagramas de es­tru­c­tu­ra, de co­m­po­r­ta­mie­n­to y de in­ter­ac­ción.

  • Los diagramas de es­tru­c­tu­ra (structure diagrams) sre­pre­se­n­tan un sistema y sus co­m­po­ne­n­tes de forma estática. Es­ta­ble­cen las re­la­cio­nes que existen entre elementos in­di­vi­dua­les o entre elementos y conceptos su­pe­rio­res. Un ejemplo de ello es el diagrama de clase.
  • Los diagramas de co­m­po­r­ta­mie­n­to (behavior diagrams) re­pre­se­n­tan los procesos y el co­m­po­r­ta­mie­n­to de un sistema di­ná­mi­ca­me­n­te. A di­fe­re­n­cia de los diagramas de es­tru­c­tu­ra, la secuencia de procesos y, por lo tanto, el tiempo, de­sem­pe­ñan un papel im­po­r­ta­n­te en la vi­sua­li­za­ción. Un ejemplo de este tipo de diagramas es el diagrama de actividad.
  • Los diagramas de in­ter­ac­ción (in­ter­ac­tion diagrams) pe­r­te­ne­cen a la categoría de diagramas de co­m­po­r­ta­mie­n­to. Se enumeran por separado porque modelan un co­m­po­r­ta­mie­n­to es­pe­cí­fi­co, es decir, las in­ter­ac­cio­nes entre los elementos del sistema. Los elementos básicos de las in­ter­ac­cio­nes son las llamadas líneas de vida. Estas consisten en objetos (los bloques de co­n­s­tru­c­ción in­de­pe­n­die­n­tes más pequeños de la pro­gra­ma­ción orientada a objetos) que re­pre­se­n­tan a pa­r­ti­ci­pa­n­tes in­di­vi­dua­les en una in­ter­ac­ción. El diagrama de in­ter­ac­ción más utilizado es el diagrama de secuencia.

Diagramas de secuencia: ventajas y si­n­gu­la­ri­da­des

El diagrama de secuencia UML re­pre­se­n­ta los eventos en orden cro­no­ló­gi­co, razón por la que a veces se le llama diagrama de eventos o escenario de eventos. El orden (es decir, la secuencia exacta) es más im­po­r­ta­n­te que los puntos es­pe­cí­fi­cos en el tiempo. Sin embargo, es posible añadir re­s­tri­c­cio­nes al modelo con el que se está tra­ba­ja­n­do. Por ejemplo, una li­mi­ta­ción de tiempo para un proceso en pa­r­ti­cu­lar (in­tro­du­cir el PIN en un cajero au­to­má­ti­co) puede des­en­ca­de­nar un evento (se expulsa la tarjeta si pasado cierto tiempo no se ha in­tro­du­ci­do PIN alguno).

El diagrama de secuencia describe bá­si­ca­me­n­te cómo los objetos (e in­s­ta­n­cias) in­te­r­ca­m­bian mensajes en un orden de­te­r­mi­na­do. Los objetos son los bloques de co­n­s­tru­c­ción básicos de los diagramas UML y re­pre­se­n­tan ciertas ca­ra­c­te­rí­s­ti­cas de un elemento del sistema, que varían de­pe­n­die­n­do del diagrama. En las in­ter­ac­cio­nes, los objetos son las conocidas como líneas de vida.

En un sistema se realizan so­li­ci­tu­des y se envían re­s­pue­s­tas co­n­s­ta­n­te­me­n­te. El de­s­ti­na­ta­rio toma las de­ci­sio­nes en función de la solicitud es­pe­cí­fi­ca y de sus propias reglas pre­de­fi­ni­das. El entramado de posibles de­ci­sio­nes e in­ter­ac­cio­nes suele estar re­pre­se­n­ta­do por un diagrama de ac­ti­vi­da­des. Si se re­pre­se­n­tan todas las de­ci­sio­nes posibles (sí/no) como un diagrama de árbol, pro­ba­ble­me­n­te se obtendrá la imagen de una red fue­r­te­me­n­te ra­mi­fi­ca­da. No obstante, el diagrama de secuencia muestra solo una ruta es­pe­cí­fi­ca dentro de esta red.

En concreto, el diagrama de secuencia se di­fe­re­n­cia del diagrama de casos de uso de UML en su orden detallado. Si se va a in­tro­du­cir un nuevo proceso em­pre­sa­rial, el caso de uso pro­po­r­cio­na una visión de conjunto de las ne­ce­si­da­des. No obstante, si, por otra parte, se han de definir casos concretos junto con unos plazos, habrá que optar por el diagrama de secuencia, ya que permite vi­sua­li­zar subáreas in­di­vi­dua­les con mayor precisión. Con él es posible poner a prueba de­te­ni­da­me­n­te las re­la­cio­nes lógicas del caso de apli­ca­ción en cuestión.

Los diagramas de secuencia UML también son útiles cuando es necesario re­pre­se­n­tar grá­fi­ca­me­n­te ope­ra­cio­nes co­m­pli­ca­das para su mejor co­m­pre­n­sión. Gracias a un modelado claro es posible ide­n­ti­fi­car rá­pi­da­me­n­te las es­ta­cio­nes por las que debe pasar una única tarea para que se complete con éxito. Así, por ejemplo, es posible pla­ni­fi­car y probar distintos métodos antes de im­ple­me­n­tar­los en el negocio diario o en un sistema in­fo­r­má­ti­co.

Para re­pre­se­n­tar las es­tru­c­tu­ras de control de un lenguaje de pro­gra­ma­ción de alto nivel, se combinan varios diagramas de secuencia en un fragmento combinado.

Nota

Los diagramas de secuencia apoyan en el análisis lógico de partes de sistemas. Si la secuencia de tiempo de los procesos desempeña un papel im­po­r­ta­n­te, este tipo de diagrama es ideal. Sin embargo, no tiene sentido re­pre­se­n­tar todo un sistema con él. En su lugar, es mejor utilizar un diagrama de co­m­po­r­ta­mie­n­to adecuado, como el diagrama de caso de uso, el diagrama de estado o el diagrama de actividad. Estos ilustran contextos incluso más amplios de una manera clara y fá­ci­l­me­n­te co­m­pre­n­si­ble.

Diagramas de secuencia: ejemplos con notación

El fin de un diagrama UML es ayudar a todas las partes im­pli­ca­das a co­m­pre­n­der mejor los sistemas complejos. Para ello, el lenguaje de modelado utiliza símbolos visuales. En casos ex­ce­p­cio­na­les y con de­te­r­mi­na­dos grupos de apli­ca­cio­nes, UML se puede modificar, pero re­co­me­n­da­ble recurrir al lenguaje es­ta­n­da­ri­za­do por el OMG (Object Ma­na­ge­me­nt Group) para evitar que se produzcan problemas de co­m­pre­n­sión. Las es­pe­ci­fi­ca­cio­nes que se indican a co­n­ti­nua­ción co­rre­s­po­n­den al estándar UML en la versión UML 2.5.

Líneas de vida

Una línea de vida re­pre­se­n­ta el curso del tiempo de un proceso. A la cabeza se sitúa un re­c­tá­n­gu­lo que contiene no­r­ma­l­me­n­te el nombre del objeto y el nombre de la clase. Si falta el nombre del objeto, la línea de vida re­pre­se­n­ta a una instancia de objeto sin nombre. En este caso, se puede suponer que todos los objetos de la misma clase actúan de la misma forma en esta secuencia. La línea de vida siempre re­pre­se­n­ta un solo operando. Si el operando tiene varios valores, se debe se­le­c­cio­nar uno de ellos, es decir, la mu­l­ti­pli­ci­dad nunca es >1.

Hecho

En in­ge­nie­ría in­fo­r­má­ti­ca, un operando es un objeto in­flue­n­cia­do por un operador. Los operandos pueden ser co­n­s­ta­n­tes o variables. Un operando simple, por ejemplo, es la variable X. Los ope­ra­do­res pueden ser simples ope­ra­do­res ari­t­mé­ti­cos como “+” y “-”. En la pro­gra­ma­ción, estos co­m­po­ne­n­tes se utilizan desde en funciones simples como “x = t * 4” hasta en so­fi­s­ti­ca­dos al­go­ri­t­mos.

La línea di­s­co­n­ti­nua situada bajo el en­ca­be­za­mie­n­to re­pre­se­n­ta el tra­n­s­cu­r­so del tiempo. El tiempo tiene un de­sa­rro­llo lineal de­s­ce­n­de­n­te. A lo largo de la línea temporal se envían los mensajes y las re­s­pue­s­tas. Un mensaje que haya de enviarse tras otro se sitúa más abajo en la línea de tiempo. En esta notación no se trata de puntos concretos en el tiempo, sino siempre de una secuencia. Los mensajes siempre están di­s­pue­s­tos uno debajo de otro, a menos que existan en fra­g­me­n­tos co­m­bi­na­dos de forma paralela.

Las líneas de vida indican cuánto tiempo participa ac­ti­va­me­n­te un objeto en un proceso, lo que se puede ver por la longitud de una línea en co­m­pa­ra­ción con otras. Algunos objetos se destruyen antes de que el proceso haya terminado. Cuando ya no se necesita un objeto, se indica con una X el punto en la línea de vida en el que se ha de destruir.

Si quieres comprobar la robustez de tu sistema, el diagrama de secuencia es muy adecuado pues muestra una vista muy detallada. Se pueden utilizar tres es­te­reo­ti­pos de clase de la línea de la vida:

  • Entidad
  • Límite
  • Control

En la imagen de arriba se pueden ver estas tres líneas de vida con la notación: la entidad tiene una cabeza circular que se sitúa sobre una línea ho­ri­zo­n­tal. El es­te­reo­ti­po de línea de vida de­no­mi­na­do límite consta de una cabeza de la misma forma de la que sale una línea ho­ri­zo­n­tal que conecta con otra vertical: a modo de T rotada noventa grados a la izquierda. La cabeza del es­te­reo­ti­po de control está compuesta por una flecha que gira en círculo. De todos estos es­te­reo­ti­pos sale una línea de vida di­s­co­n­ti­nua, que desciende en vertical.

Si ya has elaborado un concepto uti­li­za­n­do un diagrama de casos de uso, el diagrama de secuencia puede ayudarte, por ejemplo, a diseñar los pasos in­di­vi­dua­les teniendo en cuenta los actores y objetos posibles.

Los límites (bou­n­da­ries) re­pre­se­n­tan in­te­r­fa­ces que in­ter­ac­túan con actores externos. Estos objetos pueden ser, por ejemplo, in­te­r­fa­ces de usuario, en cuyo caso el actor co­rre­s­po­n­de­ría a una persona. Las entidades (entities), por otro lado, son co­n­te­ne­do­res de datos, o sea, objetos que contienen datos del sistema. Para que los límites y las entidades se co­mu­ni­quen, se necesita un elemento de control. El control no tiene que ser ne­ce­sa­ria­me­n­te un objeto; también funciona un método que se asigna a uno de los otros dos elementos. Se trata del medidador que conecta entidad y límite, mo­ni­to­ri­za las señales de los dos elementos y comprueba su lógica.

Los tres es­te­reo­ti­pos se comunican siguiendo estas cuatro reglas:

  • Los objetos de límite son, como in­te­r­fa­ces, re­s­po­n­sa­bles de la co­mu­ni­ca­ción con los actores. De este modo, los actores se comunican ex­clu­si­va­me­n­te con las fronteras.
  • Por el contrario, los objetos de control se comunican con otros objetos de control, así como con entidades y límites. Pero no in­ter­ac­túan con los actores.
  • Los límites se comunican con los objetos de control y con los actores.
  • Las entidades son los soportes de datos más arrai­ga­dos en el sistema. Solo in­te­r­ca­m­bian datos con objetos de control.

Mensajes

El mensaje es un elemento básico del diagrama de secuencia. En la pro­gra­ma­ción orientada a objetos, un sistema se compone de objetos. UML presenta estos objetos como nodos unidos entre sí por los elementos de conexión, que en UML pueden realizar varias tareas. Co­n­cre­ta­me­n­te, en el diagrama de secuencia UML se encargan de modelar los mensajes de metaclase. Como forma básica del elemento de conexión la notación establece una línea. Las flechas son una forma especial de elemento de conexión que re­pre­se­n­tan una relación di­re­c­cio­nal o flujo de in­fo­r­ma­ción. En el diagrama de secuencia si­m­bo­li­zan a los mensajes. En función del tipo de mensaje del que se trate, su vi­sua­li­za­ción cambia, como bien muestra la siguiente imagen.

Para dotar al mensaje de contenido se agrega una etiqueta, que en el caso de mensajes simples sigue el siguiente formato:

[nombre del mensaje] : [atributo “=”] nombre de la señal o nombre de la operación [ar­gu­me­n­tos] [“:” valor de retorno]

Los ar­gu­me­n­tos válidos para los mensajes son:

  • Co­n­s­ta­n­tes
  • Valores wildcard o comodín (valores si­m­bó­li­cos que re­pre­se­n­tan un valor legal X en el diagrama)
  • Atributos del remitente
  • Pa­rá­me­tros de la in­ter­ac­ción en­vo­l­ve­n­te
  • Atributos de clase superior

Los mensajes tienen una firma con la que se es­pe­ci­fi­ca el contenido del mensaje. La firma se refiere a una señal o a una operación y debe llevar su nombre. Esto implica que el contenido del mensaje des­en­ca­de­na una operación (es decir, una actividad) en el de­s­ti­na­ta­rio o le envía una señal (es decir, solo in­te­r­ca­m­bia in­fo­r­ma­ción). Además, los mensajes difieren de­pe­n­die­n­do de si son si­n­cró­ni­cos o asi­n­cró­ni­cos: con los mensajes asi­n­cró­ni­cos, el remitente no espera una respuesta, sino que reanuda su co­m­po­r­ta­mie­n­to in­me­dia­ta­me­n­te; con los síncronos, el remitente espera una respuesta y bloquea el canal de envío durante un tiempo.

Estos son los tipos de mensajes es­ta­n­da­ri­za­dos en el diagrama de secuencia UML:

  • Los mensajes así­n­cro­nos del tipo (Me­s­sa­ge­So­rt) as­y­n­ch­ro­n­ch­Ca­ll invocan una operación y des­en­ca­de­nan su ejecución. Con los mensajes así­n­cro­nos, el sistema no espera una respuesta del de­s­ti­na­ta­rio, sino que prosigue con sus procesos sin in­te­rru­p­ción. Los pa­rá­me­tros de operación y los atributos de los mensajes deben coincidir.
    • El tipo as­y­n­ch­Si­g­nal se utiliza para las in­s­ta­n­cias de señal. Re­pre­se­n­ta el envío y la recepción de mensajes así­n­cro­nos. Este mensaje es el resultado de una acción de envío asíncrona de la señal. Aquí los atributos de la señal de­te­r­mi­nan los ar­gu­me­n­tos del mensaje.
    • Notación: los mensajes así­n­cro­nos se modelan con forma de flechas con línea continua y punta abierta.
  • Los mensajes síncronos invocan solo a las ope­ra­cio­nes, no a las señales. El tipo de mensaje se llama synchCall. Los mensajes síncronos esperan una respuesta de la operación antes de reanudar su co­m­po­r­ta­mie­n­to y se re­pre­se­n­tan con una flecha cuya punta está coloreada en negro.
  • El de­s­ti­na­ta­rio de un mensaje devuelve las re­s­pue­s­tas al remitente después de que la operación haya producido un resultado, en cuyo caso el símbolo tiene una punta de flecha abierta o coloreada. La línea de la flecha co­rre­s­po­n­die­n­te es di­s­co­n­ti­nua.
  • crea­te­Me­s­sa­ge es un tipo de mensaje que señala una nueva instancia de una línea de vida. Con él, el sistema crea un nuevo objeto en el diagrama de secuencia. Este tipo de mensaje es el único que remite di­re­c­ta­me­n­te a la cabeza de la línea de vida. Otros mensajes deben apuntar a la línea de vida di­s­co­n­ti­nua. crea­te­Me­s­sa­ge es re­pre­se­n­ta­do, al igual que en el caso de las re­s­pue­s­tas, por una flecha de punta abierta y línea di­s­co­n­ti­nua, solo que en este caso apunta en la dirección opuesta.
  • de­le­te­Me­s­sa­ge señala el punto en el que se destruye una instancia de línea de vida. Este mensaje de eli­mi­na­ción se dibuja de forma libre como una flecha, a la que op­cio­na­l­me­n­te se le añade el título “destroy”. Siempre debe señalar a un evento de de­s­tru­c­ción. También llamado de­s­tru­c­tion oc­cu­rre­n­ce spe­ci­fi­ca­tion, esta es­pe­ci­fi­ca­ción de evento marca la de­s­tru­c­ción de un objeto en la línea de tiempo de ejecución con una X.

Al remitente o el receptor pueden faltarles los mensajes –o les son de­s­co­no­ci­dos. El estándar UML asume entonces que la instancia se encuentra fuera del diagrama. Si se conoce al de­s­ti­na­ta­rio pero no al remitente, se trata de un mensaje en­co­n­tra­do. En el lugar del remitente se escribe un círculo pequeño y coloreado, si­m­bo­li­za­n­do su ausencia. El caso contrario es el del mensaje perdido: cuando el receptor es de­s­co­no­ci­do, en la punta de la flecha se añade un cículo coloreado.

Un tipo especial de mensaje lo co­n­s­ti­tu­ye el que se envía en su propia línea de vida. La línea de vida envía una función recursiva desde el cuadro de ac­ti­va­ción. Mientras la primera operación, re­pre­se­n­ta­da por el cuadro de ac­ti­va­ción, está teniendo lugar, en la misma línea de vida se inicia una segunda operación que parte del mensaje enviado. Este tipo de mensaje se utiliza, por ejemplo, si se realiza una operación varias veces y, por lo tanto, el objeto debe referirse a sí mismo. Los mensajes entre dos líneas de vida también pueden causar ac­ti­va­cio­nes su­pe­r­pue­s­tas.

Otra parte im­po­r­ta­n­te del mensaje son los pa­rá­me­tros, que son es­pe­ci­fi­ca­cio­nes de valor. El sistema evalúa esta dimensión cuando envía un mensaje con una firma. Esto ocurre en las es­pe­ci­fi­ca­cio­nes de salida, es decir, en el punto en el que se envía el mensaje. El resultado prescribe los valores para los atributos de señal o los pa­rá­me­tros de salida de operación, de­pe­n­die­n­do de quién sea el receptor. A co­n­ti­nua­ción, la operación procesa el valor y genera un parámetro de salida.

Una pa­r­ti­cu­la­ri­dad que se puede resaltar es el parámetro comodín. Si en un mensaje faltan todos los pa­rá­me­tros, la sintaxis precisa una cadena vacía que indica que no se ha fijado el valor del parámetro. Sin embargo, dicho valor es co­n­si­de­ra­do válido para los pa­rá­me­tros o atributos del receptor, es decir, como su propio nombre indica, funciona como un comodín. Los ca­ra­c­te­res comodín son ma­r­ca­do­res de posición para letras in­di­vi­dua­les o cadenas completas. En muchos casos se recurre al asterisco (*) como marcador de posición. En el caso de UML, este papel lo cumple el guión (“-”).

Los mensajes de respuesta solo pueden estar formados por una expresión con un máximo de un operando por parámetro. Si el remitente de una respuesta no emite valores, el mensaje tampoco tiene valores es­pe­cí­fi­cos que enviar. En tal caso, el mensaje modela pa­rá­me­tros de salida de un emisor como operando (es decir, los valores re­su­l­ta­n­tes de una operación). Sin pa­rá­me­tros de salida, el operando debe pe­r­ma­ne­cer vacío para lo que basta con modelar un marcador de posición comodín en lugar del valor de retorno. Si hay un operando, el sistema lo evalúa de nuevo según la es­pe­ci­fi­ca­ción de salida. El resultado de la eva­lua­ción es­pe­ci­fi­ca los valores de los pa­rá­me­tros “out”, “input” y “return”.

Hecho

Los pa­rá­me­tros IN, OUT e INOUT es­pe­ci­fi­can si una instancia acepta o devuelve valores. El parámetro IN indica que una instancia recibe y procesa valores, pero no los envía. El parámetro OUT es­pe­ci­fi­ca que no asume ningún valor, sino que solo los emite. El parámetro INOUT permite valores de entrada y salida. Si no se define ninguno de estos valores, el sistema asume IN por defecto.

UML es­pe­ci­fi­ca tres símbolos que señalan el de­s­ti­na­ta­rio del mensaje como expresión de parámetro. El de­s­ti­na­ta­rio es el objetivo de asi­g­na­ción del mensaje. El mensaje de respuesta asigna un valor de retorno al parámetro de salida del emisor. Estos son los símbolos es­ta­n­da­ri­za­dos:

  • Unknown
  • In­ter­ac­tion Parameter
  • Attribute

Unknown (de­s­co­no­ci­do) es un parámetro vacío y equivale al comodín. El parámetro de in­ter­ac­ción (In­ter­ac­tion Parameter) es un ow­ne­d­Pa­ra­me­ter (parámetro propio) de la in­ter­ac­ción a la que pertenece. Esto quiere decir que la in­ter­ac­cion es pro­pie­ta­ria del parámetro. Este parámetro dispone de un nombre. Los pa­rá­me­tros de operación y los pa­rá­me­tros de in­ter­ac­ción tienen el mismo tipo. Los atributos se pueden nombrar sin re­s­tri­c­cio­nes y re­pre­se­n­tan el nombre de un co­m­po­r­ta­mie­n­to de contexto, siendo este el que determina la línea de vida a la que regresa el mensaje o la in­ter­ac­ción ci­r­cu­n­da­n­te. Si la in­ter­ac­ción no define ningún co­m­po­r­ta­mie­n­to, actúa como un contexto.

Las puertas (gates) son si­m­ple­me­n­te puntos al final de un mensaje. Pe­r­te­ne­cen al tipo Me­s­sa­geE­nd (final del mensaje) y marcan al remitente y al de­s­ti­na­ta­rio de un mensaje. Sirven para ilustrar el flujo de in­fo­r­ma­ción y muestran cómo se trasladan los mensajes entre dos fra­g­me­n­tos de in­ter­ac­ción. Para ser más precisos, re­pre­se­n­tan los puntos de conexión entre las ocu­rre­n­cias de in­ter­ac­ción y las in­ter­ac­cio­nes, así como entre los operandos de in­ter­ac­ción dentro y fuera de un fragmento combinado. Se sitúan en el marco del diagrama.

El diagrama de secuencia UML conoce cuatro tipos de puertas. Difieren de­pe­n­die­n­do de los fra­g­me­n­tos de in­ter­ac­ción con los que están asociados:

  • Actual Gate (puerta actual): las ocu­rre­n­cias de in­ter­ac­ción (in­ter­ac­tion oc­cu­rre­n­ce) remiten de un diagrama a otro. Esta puerta abre la conexión en el borde exterior de la ocu­rre­n­cia de in­ter­ac­ción para los mensajes desde la in­ter­ac­ción a la que se refiere la ocu­rre­n­cia de in­ter­ac­ción. De este modo, la puerta tiene una aso­cia­ción a la ocu­rre­n­cia de in­ter­ac­ción y acepta mensajes entrantes y salientes.
  • Formal Gate (puerta formal): para que una in­ter­ac­ción pueda in­te­r­ca­m­biar mensajes con una ocu­rre­n­cia de in­ter­ac­ción necesita una puerta formal. La puerta está situada en el interior del marco.
  • Inner Co­m­bi­ne­d­Fra­g­me­nt gate (puerta interior para fra­g­me­n­tos co­m­bi­na­dos): dentro de un fragmento combinado, se sitúa una puerta en el marco. In­te­r­ca­m­bia mensajes con extremos de mensaje del fragmento combinado con mensajes con extremos de mensaje fuera del fragmento combinado.
  • Outer Combined Fragment gate (puerta exterior para fra­g­me­n­tos co­m­bi­na­dos): esta puerta se encuentra en el borde exterior de un fragmento combinado. Co­n­s­ti­tu­ye el polo opuesto a la puerta interior.

Las puertas pueden tener nombres ex­plí­ci­tos o im­plí­ci­tos que deben coincidir en parejas: de este modo las puertas Actual Gate y Formal Gate deben coincidir, al igual que han de hacerlo las puertas Inner Co­m­bi­ne­d­Fra­g­me­nt Gate y Outer Co­m­bi­ne­d­Fra­g­me­nt Gate. Además, los mensajes deben ir en la misma dirección, coincidir en los valores de propiedad y tener el mismo Me­s­sa­ge­So­rt.

Los mensajes de­sem­pe­ñan un papel singular en los diagramas de co­mu­ni­ca­ción (una forma si­m­pli­fi­ca­da del diagrama de secuencia), que modelan cómo in­ter­ac­túan las líneas de vida. A di­fe­re­n­cia de los diagramas de secuencia, los diagramas de co­mu­ni­ca­ción se centran en la ar­qui­te­c­tu­ra del sistema y en cómo esta determina el flujo de mensajes. Aunque permite mostrar una ar­qui­te­c­tu­ra detallada, los fra­g­me­n­tos de in­ter­ac­ción (tales como los fra­g­me­n­tos co­m­bi­na­dos) no la utilizan. Como co­n­se­cue­n­cia, carece de un elemento es­tru­c­tu­ral, si bien en su lugar se numeran los mensajes. A veces los mensajes pueden adelantar a otros, por lo que el orden de los mensajes salientes difiere del orden de los mensajes entrantes. A pesar de todo, el estándar UML des­aco­n­se­ja este tipo de mensajes no se­cue­n­cia­les en el diagrama de co­mu­ni­ca­ción.

La notación UML para los diagramas de co­mu­ni­ca­ción prescribe un marco de diagrama de secuencia simple: un re­c­tá­n­gu­lo con una etiqueta pe­n­ta­go­nal en el en­ca­be­za­do. En la etiqueta, la de­sig­na­ción “sd” define este tipo de diagrama, junto a la que aparece el nombre de la in­ter­ac­ción. Los mensajes se re­pre­se­n­tan con una forma diferente: conectan las líneas de vida re­c­ta­n­gu­la­res (UML: nodos de objetos) como líneas rectas simples.

Sobre ellos se muesta una expresión de secuencia junto con una flecha que apunta en dirección del receptor. La de­sig­na­ción tiene la siguiente es­tru­c­tu­ra: [Número Nombre][Repetir]. El número entero establece la jerarquía de los elementos. Cuando uno de los números difiere (por ejemplo, 1.2.2 y 1.2.3), el sistema los envía uno tras otro. El nombre, por otro lado, re­pre­se­n­ta las tra­n­s­mi­sio­nes si­mu­l­tá­neas. El sistema envía si­mu­l­tá­nea­me­n­te dos mensajes con la de­sig­na­ción de secuencia 1.2.3a y 1.2.3b, pues contienen el mismo número. La re­pe­ti­ción incluye una re­s­tri­c­ción que determina cuándo se enviará el mensaje o un valor que determina con qué fre­cue­n­cia se repetirá el mensaje.

Condición de guarda

En UML, las co­n­di­cio­nes de guarda custodian el co­m­po­r­ta­mie­n­to de un elemento. El elemento debe:

  • cumplir con una cierta condición,
  • no exceder un cierto valor o quedar por debajo,
  • co­rro­bo­rar una afi­r­ma­ción.

Por lo tanto, se puede concluir que una condición de guarda es una re­s­tri­c­ción. Solo si se cumple la re­s­tri­c­ción, el elemento afectado puede ejercer cierto co­m­po­r­ta­mie­n­to. Hay muchos elementos di­fe­re­n­tes que pueden tener este tipo de co­n­di­cio­nes: acciones, atributos, co­m­po­r­ta­mie­n­to, entre otros. UML no prescribe un lenguaje estricto, pero ofrece OCL (Object Co­n­s­trai­nt Language) como opción nativa. También se utilizan a menudo las variables booleanas.

Una re­s­tri­c­ción de in­ter­ac­ción consiste en una expresión booleana de este tipo. La re­s­tri­c­ción sirve de pro­te­c­ción para el operando dentro de un fragmento combinado. Solo si el valor de la re­s­tri­c­ción es verdadero, el fragmento de in­ter­ac­ción adjunto inicia su co­m­po­r­ta­mie­n­to. La re­s­tri­c­ción se anota entre corchetes en la línea de vida por encima de una es­pe­ci­fi­ca­ción de ejecución. La es­ta­n­da­ri­za­ción permite combinar fra­g­me­n­tos sin re­s­tri­c­cio­nes de in­ter­ac­ción, ya que en este caso el sistema asume que los mensajes recibidos son ve­r­da­de­ros.

Fra­g­me­n­tos de in­ter­ac­ción en diagramas de secuencia

Cuando se crea un diagrama de secuencia, las líneas de vida y los mensajes conforman los co­m­po­ne­n­tes pri­n­ci­pa­les. UML2 presenta un marco para este tipo de diagrama, si bien no es obli­ga­to­rio. El marco limita un su­b­pro­ce­so, el llamado fragmento de in­ter­ac­ción, e incluye todas las líneas de vida y mensajes ne­ce­sa­rios. Como se eje­m­pli­fi­ca en la imagen inferior, dicho marco está re­pre­se­n­ta­do por un re­c­tá­n­gu­lo con una etiqueta en la esquina superior izquierda, en la que se incluye la abre­via­tu­ra sd, propia de un diagrama de secuencia, y no­r­ma­l­me­n­te resaltada en negrita, y el nombre de la in­ter­ac­ción.

Además de la li­mi­ta­ción visual, el marco también responde a aspectos fu­n­cio­na­les. Por ejemplo, si se crean varios diagramas de secuencia (u otras in­ter­ac­cio­nes), el marco sirve para delimitar las di­fe­re­n­tes pre­se­n­ta­cio­nes. Para mostrar que los di­fe­re­n­tes fra­g­me­n­tos de in­ter­ac­ción se comunican entre sí, modela un mensaje cuya flecha se dirija a la línea lateral del marco. El punto en el que la flecha topa con el marco se denomina puerta, elemento con una función dentro del diagrama, pero que carece de notación propia. Un ejemplo de lo aquí expuesto se puede observar en la imagen superior, donde el sistema envía el mensaje 5 al exterior.

En UML, los fra­g­me­n­tos de in­ter­ac­ción forman parte de los nodos. UML es­pe­ci­fi­ca las pro­pie­da­des y las tareas de cada uno de ellos, de­pe­n­die­n­do del tipo de diagrama en el que se en­cue­n­tren. En general, puede afirmarse que los nodos son elementos modelo dentro de un sistema o proceso en el que se puede instalar un artefacto. UML conecta a los di­fe­re­n­tes nodos con elementos de conexión, en­ca­r­ga­dos de re­pre­se­n­tar el in­te­r­ca­m­bio de in­fo­r­ma­ción de forma gráfica mediante flechas o líneas simples.

En UML se pueden crear diagramas de secuencia que contengan su­b­se­g­me­n­tos en­tre­la­za­dos. Los marcos ayudan a mostrar los fra­g­me­n­tos in­di­vi­dua­les de una manera ordenada.

Los diagramas de secuencia pueden contener los fra­g­me­n­tos de in­ter­ac­ción: ocu­rre­n­cia de in­ter­ac­ción, in­va­ria­n­tes de estado, cuadros de ac­ti­va­ción y fra­g­me­n­tos co­m­bi­na­dos.

Ocu­rre­n­cia de in­ter­ac­ción

Las ocu­rre­n­cias de in­ter­ac­cio­nes forman una subclase que define la notación, es­tru­c­tu­ra y co­m­po­r­ta­mie­n­to de dos me­ta­cla­ses, estas son, ocu­rre­n­cias de in­ter­ac­cio­nes y de­s­co­m­po­si­ción en parte.

La ocu­rre­n­cia de in­ter­ac­ción como metaclase es un fragmento de in­ter­ac­ción que convoca a otra in­ter­ac­ción o la utiliza. Si un diagrama de secuencia se vuelve demasiado complejo, se puede usar esta re­fe­re­n­cia para que resulte más claro. En el diagrama de secuencia de la imagen siguiente, la ocu­rre­n­cia de in­ter­ac­ción descrita está re­pre­se­n­ta­da con un cuadro negro. Para ide­n­ti­fi­car de forma ine­quí­vo­ca la ocu­rre­n­cia de in­ter­ac­ción llamada, hay que es­pe­ci­fi­car la siguiente sintaxis en el cuerpo (campo en el que se realizan las ope­ra­cio­nes):

  • nombre del atributo (atributo de una línea de vida en la in­ter­ac­ción que recibe el valor de retorno),
  • nombre de la co­la­bo­ra­ción (ocu­rre­n­cia de co­la­bo­ra­ción ide­n­ti­fi­ca­da, que vincula in­ter­ac­cio­nes y co­la­bo­ra­cio­nes),
  • nombre de in­ter­ac­ción del elemento al que se llama,
  • argumento -io (In/Out): ar­gu­me­n­tos de la in­ter­ac­ción de entrada y salida y
  • valor de retorno (respuesta de la in­ter­ac­ción llamada).

La ocu­rre­n­cia de in­ter­ac­ción se modela como un re­c­tá­n­gu­lo con una etiqueta pe­n­ta­go­nal en la esquina superior izquierda. En ella se introduce la abre­via­tu­ra “ref” (del inglés: “referral”).

Dado que la ocu­rre­n­cia de in­ter­ac­ción hace re­fe­re­n­cia a otros diagramas, estos factores externos de­te­r­mi­nan su co­m­po­r­ta­mie­n­to. Mientras que la in­ter­ac­ción enlazada tiene puertas formales (Formal Gate), la in­ter­ac­ción de re­fe­re­n­cia tiene la puerta real (Actual Gate).

La de­s­co­m­po­si­ción en parte (Part-De­co­m­po­si­tion) consiste en la se­pa­ra­ción parcial y se­cue­n­cial de una línea de vida dentro de una in­ter­ac­ción realizada por otra in­ter­ac­ción. Con esta de­s­co­m­po­si­ción, es posible separar los detalles entre sí y, de este modo, examinar más de cerca cada una de las su­b­fu­n­cio­nes. Si los mensajes llegan o emanan de la línea de vida de­s­co­m­pue­s­ta, se co­n­si­de­ran puertas reales, que están co­ne­c­ta­das con las puertas formales de la acción de de­s­co­m­po­si­ción. Las puertas y los pa­rá­me­tros de ambos elementos deben coincidir. La de­s­co­m­po­si­ción parcial también recibe la etiqueta “ref” y se define por la in­ter­ac­ción asociada.

Cuadro de ac­ti­va­ción/es­pe­ci­fi­ca­ción de ejecución

El cuadro de ac­ti­va­ción (Execution Spe­ci­fi­ca­tion) re­pre­se­n­ta el tiempo en una línea de vida en la que un objeto ejecuta un co­m­po­r­ta­mie­n­to o durante el que tiene lugar una acción. Además, permite modelar el tiempo en el que un objeto implicado envía un mensaje o espera una respuesta, pues el cuadro de ac­ti­va­ción re­pre­se­n­ta un período de tiempo abstracto durante el tiempo de ejecución. Como ocurre en el resto del diagrama de secuencia, el tiempo no es una dimensión absoluta, sino relativa. El co­m­po­r­ta­mie­n­to pasivo, como puede ser esperar una respuesta, también debe in­tro­du­ci­r­se como ac­ti­va­ción en el diagrama de secuencia.

UML presenta la semántica basada en trazas de un cuadro de ac­ti­va­ción a través de la es­tru­c­tu­ra simple <start,end>. Su notación permite dos formas: por un lado, es posible modelar un re­c­tá­n­gu­lo gris alargado y estrecho en la línea de vida. En tales casos, la ac­ti­va­ción no suele incluir una etiqueta en el cuerpo. Por otro, también es posible modelar un re­c­tá­n­gu­lo li­ge­ra­me­n­te más ancho en la línea de vida, donde se dispone de espacio para etiquetar el cuadro de ac­ti­va­ción. Si un objeto realiza una ac­ti­va­ción durante el tiempo de ejecución, puedes indicar el nombre de dicha acción.

El comienzo y el final los marcan las es­pe­ci­fi­ca­cio­nes de ocu­rre­n­cia de eventos (Event Oc­cu­rre­n­ce Spe­ci­fi­ca­tion). Al inicio de una ac­ti­va­ción se encuentra el evento de inicio y al final está el evento de fin. Estos fra­g­me­n­tos re­pre­se­n­tan cada uno un solo momento y existen en una propia línea de vida. La es­pe­ci­fi­ca­ción de ocu­rre­n­cia de evento re­pre­se­n­ta el inicio o el final de una acción. La es­pe­ci­fi­ca­ción de ocu­rre­n­cia de mensajes da la señal para enviar y recibir un mensaje. Por lo tanto, su valor siempre depende del mensaje o de la acción.

La ac­ti­va­ción no tiene notación separada, ya que existe de forma implícita en los elementos de conexión ex­te­rio­res del re­c­tá­n­gu­lo que re­pre­se­n­ta el cuadro de ac­ti­va­ción. Si este pasa por una acción de duración atómica, las aso­cia­cio­nes inicial y final se refieren a la misma es­pe­ci­fi­ca­ción de entrada, lo que se puede resaltar con una línea de conexión entre la acción y la es­pe­ci­fi­ca­ción de entrada.

Hecho

Una acción de duración atómica se muestra como una caja negra. Se trata de una secuencia in­di­vi­si­ble de varias ope­ra­cio­nes simples que no pueden ser ob­se­r­va­das porque se realizan con extrema rapidez. Por lo tanto, una acción de duración atómica aparece completa in­me­dia­ta­me­n­te.

Mientras que otras es­pe­ci­fi­ca­cio­nes de entrada no requieren notación, la de­s­tru­c­ción de la es­pe­ci­fi­ca­ción de entrada de mensaje se marca con una X mayúscula, marcando la di­so­lu­ción de una instancia de un objeto en un punto concreto en la línea de vida (la línea de la vida termina ahí). Las in­s­ta­n­cias su­bo­r­di­na­das o las es­pe­ci­fi­ca­cio­nes de entrada en puntos po­s­te­rio­res de la línea de tiempo no son válidas, dado que después de que el objeto haya sido destruido, estas tampoco pueden existir.

A veces, los cuadros de ac­ti­va­ción se su­pe­r­po­nen. Cuando, por ejemplo, un objeto se envía un mensaje a sí mismo, un cuadro de ac­ti­va­ción envía un mensaje a otra instancia de esa clase. Ambas es­pe­ci­fi­ca­cio­nes están pa­r­cia­l­me­n­te en la misma línea de vida, al mismo tiempo. En el diagrama de secuencia UML, esta ci­r­cu­n­s­ta­n­cia se re­pre­se­n­ta con re­c­tá­n­gu­los su­pe­r­pue­s­tos.

In­va­ria­n­tes de estado

La in­va­ria­n­te de estado es una re­s­tri­c­ción de tiempo de ejecución. La línea de vida re­pre­se­n­ta un objeto. Durante el tiempo de ejecución, este objeto cambia de estado como resultado del cuadro de ac­ti­va­ción. La in­va­ria­n­te de estado examina el objeto con respecto a su cambio de estado en el cuadro de ac­ti­va­ción antes de ejecutar la siguiente es­pe­ci­fi­ca­ción de entrada. Todas las acciones im­plí­ci­tas previas dentro del cuadro de ac­ti­va­ción se co­n­si­de­ran eje­cu­ta­das.

La in­va­ria­n­te de estado fija un valor re­s­tri­c­ti­vo. Si este valor es igual al estado del objeto, la ruta se considera válida. Si el objeto no cumple la re­s­tri­c­ción, su ruta no es válida.

De acuerdo con la notación del diagrama de secuencia UML, la in­va­ria­n­te de estado se escribe con llaves { } dentro del cuadro de ac­ti­va­ción o con un re­c­tá­n­gu­lo re­do­n­dea­do en las esquinas.

Fra­g­me­n­tos co­m­bi­na­dos

Los fra­g­me­n­tos co­m­bi­na­dos se cla­si­fi­can dentro de los fra­g­me­n­tos de in­ter­ac­ción. Se trata de elementos ab­s­tra­c­tos del sistema y re­pre­se­n­tan unidades de in­ter­ac­ción. Esto significa que, aunque pueden ser co­n­si­de­ra­dos parte de una in­ter­ac­ción, ellos mismos también son pequeñas in­ter­ac­cio­nes. Los fra­g­me­n­tos co­m­bi­na­dos en un diagrama de secuencia es­ta­ble­cen el co­m­po­r­ta­mie­n­to de varios fra­g­me­n­tos de in­ter­ac­ción, si bien ellos mismos solo forman el marco. Los definen los ope­ra­do­res de in­ter­ac­ción y los operandos de in­ter­ac­ción: los operandos contienen uno o varios mensajes. En la línea de vida, antes de un fragmento combinado, se sitúa una re­s­tri­c­ción, también llamada condición de guarda, que controla los operandos co­n­te­ni­dos.

Como ya se ha descrito, los operandos son ma­g­ni­tu­des co­n­s­ta­n­tes o variables que pasan por un proceso. Los ope­ra­do­res influyen en el co­m­po­r­ta­mie­n­to de los operandos. Por ejemplo, el operador booleano “OR” puede es­pe­ci­fi­car que se ejecute el operando A o el operando B (o que se ejecuten ambos). Dentro de un fragmento combinado, un operando es­pe­ci­fi­ca que se envíe un mensaje de­te­r­mi­na­do bajo ciertas co­n­di­cio­nes. El operador determina qué re­la­cio­nes de or­de­na­ción tienen los operandos de un fragmento entre sí y qué re­la­cio­nes de or­de­na­ción tienen con el fragmento superior.

Ope­ra­do­res de in­ter­ac­ción

UML define 12 ope­ra­do­res de in­ter­ac­ción.

Al­te­r­na­ti­ve:

Dentro del fragmento combinado con el operador de in­ter­ac­ción “Al­te­r­na­ti­va”, un fragmento su­bo­r­di­na­do solo puede enviar un mensaje si se cumple una de­te­r­mi­na­da condición. De lo contrario, un fragmento co­m­pe­ti­dor dentro del marco enviará su mensaje. La imagen superior muestra un ejemplo de un fragmento combinado con el operador “Al­te­r­na­ti­va”. Utiliza la abre­via­tu­ra “alt” para la etiqueta. Divide el marco re­c­ta­n­gu­lar por una línea di­s­co­n­ti­nua ho­ri­zo­n­tal, co­rre­s­po­n­die­n­do la parte superior a una condición.

Guard:

La condición de guarda comprueba si la condición del operando se cumple. En caso afi­r­ma­ti­vo, el sistema envía un mensaje en el área de condición. Si no, envía un mensaje en el área al­te­r­na­ti­va. Un operando dentro de este fragmento combinado siempre necesita una condición de guarda que se considera verdadera (“true“) para poder eje­cu­tar­se. Si el operando de condición no tiene una condición de guarda explícita, se asume una pro­te­c­ción implícita. Así que este fragmento siempre re­pre­se­n­ta una decisión “o … o”.

Option:

Este fragmento combinado se modela en el diagrama de secuencia como la al­te­r­na­ti­va, porque la opción también re­pre­se­n­ta una decisión. Con todo, solo hay un operando, por lo que la decisión consiste en de­te­r­mi­nar si el operando se ejecuta o no. El operando con una condición no debe estar vacío, aunque por otro lado su al­te­r­na­ti­va sí está vacía. Un fragmento con el operador de in­ter­ac­ción “ejecución opcional” utiliza la etiqueta “opt”.

Break:

Un fragmento combinado con el operador de in­ter­ac­ción “break” in­te­rru­m­pe el fragmento principal. Si una línea de vida cumple la condición del operando, el sistema ejecuta el fragmento combinado, pero ignora el resto del fragmento principal. Para que todas las líneas de vida puedan agotar su vida, debes incluir cada línea de vida en el fragmento combinado. De lo contrario, una línea de vida puede detenerse en medio del proceso sin que sea destruida de la forma adecuada. Si el fragmento break carece de condición de guarda, la decisión es no de­te­r­mi­ni­s­ta. Es por eso que se re­co­mie­n­da utilizar una condición de guarda.

Hecho

El no de­te­r­mi­ni­s­mo es un concepto de ciencia de la co­mpu­tación para si­m­pli­fi­car el modelado. De este modo un sistema tiene más de una forma de lograr un resultado, siempre que el valor de entrada sea el mismo. En la práctica se utilizan los al­go­ri­t­mos de­te­r­mi­ni­s­tas con un solo método de cálculo. Por el contrario, un algoritmo no de­te­r­mi­ni­s­ta sigue una tra­ye­c­to­ria im­pre­de­ci­ble en el cálculo, incluso cuando el sistema se inicia con los mismos valores de entrada. Dado que el algoritmo suele producir re­su­l­ta­dos más di­fe­re­n­tes que un algoritmo de­te­r­mi­ni­s­ta, la tarea debería ser menos compleja. Los modelos ab­s­tra­c­tos si­m­pli­fi­can los sistemas complejos. Por lo tanto, son adecuados para realizar di­fe­re­n­tes cálculos con el algoritmo no de­te­r­mi­ni­s­ta.

Loop:

Un fragmento combinado con el operador de in­ter­ac­ción “loop” repite su operando. La condición de guarda determina el número exacto de eje­cu­cio­nes. Esta pro­te­c­ción puede incluir límites de re­pe­ti­ción y variables booleanas. Los límites de re­pe­ti­ción se indican en la etiqueta del marco siguiendo el esquema: loop (X,Y). Las variables X e Y re­pre­se­n­tan números enteros. X es el número mínimo de re­pe­ti­cio­nes (“min-int”) y nunca es negativo. Y re­pre­se­n­ta al número máximo de re­pe­ti­cio­nes (“max-int”) y ha de ser igual o mayor que el mínimo (es decir, > 0).

De manera opcional es posible anotar la variable booleana en el cuerpo del marco junto a la etiqueta, re­s­tri­n­gie­n­do aún más la re­pe­ti­ción. Si la condición de la variable booleana ya no se cumple y se alcanza el número mínimo de re­pe­ti­cio­nes, el loop se detiene. Puedes anotar la re­s­tri­c­ción entre corchetes, la cual se refiere a factores externos, como la apo­r­ta­ción de un actor.

En un cajero au­to­má­ti­co, por ejemplo, es posible in­tro­du­cir el número PIN tres veces. Si el PIN es in­co­rre­c­to, se pedirá al usuario repetir la entrada. En el diagrama de secuencia UML se anotan el mensaje “In­tro­du­cir PIN” y su respuesta “PIN in­co­rre­c­to. Inténtelo de nuevo” con las flechas co­rre­s­po­n­die­n­tes. La etiqueta tiene forma Loop (0,2). La variable booleana es [PIN in­co­rre­c­to]. Mientras no se in­tro­du­z­ca el PIN correcto, el loop se repite dos veces. Si el PIN es correcto, el sistema resuelve el bucle. Si se excede el número máximo de re­pe­ti­cio­nes, también se libera el loop, pero el proceso se cancela como no válido.

Nota

Si no se establece ninguna li­mi­ta­ción de re­pe­ti­ción, el mínimo es 0 y el máximo es infinito. Si se es­pe­ci­fi­ca una li­mi­ta­ción, el mínimo y el máximo tienen el mismo valor.

Parallel:

No­r­ma­l­me­n­te, la posición de una flecha en la línea de vida en el diagrama de secuencia establece un orden cro­no­ló­gi­co. En un fragmento combinado con el operador de in­ter­ac­ción parallel, sus operandos pueden ejecutar los procesos si­mu­l­tá­nea­me­n­te. Los operandos en­tre­la­zan su orden de pro­ce­di­mie­n­to, si bien el orden dado dentro de los operandos siempre se mantiene. En el diagrama de secuencia UML se modela este fragmento combinado con un marco continuo. Los di­fe­re­n­tes operandos se separan vi­sua­l­me­n­te con líneas di­s­co­n­ti­nuas, de forma similar al operador “al­te­r­na­ti­va”. En la etiqueta se introduce la abre­via­tu­ra “par” . Además, si los operandos han de trabajar en paralelo en una sola línea de vida, UML permite una forma abreviada: la Co-Region cumple exac­ta­me­n­te con esta tarea. Para ello, si­m­ple­me­n­te combina los eventos con un corchete.

Sección crítica:

Uti­li­za­n­do una sección crítica, el sistema evita los errores que pueden ocurrir cuando varios procesos comparten recursos. Dentro de esta área de sistema, solo un proceso utiliza el recurso hasta un punto concreto en el tiempo. Además, el sistema prioriza el proceso re­s­pe­c­ti­vo. Con la etiqueta “critical” se define una región crítica con el objetivo de evitar que otros ope­ra­do­res de in­ter­ac­ción influyan en un fragmento principal. Por ejemplo, bloquea las trazas en­tre­la­za­das de un fragmento paralelo combinado.

Como muestra el gráfico superior, una línea directa del proveedor de gas acepta varias llamadas en paralelo y las reenvía si­mu­l­tá­nea­me­n­te a los empleados de la línea directa. Sin embargo, si se trata de una eme­r­ge­n­cia por posible olor a gas, el sistema prioriza el mensaje y reenvía la llamada a través de la sección crítica al servicio de eme­r­ge­n­cias. La sección crítica evita que los flujos de in­fo­r­ma­ción del fragmento principal se procesen en paralelo con el mensaje de la sección crítica. Solo las líneas de vida en la sección crítica se comportan de esta manera.

Assertion:

El operador de in­ter­ac­ción “assertion” define el estado de las se­cue­n­cias. Las se­cue­n­cias dentro de un operando con la etiqueta assert se co­n­si­de­ran se­cue­n­cias válidas. El operador establece que todas las se­cue­n­cias fuera del fragmento finalizan en trazas no válidas.

Ignore/consider:

Un diagrama de secuencia UML re­pre­se­n­ta de forma detallada una parte del sistema. No obstante, para una vi­sua­li­za­ción de­te­r­mi­na­da, algunos mensajes no son ne­ce­sa­rios, mientras otros han de ser incluidos. Con el operador de in­ter­ac­ción “ignore” se excluyen ciertos mensajes. Esta in­fo­r­ma­ción aparece en el sistema en una traza, pero no en el fragmento ignore. La notación determina el uso de una etiqueta con la siguiente es­tru­c­tu­ra: ignore {mensaje1,mensaje2}.

Los fra­g­me­n­tos co­m­bi­na­dos con el operador de in­ter­ac­ción “consider”, por otro lado, incluyen ciertos mensajes en un fragmento. El sistema ignora todos los demás mensajes que pasan por el fragmento. Los mensajes que hay que co­n­si­de­rar se incluyen según la siguiente es­tru­c­tu­ra: consider {mensaje3,mensaje4}.

Estos dos ope­ra­do­res tienen tareas co­n­tra­pue­s­tas. Sin embargo, los dos suelen aparecer con fre­cue­n­cia en fra­g­me­n­tos en­tre­la­za­dos. Por ejemplo, los mo­de­la­do­res a menudo combinan assert con ignore (assert ignore {Msg1, Msg2}) o assert y consider (assert y consider {Msg3, Msg4})

Negative:

Para indicar un error del sistema, se utiliza el operador de in­ter­ac­ción “negative”. El fragmento combinado contiene, por tanto, trazas no válidas. El operador se utiliza, por ejemplo, cuando se visualiza un pro­ce­di­mie­n­to de registro al sistema uti­li­za­n­do un diagrama de secuencia. Al modelar la línea de vida de un actor en el camino hacia tiempo muerto, puedes enmarcar este mensaje de error con el fragmento negativo (denotado neg). Debido al modelado explícito de trazas no válidas en el fragmento combinado negativo, el resto de fra­g­me­n­tos se co­n­si­de­ran positivos y sus trazas, válidas.

Strict:

Dentro de un fragmento combinado, puede ser im­po­r­ta­n­te mantener un orden estricto. La etiqueta “strict” impone una se­cue­n­cia­ción rigurosa en sus operandos. Esto se aplica al primer nivel del fragmento. Los operandos en otros fra­g­me­n­tos están sujetos a su propio orden.

Se­cue­n­cia­ción weak:

Los fra­g­me­n­tos co­m­bi­na­dos con el operador de in­ter­ac­ción “seq” re­pre­se­n­tan un orden débil. El co­m­po­r­ta­mie­n­to entre los operandos del fragmento influye en las pro­pie­da­des de las trazas en lugar de en los ope­ra­do­res de in­ter­ac­ción. Por lo tanto, una se­cue­n­cia­ción débil puede actuar como un fragmento paralelo. Esto sucede cuando los operandos pa­r­ti­ci­pan en di­fe­re­n­tes líneas de vida. A cambio, la se­cue­n­cia­ción débil se tra­n­s­fo­r­ma en un orden estricto cuando sus operandos aparecen en la misma línea de vida. La etiqueta es “seq”.

Las trazas con las si­guie­n­tes pro­pie­da­des definen la se­cue­n­cia­ción weak:

  1. Las es­pe­ci­fi­ca­cio­nes de eventos dentro de un operando conservan su orden.
  2. Las es­pe­ci­fi­ca­cio­nes de eventos que actúan en di­fe­re­n­tes líneas de vida y que no ocurren dentro del mismo operando ocurren en cualquier orden.
  3. Si las es­pe­ci­fi­ca­cio­nes del evento actúan en la misma línea de vida, pero en operandos di­fe­re­n­tes, su posición en la línea de vida prescribe su orden. De este modo, el primer operando viene antes que el segundo operando.

Co­n­ti­nua­tion:

La co­n­ti­nua­ción no se puede co­n­si­de­rar un fragmento in­de­pe­n­die­n­te. De hecho, solo recibe su propia semántica en los fra­g­me­n­tos co­m­bi­na­dos al­te­r­na­ti­va y se­cue­n­cia­ción weak. La forma para la co­n­ti­nua­ción es la misma que para la in­va­ria­n­te de estado: un re­c­tá­n­gu­lo con esquinas re­do­n­dea­das. Se di­fe­re­n­cia, sin embargo, de la variante de estado en que puede cubrir de forma opcional varias líneas de vida.

Según cómo se organice la co­n­ti­nua­ción en el diagrama de secuencia, la tarea también cambia. Si la co­n­ti­nua­ción está al principio de un diagrama de in­ter­ac­ción, se usa para modelar el co­m­po­r­ta­mie­n­to de la co­n­ti­nua­ción. Si la co­n­ti­nua­ción se encuentra al final de su fragmento de in­ter­ac­ción, reenvía el proceso. Si nombra su co­n­ti­nua­ción (como en el ejemplo: notOK), el siguiente fragmento de la línea de vida debe tener una co­n­ti­nua­ción con el mismo nombre (notOK) o no debe modelar una co­n­ti­nua­ción. Si la co­n­ti­nua­ción se encuentra sola en el fragmento, esto co­rre­s­po­n­de a una co­n­ti­nua­ción al final del fragmento.

En resumen

Si deseas mostrar ejemplos de apli­ca­ción en detalle o comprobar la lógica de un sistema, crea un diagrama de secuencia con UML. La notación permite modelar el flujo de mensajes durante toda la vida útil de un objeto. Incluso las ope­ra­cio­nes complejas pueden mostrarse cla­ra­me­n­te uti­li­za­n­do fra­g­me­n­tos de in­ter­ac­ción en­tre­la­za­dos. El diagrama de secuencia no es sin razón uno de los diagramas de co­m­po­r­ta­mie­n­to de UML más uti­li­za­dos.

Ir al menú principal