El diagrama de ac­ti­vi­da­des es un tipo de diagrama dentro del lenguaje unificado de modelado (UML). Este lenguaje de modelado gráfico define formas para la re­pre­se­n­ta­ción de la pro­gra­ma­ción orientada a objetos; en concreto, es­pe­ci­fi­ca 14 tipos de diagramas. A cada uno de ellos se le asignan de­te­r­mi­na­dos fo­r­mu­la­rios y con la ayuda de reglas de notación, los sistemas y procesos pueden ser resumidos y re­pre­se­n­ta­dos cla­ra­me­n­te. UML no solo modela sistemas de software, sino también procesos em­pre­sa­ria­les. Los diagramas de ac­ti­vi­da­des son útiles, sobre todo, en estas dos áreas. Pero ¿con qué propósito se crea un diagrama de actividad?

El propósito de los diagramas de actividad

Los diagramas de ac­ti­vi­da­des UML pe­r­te­ne­cen al grupo de diagramas de co­m­po­r­ta­mie­n­to en UML. Mientras que un diagrama de es­tru­c­tu­ra registra el estado de un sistema, es decir, los objetos exi­s­te­n­tes y sus je­ra­r­quías, así como las co­ne­xio­nes entre ellos en un momento de­te­r­mi­na­do, los diagramas de co­m­po­r­ta­mie­n­to describen el flujo cro­no­ló­gi­co de la ci­r­cu­la­ción de datos. Además del diagrama de ac­ti­vi­da­des, el diagrama de caso de uso y el diagrama de máquina de estados también pe­r­te­ne­cen a este grupo. Los diagramas de ac­ti­vi­da­des son similares en su uso y notación a los diagramas de flujo (es­pe­cia­l­me­n­te a los diagramas de programas), pero se adaptan a la pro­gra­ma­ción orientada a objetos.

Bá­si­ca­me­n­te se puede decir que el diagrama de ac­ti­vi­da­des modela el flujo de ac­ti­vi­da­des. Estos pueden ser procesos dentro de un sistema in­fo­r­má­ti­co, procesos de casos de uso o procesos co­me­r­cia­les. Por ejemplo, la actividad “preparar una tortilla de queso” puede de­s­co­m­po­ne­r­se en muchas ac­ti­vi­da­des se­cu­n­da­rias más pequeñas: las acciones, que pueden llevarse a cabo cro­no­ló­gi­ca­me­n­te. Una acción, por ejemplo, sería “cascar los huevos” y vendría seguida de la acción “batir los huevos con especias”. La segunda acción está su­pe­di­ta­da a la primera. Están en un estado de evolución, por así decirlo.

También pueden re­pre­se­n­tar­se procesos paralelos. Por ejemplo, en el caso de que sean dos personas las que preparan la tortilla, es posible que las acciones de “cascar los huevos” y “picar las especias” sean si­mu­l­tá­neas. Por lo tanto, la actividad tiene dos puntos de partida, desde los que las personas comienzan su actividad, mo­vié­n­do­se de una acción a otra. En el diagrama de ac­ti­vi­da­des, los dos actores de la acción (las dos personas) de­sem­pe­ñan un papel im­po­r­ta­n­te, pero no reciben notación propia. Se mueven de un punto de partida a un punto final, atra­ve­sa­n­do los flujos de prueba u objetos para pasar de una acción a la siguiente. En el camino hay ob­s­tácu­los oca­sio­na­les, los llamados pines, que solo dejan pasar bajo ciertas co­n­di­cio­nes, por ejemplo, cuando ambas personas están presentes.

En el diagrama de ac­ti­vi­da­des, estas “personas” se denominan tokens. Hay dos tipos de token en el diagrama de ac­ti­vi­da­des UML: el primero es el objeto token, que transmite in­fo­r­ma­ción a los nodos de acción, inicia allí una acción y (si se es­pe­ci­fi­ca) almacena el resultado como un valor. Si el resultado y el token co­rre­s­po­n­den a las es­pe­ci­fi­ca­cio­nes definidas en un pin, este pin de salida envía el objeto token mediante un flujo de objetos a la siguiente acción. Antes de que el token pueda iniciar esta acción, debe cumplir con las es­pe­ci­fi­ca­cio­nes del pin de entrada. Los tokens de control, por otra parte, solo migran a través de flujos de control y sirven como ma­r­ca­do­res. Inician una acción, pero no tra­n­s­mi­ten ningún dato.

En el ejemplo “preparar una tortilla de queso” de arriba uti­li­za­mos el diagrama de ac­ti­vi­da­des para mostrar la secuencia cro­no­ló­gi­ca de un caso de uso. Los diagramas de casos de uso, en cambio, re­pre­se­n­tan los re­qui­si­tos del sistema que deben cumplirse.

Por supuesto, los diagramas de ac­ti­vi­da­des UML no solo se utilizan para casos de apli­ca­ción de la vida diaria. En primera instancia ayudan a presentar los procesos de los sistemas de software de forma es­tru­c­tu­ra­da y con ellos, los analistas eco­nó­mi­cos, por ejemplo, hacen es­pe­ci­fi­ca­cio­nes a los de­sa­rro­lla­do­res de software. Uti­li­za­n­do el lenguaje gráfico, los expertos in­te­r­ca­m­bian in­fo­r­ma­ción de forma clara y co­m­pre­n­si­ble uni­ve­r­sa­l­me­n­te. Una vez que se han aclarado todos los procesos y se han eliminado los errores, el diagrama de ac­ti­vi­da­des sirve como una plantilla limpia para la pro­gra­ma­ción.

Si integras una he­rra­mie­n­ta UML en tu entorno de de­sa­rro­llo integrado, el diagrama puede actuar como un marco de código uti­li­za­n­do la co­n­ve­r­sión XML como lenguaje de pro­gra­ma­ción.

El Object Ma­na­ge­me­nt Group (OMG), que es­pe­ci­fi­ca el lenguaje unificado de modelado (UML), resume las posibles tareas de los diagramas de ac­ti­vi­da­des UML de la siguiente manera:

  • Pro­gra­ma­ción in­fo­r­má­ti­ca pro­ce­di­me­n­tal que asigna je­ra­r­quías a las ac­ti­vi­da­des.
  • En los modelos orie­n­ta­dos a objetos, las ac­ti­vi­da­des actúan como métodos que describen los procesos con más detalle.
  • Vi­sua­li­za­ción de flujos de trabajo y procesos em­pre­sa­ria­les.
  • En el caso de los sistemas de apli­ca­ción asistidos por ordenador, las ac­ti­vi­da­des es­pe­ci­fi­can los procesos a nivel de sistema.

Las no­ta­cio­nes para los diagramas de ac­ti­vi­da­des UML

Las formas dentro del UML pueden ser equi­pa­ra­das a los co­m­po­ne­n­tes de las oraciones en un idioma. Por lo tanto, el lenguaje de modelado asigna un si­g­ni­fi­ca­do a cada forma. Los mo­di­fi­ca­do­res se encargan de describir las formas con más detalle y de re­la­cio­nar­las entre sí. Además, hay que tener en cuenta que, a veces, las formas necesitan otras formas o etiquetas para crear un diagrama si­g­ni­fi­ca­ti­vo. Del mismo modo que el lenguaje hablado solo tiene sentido si se respetan ciertas reglas gra­ma­ti­ca­les básicas, UML solo funciona como medio de co­mu­ni­ca­ción si se respetan las es­pe­ci­fi­ca­cio­nes.

UML 2.5 es la es­pe­ci­fi­ca­ción más reciente del lenguaje de modelado y, por lo tanto, co­n­s­ti­tui­rá la base de las in­di­ca­cio­nes que siguen. UML determina la notación de los tipos de diagrama basándose en sus áreas de apli­ca­ción. Dado que el diagrama de ac­ti­vi­da­des UML re­pre­se­n­ta el flujo de los procesos del sistema y los casos de uso, el me­ta­mo­de­la­do le asigna los fo­r­mu­la­rios apro­pia­dos.

¿Cómo se muestran vi­sua­l­me­n­te los co­m­po­ne­n­tes in­di­vi­dua­les y qué funciones cumplen los símbolos en el diagrama de ac­ti­vi­da­des UML?

Ac­ti­vi­da­des

En UML 2 una actividad (activity en inglés) es un co­m­po­r­ta­mie­n­to que supedita las unidades su­bo­r­di­na­das (acciones y objetos) a una secuencia cro­no­ló­gi­ca. Para ello, utiliza modelos de flujo de datos y de control. El diagrama de ac­ti­vi­da­des se puede vi­sua­li­zar como parte de un sistema más grande junto con otros tipos de diagrama. Un re­c­tá­n­gu­lo grande y re­do­n­dea­do marca la actividad como un sistema cerrado (aunque puede omitirse). En la imagen de ejemplo, más abajo, se puede ver la actividad “Cocinar es­pá­rra­gos”. En el en­ca­be­za­do del re­c­tá­n­gu­lo grande se escribe el título. El cuerpo contiene flechas (bordes, edges en inglés) y re­c­tá­n­gu­los que si­m­bo­li­zan las acciones, los objetos y los flujos de datos o de control de la operación.

Las ac­ti­vi­da­des se co­n­si­de­ran clases en UML (su metaclase es el co­m­po­r­ta­mie­n­to) que pueden definirse más co­n­cre­ta­me­n­te con pro­pie­da­des. Esto puede influir en los elementos su­bo­r­di­na­dos. Una actividad se da por fi­na­li­za­da cuando un token se ha movido, a través de las diversas acciones, desde su punto de partida inicial hasta el punto final. El punto final destruye el token, así como a todos los demás tokens, de forma que la actividad detiene todas las acciones si­n­cró­ni­cas.

Nota

UML 1 define los diagramas de actividad de forma diferente a UML 2. La versión anterior les asignaba el papel de un diagrama de máquina de estados es­pe­cia­li­za­do, lo que limitaba sus áreas de apli­ca­ción. Si está uti­li­za­n­do una he­rra­mie­n­ta UML, debes ase­gu­rar­te de que esta es co­m­pa­ti­ble con la fo­r­mu­la­ción deseada –lo ideal sería que se tratara de UML 2.5 o superior.

Acciones: nodos de actividad que re­pre­se­n­tan el co­m­po­r­ta­mie­n­to

Una acción (en inglés, action, exe­cu­ta­ble node) es un elemento del modelo que está je­rá­r­qui­ca­me­n­te su­bo­r­di­na­do a la actividad: la acción es una instancia de la clase actividad. Las acciones re­pre­se­n­tan a un co­m­po­r­ta­mie­n­to dentro de un sistema: son los bloques de co­n­s­tru­c­ción básicos uti­li­za­dos para expresar el co­m­po­r­ta­mie­n­to en UML. Se utilizan tanto en los diagramas de ac­ti­vi­da­des como en las in­ter­ac­cio­nes.

Al crear un diagrama de ac­ti­vi­da­des, se utiliza la notación “Acción” para re­pre­se­n­tar las partes eje­cu­ta­bles de una actividad. En el ejemplo anterior, la acción de “pelar los es­pá­rra­gos y ponerlos en la olla” es un paso hacia la fi­na­li­za­ción de la actividad “cocinar los es­pá­rra­gos”. Las acciones reciben in­fo­r­ma­ción de entrada, la procesan y producen in­fo­r­ma­ción de salida. Una acción no se detiene hasta que se completa.

Dentro de los diagramas de ac­ti­vi­da­des UML, las acciones pe­r­te­ne­cen a los nodos de actividad. Las flechas conectan las acciones entre sí. UML distingue entre flujos de objetos (flujos de datos) y flujos de control (tra­n­s­po­r­ta tokens de control). Las acciones solo procesan flujos de control. Cuando los flujos de datos se mueven entre acciones, los pins (nodos de objetos) aceptan los tokens de objetos como entrada, los co­n­vie­r­ten para pro­ce­sar­los en la acción y luego generan la salida de objetos que se mueve como tokens de objetos.

Hecho

La categoría Nodo de actividad se introdujo en UML 2. Existen tres subtipos: nodos de control, nodos de objeto y nodos eje­cu­ta­bles (las acciones). No hay je­ra­r­quías entre estos tres. Siempre que no estén co­ne­c­ta­dos en cadena o definidos más es­tre­cha­me­n­te dentro de un grupo de ac­ti­vi­da­des, pueden eje­cu­tar­se en cualquier orden (es decir, tan pronto como los tokens entrantes cumplan las co­n­di­cio­nes de un nodo) o pa­ra­le­la­me­n­te.

Solo cuando se cumplen las co­n­di­cio­nes es­pe­ci­fi­ca­das en los pines, los datos in­tro­du­cen una acción (pin de entrada) o la acción produce un resultado (pin de salida). Incluso si una acción tiene varios flujos de control de entrada, cada una debe ofrecer un token antes de que se inicie la acción.

Para las acciones dentro de un diagrama de actividad, la sintaxis presenta la forma simple del re­c­tá­n­gu­lo re­do­n­dea­do. Sin embargo, los mo­de­la­do­res también pueden recurrir a acciones es­pe­cí­fi­cas para obtener de­s­cri­p­cio­nes más de­ta­lla­das. UML emplea su propia notación para expresar algunas de ellas:

  1. Opaque actions son “acciones opacas”. Actúan como ma­r­ca­do­res de posición o se es­pe­ci­fi­can mediante una sintaxis de texto concreta (no definida por UML).
  2. In­vo­ca­tion actions son acciones que causan un cierto co­m­po­r­ta­mie­n­to, tanto directa como in­di­re­c­ta­me­n­te. Esto incluye:
  • Call actions: Una call behavior action es una llamada directa a un co­m­po­r­ta­mie­n­to. Una call operation action, en cambio, envía una petición a un objeto que llama a un co­m­po­r­ta­mie­n­to asociado. La start object behavior action hace que un objeto ejecute di­re­c­ta­me­n­te su co­m­po­r­ta­mie­n­to de instancia. Si no se determina ninguna, puede des­en­ca­de­nar el co­m­po­r­ta­mie­n­to de clase de nivel superior (cla­s­si­fier behavior).

La notación de una acción que origina un co­m­po­r­ta­mie­n­to es un re­c­tá­n­gu­lo re­do­n­dea­do y en él deberás in­tro­du­cir el nombre del co­m­po­r­ta­mie­n­to. Las call behavior actions también están marcadas con un símbolo de tridente (como se muestra en la imagen de abajo). Esto re­pre­se­n­ta la ra­mi­fi­ca­ción je­rá­r­qui­ca adicional creada por la acción.

  • Send actions: en el diagrama de ac­ti­vi­da­des, las acciones de envío siempre envían datos asi­n­cró­ni­ca­me­n­te (los diagramas de secuencia también conocen los mensajes si­n­cró­ni­cos). Esto significa que no esperan una respuesta del objeto de destino y, por lo tanto, no bloquean el flujo del objeto. La acción concluye tan pronto como se haya enviado el mensaje. Por lo tanto, puede tener una entrada de ar­gu­me­n­tos como, por ejemplo, pa­rá­me­tros, pero no produce una salida de re­su­l­ta­dos. Además, los mensajes pueden ir a varios de­s­ti­na­ta­rios al mismo tiempo. La acción de la señal de envío, la acción de la señal de difusión y la acción del objeto de envío se engloban dentro de este tipo.

Las acciones de envío de señales se desvían en su notación de la forma habitual (el re­c­tá­n­gu­lo re­do­n­dea­do) y en su lugar un pentágono indica la dirección de la señal tra­n­s­mi­ti­da como una gran flecha. Si el contenido de una acción de objeto de envío también consiste en una señal, puede utilizar la misma notación.

  1. Las object actions modifican el estado de los objetos (y también las in­s­ta­n­cias de una clase). Puedes crearlos o de­s­trui­r­los, co­m­pa­rar­los con otras in­s­ta­n­cias, leerlos y luego asi­g­nar­los a una clase o modificar la cla­si­fi­ca­ción. Las in­s­ta­n­cias de acciones de objetos existen bajo UML 2 son las si­guie­n­tes:
  • Las create object actions generan in­s­ta­n­cias de una clase, es decir, objetos.
  • Las destroy object actions destruyen el objeto en su pin de entrada.
  • Las test identity actions examinan si dos valores en su pin de entrada re­pre­se­n­tan el mismo objeto.
  • Read self actions, de­te­r­mi­nan su propio objeto de contexto.
  • Value spe­ci­fi­ca­tion actions, examinan las es­pe­ci­fi­ca­cio­nes de valor. La notación lleva la etiqueta value spe­ci­fi­ca­tion.
  • Read extent actions, en­cue­n­tran todos los objetos de una clase, así como los objetos de sus es­pe­ci­fi­ca­cio­nes. Por razones prácticas, los mo­de­la­do­res suelen limitar el radio de alcance.
  • Re­cla­s­si­fy object actions, cambian la clase del objeto en el pin de entrada.
  • Read is cla­s­si­fied object actions, de­te­r­mi­nan si un objeto en el pin de entrada pertenece a una clase.
  • Start cla­s­si­fier behavior actions des­en­ca­de­nan un co­m­po­r­ta­mie­n­to para un objeto que está de­te­r­mi­na­do por su clase. El co­m­po­r­ta­mie­n­to es entonces asi­n­cró­ni­co.
  1. Las link actions cambian el co­m­po­r­ta­mie­n­to de las aso­cia­cio­nes (las re­la­cio­nes entre cla­si­fi­ca­do­res, por lo general de dos clases) y sus in­s­ta­n­cias, los enlaces. Aquí se incluyen:
  • Read link actions: recuperan valores (datos de fin de enlace) en una página de una aso­cia­ción.
  • Create link actions: crean enlaces (no tienen pins de salida porque los enlaces no son datos en sí mismos) y enlazan objetos.
  • Destroy link actions: eliminan los enlaces y los objetos de enlace si co­rre­s­po­n­den a un valor de datos del extremo del enlace es­pe­ci­fi­ca­do.
  1. Las link object actions influyen en el co­m­po­r­ta­mie­n­to de los objetos enlazados de forma similar a las link actions, pero co­n­si­de­ran los objetos desde otros puntos de vista. Estas son las in­s­ta­n­cias de acciones de objetos de enlace:
  • Read link object end actions, que recuperan objetos finales de objetos enlazados.
  • Read link object end qualifier actions, que recuperan los valores finales del cla­si­fi­ca­dor de los objetos de enlace.
  • Create link object actions, que son acciones Create link es­pe­cia­les que se pueden utilizar para crear objetos de enlace.
  1. Las stru­c­tu­ral feature actions de­te­r­mi­nan el co­m­po­r­ta­mie­n­to de las ca­ra­c­te­rí­s­ti­cas es­tru­c­tu­ra­les en los diagramas de ac­ti­vi­da­des. Para ello necesitan un pin de entrada, ya que no­r­ma­l­me­n­te se les asigna un objeto y una ca­ra­c­te­rí­s­ti­ca es­tru­c­tu­ral de un cla­si­fi­ca­dor es­pe­ci­fi­ca­da es­tá­ti­ca­me­n­te. La acción de las ca­ra­c­te­rí­s­ti­cas es­tru­c­tu­ra­les afecta a ambos elementos. Existen los si­guie­n­tes tipos:
  • Read stru­c­tu­ral feature action: leen los valores de las ca­ra­c­te­rí­s­ti­cas es­tru­c­tu­ra­les y los tra­n­s­mi­ten como salida.
  • Add stru­c­tu­ral feature value actions: requieren un pin de entrada de valores. Es­pe­ci­fi­can el valor que la acción asigna a una ca­ra­c­te­rí­s­ti­ca es­tru­c­tu­ral.
  • Remove stru­c­tu­ral feature value actions: restan un valor de una ca­ra­c­te­rí­s­ti­ca es­tru­c­tu­ral. Un pin de entrada de valores con mu­l­ti­pli­ci­dad 1..1 es­pe­ci­fi­ca este valor.
  • Clear stru­c­tu­ral feature actions: eliminan todos los valores de un elemento de es­tru­c­tu­ra.
  1. Las variable actions influyen en las variables es­pe­ci­fi­ca­das es­tá­ti­ca­me­n­te que están definidas por una actividad o un nodo de actividad es­tru­c­tu­ra­do. Hay tres tipos:
  • Add variable value actions, también requieren un pin de entrada de valores. Debe ser del mismo tipo que la variable y añadirle exac­ta­me­n­te un valor.
  • Remove variable value actions, eliminan un valor es­pe­ci­fi­ca­do por el pin.
  • Clear variable actions, eliminan todos los valores de una variable.
  1. Accept event actions: pe­r­te­ne­cen a los llamados puntos de espera (wait points). Esto significa que la acción espera que tenga lugar un evento (event) del pool de eventos del objeto context. La acción cuenta con des­en­ca­de­na­n­tes que provocan la acción cuando se producen uno o más estados pre­s­cri­tos. UML describe tres es­pe­cia­li­za­cio­nes:
  • Accept call actions: tienen un di­s­pa­ra­dor que acepta eventos de llamada. Dos pins de salida de re­su­l­ta­dos y un pin de salida de in­fo­r­ma­ción de retorno completan el acuerdo. Si se debe ejecutar una acción de respuesta, la in­fo­r­ma­ción necesaria para ello se almacena en el pin de salida de in­fo­r­ma­ción de retorno.
  • Reply actions: tienen una conexión con las acciones de aceptar llamada. Por un lado, los des­en­ca­de­na­n­tes deben coincidir para que la acción de respuesta, en el caso de un evento de llamada, pueda reac­cio­nar a la acción de ace­p­ta­ción de llamada ejecutada pre­via­me­n­te. Por otro lado, el co­m­po­r­ta­mie­n­to del cual depende coloca su valor de salida en el pin de entrada de in­fo­r­ma­ción de retorno de la acción de respuesta.
  • Un­ma­r­sha­ll actions: consultan los valores de las ca­ra­c­te­rí­s­ti­cas de la es­tru­c­tu­ra de re­fe­re­n­cia. Para reconocer el objeto, tienen un pin de entrada de objeto. Los valores obtenidos se emiten en un pin de salida.
Hecho

Si los datos es­tru­c­tu­ra­dos de un objeto o también los datos ele­me­n­ta­les de un programa deben ser tra­n­s­fe­ri­dos a otros programas o partes del programa, o si se desea al­ma­ce­nar­los, entonces se han de convertir en un formato adecuado para ello. Este proceso se llama ma­r­sha­lli­ng. El proceso opuesto, un­ma­r­sha­lli­ng (o un­ma­r­sha­li­ng), convierte estos datos “co­n­ge­la­dos” en objetos eje­cu­ta­bles. Un ejemplo de esto es la tra­n­s­fe­re­n­cia de diagramas UML de una he­rra­mie­n­ta a otra uti­li­za­n­do la co­n­ve­r­sión XML.

  1. Las stru­c­tu­red actions están de­cla­ra­das en el diagrama de ac­ti­vi­da­des con UML 2 como una acción y como un grupo de ac­ti­vi­da­des (ver arriba). Esto significa, por un lado, que su co­m­po­r­ta­mie­n­to está de­te­r­mi­na­do por los nodos de actividad y las flechas y, por el otro, que ciertos subtipos de estas acciones pre­s­cri­ben un de­te­r­mi­na­do co­m­po­r­ta­mie­n­to para los nodos eje­cu­ta­bles debido a su semántica, en pa­r­ti­cu­lar con respecto a su secuencia.

Estos son los subtipos de acciones es­tru­c­tu­ra­das:

  • Co­n­di­tio­nal nodes, consisten en una o más cláusulas que re­pre­se­n­tan las di­fe­re­n­tes ramas de las posibles acciones eje­cu­ta­bles. Una cláusula contiene un segmento de prueba y un segmento de cuerpo, que a su vez incluyen nodos eje­cu­ta­bles sin cortes. En primer lugar, la cláusula ejecuta la acción en el área de prueba. Si su valor de salida es verdadero, la cláusula ejecuta la acción en el área del cuerpo.
  • Loop nodes, describe un grupo de acciones que se repiten dentro de un bucle. Las acciones se dividen en tres secciones: co­n­fi­gu­ra­ción, prueba y cuerpo. El bucle siempre ejecuta la co­n­fi­gu­ra­ción primero, seguido por una prueba o cuerpo que luego se repetirá al­te­r­na­ti­va­me­n­te.
  • Sequence nodes, imponen una secuencia a los nodos eje­cu­ta­bles dentro de sus límites. Estos se re­pre­se­n­tan con flujos de datos como flechas, que pueden apuntar hacia dentro o hacia fuera de la es­tru­c­tu­ra.
  1. Las expansion regions son otro tipo de nodos de actividad es­tru­c­tu­ra­dos. Aceptan como entrada a una o más co­le­c­cio­nes de valores. En el camino a la región de expansión, el pin de entrada copia cada token entrante en el número de artículos de la colección. Todos los nodos de la colección se ocupan de cada uno de los valores de la colección. Un turno se considera una ejecución de expansión (expansion execution). Un nodo de desglose (una especie de nodo de objeto) indica la interface de la región de desglose. Hacia el exterior, muestra sus valores como una colección y, hacia el interior, cada uno de los elementos del conjunto se considera un valor. Para la notación, se dibuja un re­c­tá­n­gu­lo re­do­n­dea­do con una línea de puntos. Los nodos de expansión aparecen como re­c­tá­n­gu­los con segmentos y, como se muestra a co­n­ti­nua­ción, se dibujan di­re­c­ta­me­n­te en la línea. La se­g­me­n­ta­ción debe re­pre­se­n­tar la lista de co­le­c­cio­nes de valor.
  1. Las reduce actions provocan un co­m­po­r­ta­mie­n­to hasta que un único valor emerge de una colección de valores. Para este fin, la acción combina los elementos de la colección. Por lo tanto, la acción tiene dos pa­rá­me­tros de entrada, pero sólo un parámetro de salida o retorno.
  2. Las raise exception actions terminan por sí mismas tan pronto como causan una excepción. Por lo tanto, no terminan como las acciones normales, que se detienen cuando se completa la acción. Se extienden hacia el exterior a través del sistema hasta el siguiente nodo de actividad es­tru­c­tu­ra­do superior. Si tienes un co­n­tro­la­dor que coincide con la excepción, la acción se detiene. De lo contrario, sigue pro­pa­gá­n­do­se.

Nodos de objeto: nodos de actividad que dirigen tokens de objetos

Los nodos de objetos son subtipos de los nodos de actividad. En UML, un objeto suele ser la instancia con valor más pequeña. Los objetos re­pre­se­n­tan datos en el diagrama de ac­ti­vi­da­des. Mientras se ejecuta una acción, los nodos de objeto retienen estos datos. Porque solo los tokens de control pueden recorrer una acción. Los tokens de objeto, en cambio, entran como valores por un pin de entrada y son enviados desde el pin de salida al flujo de objetos.

Los nodos de objetos se in­tro­du­je­ron por primera vez en el diagrama de ac­ti­vi­da­des del UML-2. Son elementos ti­pi­fi­ca­dos. Si un nodo de objeto co­rre­s­po­n­de a un de­te­r­mi­na­do tipo, los tokens de objeto que se mueven sobre él deben tener valores co­rre­s­po­n­die­n­tes. Una excepción son los tokens nulos que no tienen valor, aju­s­tá­n­do­se a cada nodo de objeto.

Los nodos de objeto pre­s­cri­ben el orden en el que los tokens los dejan. Hay cuatro maneras de hacerlo:

  • Des­or­de­na­do (no es­pe­ci­fi­ca­do)
  • Ordenado (co­m­po­r­ta­mie­n­to definido por el modelador)
  • FIFO (first in first out): el orden de entrada y salida sigue siendo el mismo.
  • LIFO (last in first out): el orden es exac­ta­me­n­te el opuesto.

Si deseas crear un diagrama de ac­ti­vi­da­des, puedes decidirte por uno de los cuatro tipos de nodos de objetos:

  1. Pin: ya hemos hablado de los pins. En el primer gráfico se podía ver la notación básica de los pins. Debido a su función de enlace entre las acciones y los flujos de objetos, los mo­de­la­do­res suelen di­bu­jar­los como pequeños re­c­tá­n­gu­los di­re­c­ta­me­n­te sobre el símbolo de la acción. Los pins de entrada (input pins) están marcados con un borde (un flujo de objeto) en la dirección de la acción. Para los pins de salida (output pins) la flecha se aleja de la acción. El siguiente gráfico muestra cómo se pueden acortar la re­pre­se­n­ta­ción de pins del mismo tipo (izquierda) o cómo se pueden dibujar pins de entrada y salida si se omiten los bordes (derecha).
  1. Nodos de pa­rá­me­tros de actividad: la actividad pertenece a la metaclase de la de­s­cri­p­ción del co­m­po­r­ta­mie­n­to. Según UML, todo co­m­po­r­ta­mie­n­to tiene pa­rá­me­tros. Antes de que se ejecute un co­m­po­r­ta­mie­n­to, puedes ali­me­n­tar­lo con valores para su pro­ce­sa­mie­n­to. Una vez pro­ce­sa­dos, el sistema devuelve nuevos valores. En esta es­tru­c­tu­ra, los pa­rá­me­tros son los ma­r­ca­do­res de posición que permiten in­tro­du­cir o emitir estos valores. El nodo de parámetro de actividad se encarga de esto en el diagrama de ac­ti­vi­da­des UML. Esto significa que los nodos de pa­rá­me­tros de actividad se en­cue­n­tran al principio y al final de una actividad.

Como resultado, un nodo de este tipo tiene solo flechas de actividad de entrada o de salida. Los nodos de pa­rá­me­tros de actividad de entrada se dibujan con flechas de salida y los nodos de pa­rá­me­tros de actividad de salida con flechas de entrada. Hay un nodo de parámetro de actividad por parámetro, donde ambos son del mismo tipo.

  1. Nodo central de al­ma­ce­na­mie­n­to: al igual que los pins, el nodo tampón (nodo tampón central) se aplica di­re­c­ta­me­n­te en el diagrama de ac­ti­vi­da­des. Este nodo de objeto almacena los valores en cualquier punto del diagrama. Sin embargo, a di­fe­re­n­cia de la clavija o pin, no está vinculada a un nodo de actividad. El nodo de buffer utiliza el flujo de objetos para conectar objetos entrantes y salientes con otros nodos de objetos, por ejemplo, con un pin.

El nodo de buffer se utiliza para grabar en memoria in­te­r­me­dia los flujos de objetos entrantes y salientes. Por lo tanto, acepta todos los tokens de objetos entrantes y los hace di­s­po­ni­bles para flujos de objetos salientes. Solo cuando una nota de objeto se libera en el otro extremo del flujo y acepta los pa­rá­me­tros del objeto, reenvía el token. Según la notación UML, este nodo consiste en un simple re­c­tá­n­gu­lo. Su función especial se indica con el es­te­reo­ti­po <<ce­n­tra­l­Bu­f­fer>>.

  1. Nodos de al­ma­ce­na­mie­n­to de datos: como los nodos de buffer, los nodos de al­ma­ce­na­mie­n­to de datos también se instalan entre flujos de objetos sin ligarlos a una acción. Este subtipo del nodo buffer tiene una ca­ra­c­te­rí­s­ti­ca especial: almacena una copia de cada token enviado hasta que la actividad a la que está su­pe­di­ta­da se completa. Cada valor existe solo una vez en el nodo de al­ma­ce­na­mie­n­to de datos. Si el nodo ya almacena un objeto token con una identidad fija, no acepta tokens nuevos con exac­ta­me­n­te las mismas pro­pie­da­des. Como con todas las notas de objeto, el nodo de al­ma­ce­na­mie­n­to de datos se re­pre­se­n­ta como un re­c­tá­n­gu­lo. Para di­fe­re­n­ciar­lo, escribe el es­te­reo­ti­po <<datastore>> en la cabecera.

Nodos de control: nodos de actividad que dirigen los tokens de control

Dentro de un diagrama de ac­ti­vi­da­des UML, los tokens vagan por varias acciones hasta que la actividad concluye cuando el primer token llega al nodo final. Dado que este proceso puede incluir varios tokens al mismo tiempo, se requiere un de­te­r­mi­na­do orden. Los nodos de control sirven para asegurar un flujo de proceso claro, ge­s­tio­na­n­do ex­clu­si­va­me­n­te los flujos de control en su trayecto desde el principio del diagrama de ac­ti­vi­da­des hasta las acciones y el final de la actividad. Los nodos de control no pueden almacenar tokens en caché, a di­fe­re­n­cia de nodos de objeto como el nodo de búfer.

Una di­fe­re­n­cia si­g­ni­fi­ca­ti­va entre los flujos de objeto y de control es que solo los tokens de control se mueven en los flujos de control. A di­fe­re­n­cia de los tokens de objeto, estos tokens no llevan ningún dato con ellos. Son meros ma­r­ca­do­res. Por lo tanto, las acciones no requieren que los nodos de objeto (es­pe­cia­l­me­n­te los pines) tomen y pasen las fichas de control. Un testigo de control inicia una acción, se mueve al siguiente y luego lo pone en mo­vi­mie­n­to. Por lo tanto, controla la ejecución cro­no­ló­gi­ca de la actividad.

Entre los símbolos del diagrama de ac­ti­vi­da­des UML, los nodos de control son pro­ba­ble­me­n­te los más diversos. Pe­r­te­ne­cen a los nodos de actividad. UML 2 distingue seis tipos:

  1. Los nodos de inicio (nodos iniciales) inician una actividad. Puede haber más de un nodo de inicio por operación. Si se inicia una operación, el nodo de inicio pone en mo­vi­mie­n­to in­me­dia­ta­me­n­te el flujo de control. Si existen varios nodos de inicio, los re­s­pe­c­ti­vos flujos de control se inician si­mu­l­tá­nea­me­n­te. Los nodos de operación es­tru­c­tu­ra­dos también pueden tener nodos de inicio. Estos también se inician in­me­dia­ta­me­n­te al iniciar la actividad es­tru­c­tu­ra­da, siempre y cuando no se hayan es­ta­ble­ci­do co­n­di­cio­nes para su inicio. Puesto que los nodos iniciales están al principio, todos los in­di­ca­do­res son flechas de actividad salientes. Estos son siempre flujos de control. Otra ca­ra­c­te­rí­s­ti­ca especial de los nodos de inicio: las fichas de control colocadas en el nodo de inicio al comienzo de una actividad pueden pe­r­ma­ne­cer allí si el flujo de control no acepta o bloquea la ficha ofrecida.
  2. Los nodos finales detienen el flujo de una actividad. Hay dos tipos de nodos finales: el nodo final de la actividad termina toda la actividad de­s­tru­ye­n­do todos los tokens dentro de la actividad cuando recibe el primer token. Solo se conservan los testigos de objeto en la salida de los nodos de pa­rá­me­tros de actividad.

Todas las acciones si­n­cró­ni­cas también se detienen con él. Las acciones así­n­cro­nas se ejecutan hasta que se completan. Los nodos finales aceptan todos los tokens entrantes. A di­fe­re­n­cia del nodo de inicio, un nodo final solo tiene flechas de actividad entrantes. Es posible más de un nodo final.

Si dibujas un diagrama de actividad con más de un nodo final, las acciones pueden detenerse antes de que hayan servido a su propósito, porque una ficha ya ha alcanzado el primer punto final. El nodo final de flujo detiene un flujo de control y destruye todos los tokens entrantes. Esto no afecta a otros mo­vi­mie­n­tos de control. Por lo tanto, este nodo final es una al­te­r­na­ti­va práctica si se modelan varios puntos finales en el diagrama de ac­ti­vi­da­des.

  1. Nodos de pa­ra­le­li­za­ción y nodos de si­n­cro­ni­za­ción (nodos de horquilla y nodos de unión), también llamados ho­r­qui­llas, son nodos de control con una notación casi idéntica que refleja sus tareas.

Un nodo de pa­ra­le­li­za­ción divide una flecha de actividad entrante en varios flujos de salida si­mu­l­tá­neos. Solo puede entrar una flecha en el nodo de pa­ra­le­li­za­ción. Si se trata de un flujo de control, todas las flechas de salida son también flujos de control; el mismo principio se aplica a los flujos de objetos. El nodo crea copias del token de entrada para todos los mo­vi­mie­n­tos de salida. Si se acepta un token en el destino del flujo de salida, se borra del nodo fuente. Si otro objetivo no acepta su token, el nodo de pa­ra­le­li­za­ción puede ex­ce­p­cio­na­l­me­n­te retener el token hasta que sea aceptado.

Los nodos de si­n­cro­ni­za­ción funcionan exac­ta­me­n­te al revés. Varios bordes entran, pero sólo uno de ellos puede salir. Si la totalidad de los bordes de entrada consiste en flujos de control, también sale un flujo de control, y si entre ellos hay solo un flujo de objeto, UML es­pe­ci­fi­ca el borde de salida como flujo del objeto. Si también se reciben tokens de control, en este caso, caducarán y sólo saldrán los tokens de objeto. Si dos objetos tienen la misma identidad, el nodo los fusiona en un token. En general, los tokens solo pueden salir si todos los bordes entrantes ofrecen uno (operación and). Esto sucede bajo el principio first in first out (el que entra primero, sale el primero). Si se asigna una es­pe­ci­fi­ca­ción de valor al nodo de si­n­cro­ni­za­ción con joinSpec, el nodo espera a los tokens que cumplen ex­plí­ci­ta­me­n­te estos re­qui­si­tos antes de emitir tokens.

  1. Los nodos de ra­mi­fi­ca­ción y los nodos de conexión (nodos de decisión y nodos de fusión) también comparten el mismo símbolo en el diagrama de actividad. La dirección del flujo es de nuevo la ca­ra­c­te­rí­s­ti­ca di­s­ti­n­ti­va de estas ano­ta­cio­nes de nudos.

Un nodo de rama requiere al menos uno, pero no más de dos bordes entrantes. UML llama a uno primary incoming edge (borde primario entrante). A un segundo lo denomina flujo de entrada de de­ci­sio­nes (decision input flow). El que los flujos salientes re­pre­se­n­ten a flujos de objeto o de control, depende del tipo de borde primario. La tarea del nodo es entonces decidir entre los bordes salientes, que le ofrecen sus nodos entrantes sin copiarlos. El token solo podrá tomar entonces un camino.

Un nodo de conexión agrupa varios mo­vi­mie­n­tos entrantes en un único mo­vi­mie­n­to saliente. A di­fe­re­n­cia del nodo de si­n­cro­ni­za­ción, el nodo de conexión no fusiona ningún token en uno nuevo ni si­n­cro­ni­za los tipos de bordes entrantes. Por lo tanto, para un flujo de control de salida, todos los bordes de entrada deben ser también flujos de control. Lo mismo se aplica a los flujos de objetos. El nodo de conexión si­m­ple­me­n­te ofrece todos los tokens recibidos para el borde de salida.

En resumen

Si deseas crear un diagrama de ac­ti­vi­da­des con UML y editarlo en equipo, es im­po­r­ta­n­te obedecer a la notación. Esta es la única manera de asegurar la co­m­pre­n­sión general de este lenguaje de modelado gráfico. En este artículo te pre­se­n­ta­mos los nodos y bordes de actividad más im­po­r­ta­n­tes con sus funciones. Además, mostramos todas las no­ta­cio­nes básicas y es­pe­cí­fi­cas de los diagramas de ac­ti­vi­da­des de acuerdo con la es­pe­ci­fi­ca­ción UML-2.5.1. La es­pe­ci­fi­ca­ción exhau­s­ti­va de todos los símbolos del diagrama de ac­ti­vi­da­des UML se puede encontrar en el sitio web de Object Ma­na­ge­me­nt Group.

Ir al menú principal