Agregar segmentos de elección

A menudo en máquinas de estado, solo necesita realizar una transición de estado cuando una condición específica (llamada condición de guardia) se evalúa como VERDADERA en tiempo de ejecución. Además, muy a menudo, necesita hacer una transición a diferentes estados, dependiendo del resultado de algunas condiciones de protección evaluadas en tiempo de ejecución.

El UML proporciona una construcción especial, llamada “pseudoestado de elección”, que puede usar en tales situaciones. Un “pseudoestado de elección” le permite dividir una transición en múltiples rutas de salida, cada una con su propia condición de guardia.

Tenga en cuenta Que es útil pensar en el pseudoestado de elección, como el que se muestra en el panel (B) del diagrama anterior, como la declaración compuestaif (guard1()) {...} else if (guard2()) {...}(de hecho, así es como el generador de código QM™ implementa los segmentos de elección). Atención Porque los guardias conducen aIFs yELSEs en el código, el uso excesivo de ellos conduce al código “espagueti” y frustra el propósito de usar máquinas de estado en primer lugar. Por esa razón, los guardias deben usarse con prudencia.

En la mayoría de las herramientas UML, el proceso de dibujar segmentos de elección consiste en agregar primero un “pseudoestado de elección” (diamante) y luego unir un segmento de transición saliente con un protector. En QM™, este proceso se simplifica porque la Caja de herramientas de Máquina de estado contiene una herramienta de segmento de elección lista para usar, que combina un “pseudoestado de elección” con un segmento de transición conectado permanentemente a él.

Nota El segmento de elección es la única forma en QM™ de adjuntar una condición de protección a una transición, como se ilustra en el panel (A) del diagrama anterior. Pero el segmento de elección QM™ es más potente que los simples protectores en transiciones, como se explica en las siguientes secciones. Nota Para agregar un segmento de elección, primero debe crear y mostrar un diagrama de estados. Además, la máquina de estados debe tener al menos una transición interna (terminada con ) o un segmento de elección (). Finalmente, para agregar, mover, cambiar el tamaño o editar segmentos de elección, el diagrama de Máquina de Estados debe estar desbloqueado ().

Asegúrese de que la subventana de la máquina de estado esté activa. En la Caja de herramientas de Máquina de Estado, haga clic en la herramienta Segmento de elección y suelte el botón del ratón (no arrastre la herramienta fuera de la barra de herramientas). En este punto, cuando pasa el ratón por encima del diagrama de estado activo, el puntero del ratón cambia a la herramienta segmento de elección con el icono “prohibido” (), porque un segmento de elección solo se puede agregar a un extremo cuadrado no unido de una transición () o a un segmento de elección existente (). Cuando pasa el ratón por encima de un punto de unión permitido para un segmento de elección, el puntero del ratón cambia a la herramienta segmento de elección con el ancla (). Para añadir el segmento de elección a este punto de unión, pulse el botón del ratón y arrastre el extremo del segmento de elección hasta el borde deseado del estado de destino. La trayectoria de transición así establecida corresponderá a una transición regular de estado a estado con un guardia.

También puede agregar un segmento de elección que se convertirá en una transición interna con un protector. Para hacer esto, simplemente arrastre el extremo del segmento de elección y no lo suelte en ningún borde de estado. En este punto, el segmento de elección se convertirá en una transición interna. La transición interna se ejecuta completamente dentro del estado de origen y nunca conduce a un cambio de estado.

Nota La notación UML “normativa” estándar no le permite agregar segmentos de transición internos a los pseudoestados de elección. Por el contrario, la representación no normativa de transiciones internas en QM™ le permite agregar fácilmente segmentos de transición internos a pseudoestados de elección y cambiar rápida e intuitivamente el tipo de transición al unir/separar el extremo de transición a/desde un estado.

Finalmente, también puede agregar un segmento de elección a un extremo no unido de otro segmento de elección, como se ilustra en la animación a continuación:

Nota: Esta opción de agregar Segmentos de Elección a Segmentos de elección ya existentes significa que puede crear protectores anidados complejos. Sin embargo, al igual que con todas las condiciones de guardia, debe usar esta función con prudencia para evitar el código “espagueti”.

El elemento de segmento de Elección se puede configurar mediante la Hoja de propiedades Específica de Elección.

Hoja de propiedades de Segmento de elección

La hoja de propiedades de segmento de elección contiene las siguientes propiedades:

  • Protector de elección
  • Objetivo de elección (no editable–determinado geométricamente)
  • Acción de elección

Protector de elección

Cada segmento de elección en QM™ debe tener una propiedad de guardia explícita, que consta de dos entradas: pseudocódigo y código. Solo la entrada de código de la propiedad guard es relevante para la generación de código. La entrada de pseudocódigo está diseñada solo para mostrarse en el diagrama para evitar el desorden al minimizar la cantidad de texto a mostrar junto a la forma de transición.

Atención La entrada de pseudocódigo de la propiedad guard solo está destinada a mostrarse en el Cuadro de texto asociado con el segmento choice, pero no tiene implicaciones para la generación de código. Nota La propiedad guard se muestra en el Cuadro de texto del segmento choice de acuerdo con las mismas reglas que el Cuadro de texto Transición. Además, para reducir el desorden en el diagrama, el protector se muestra en forma abreviada, donde se eliminan todos los espacios en el protector y el texto del protector resultante se trunca en 32 caracteres. (Cuando el guardia está truncado, el último carácter es ‘~’).

Para generar código correctamente, la entrada de código de la propiedad guard debe ser una expresión booleana legal de C o C++. La expresión puede usar los atributos de máquina de estados (a través del puntero me) y los parámetros de evento del evento desencadenante (consulte la sección a continuación).

Acceder al Evento Desencadenante: La expresión guard puede acceder al evento de activación original (de la transición a la que se adjunta la opción directa o indirectamente), que se proporciona como puntero e del tipo (QEvt const * const). Esto significa que tiene acceso de solo lectura al evento y no puede cambiar el puntero e. Para acceder a los parámetros de evento del evento de activación original, normalmente necesita bajar el puntero de evento e. Esta bajada siempre se basa en el desencadenador de transición (señal del evento desencadenador, consulte Desencadenador de transición), lo que significa que siempre debe conocer el tipo de evento (clase de evento) asociado con el desencadenador.

Destino de elección

La propiedad de destino no es editable directamente, sino que está determinada geométricamente por el punto final del segmento de elección. Para transiciones de estado a estado, la propiedad de destino enumera el estado de destino en el que termina el punto final (). Para transiciones internas con el punto final cuadrado (), la propiedad de destino muestra internal.

Acción de elección

Un segmento de elección puede tener una propiedad de acción opcional, que solo se ejecuta cuando el guardia se evalúa como VERDADERO en tiempo de ejecución (consulte también Evaluación del orden de acción).

La propiedad action consta de dos entradas: pseudocódigo y código (consulte la hoja de propiedades Choice). Solo la parte de código de la propiedad action es relevante para la generación de código. El campo pseudocódigo está diseñado solo para mostrarse en el diagrama para evitar el desorden al minimizar la cantidad de texto que se mostrará junto a la forma de transición.

Nota La entrada de pseudocódigo de la propiedad action está destinada solo a mostrarse en el diagrama y no tiene implicaciones para la generación de código.

Puntero al evento desencadenante: El código de acción choice a menudo necesita acceder al evento desencadenante, que se proporciona como puntero e del tipo (QEvt const * const). Esto significa que tiene acceso de solo lectura al evento y no puede cambiar el puntero e. Para acceder a los parámetros de evento del evento desencadenante, por lo general debe bajar el puntero de evento e. Esta bajada siempre se basa en el desencadenador de transición (señal del evento desencadenador, consulte Desencadenador de transición), lo que significa que siempre debe conocer el tipo de evento (clase de evento) asociado con el desencadenador.

Cuadro de texto de Elección

Una vez seleccionado el elemento de Segmento de elección como Elemento Actual, puede ver el límite del Cuadro de texto asociado con el segmento de elección. El Cuadro de texto le permite mover y cambiar el tamaño del texto de elección arrastrándolo o arrastrando el Controlador del Cuadro de Texto de acuerdo con el mismo algoritmo que el Cuadro de Texto de Transición.

The else Guard

La propiedad guard se puede definir como la palabra clave especial else. Este protector de otro tipo complementa cualquier otra condición de protector unida al mismo pseudoestado de elección. El protector else se puede especificar en la entrada de código o en la entrada de pseudocódigo de la propiedad guard. Obviamente, el protector “else” solo tiene sentido para un pseudoestado de elección con múltiples segmentos de elección salientes.

Nota Durante la generación de código, el protector else siempre se generará en último lugar dentro del grupo de todos los protectores asociados con el mismo pseudoestado de elección, independientemente de su orden en el Explorador de Modelos.

Segmentos de elección Sin más

De acuerdo con la especificación UML, un evento que no se puede procesar debido a que todos los protectores evalúan como FALSO debe tratarse como no procesado, lo que significa que debe propagarse al superestado(s). Este requisito tiene implicaciones para los seudoestados de elección sin un segmento else explícito. Específicamente, para cumplir con la semántica UML, el generador de código QM™ generará en tales casos una rama else implícita que causará la propagación del evento al superestado(s).

Nota: Hay una diferencia entre un pseudoestado de elección con un segmento else vacío y un pseudoestado de elección idéntico sin el segmento else. El vacío explícito else hará que el evento se consuma (sin hacer nada), mientras que la ausencia del segmento else hará que el evento se propague al superestado(s).

Orden de evaluación de la protección

La especificación UML requiere que las condiciones de protección asociadas al mismo pseudoestado de elección sean mutuamente complementarias, de modo que el orden de evaluación de la protección no importe. Aunque en QM™ se recomienda mantener los protectores complementarios, la herramienta evalúa los protectores siempre en el orden predeterminado, en el que puede confiar.

El orden de la evaluación de guardia está determinado por el orden de los elementos de segmento de Elección en el Explorador de modelos. Este orden se puede cambiar mediante los botones Arriba y Abajo de la barra de herramientas del Explorador. Alternativamente, el Elemento actual se puede mover hacia arriba o hacia abajo dentro del Explorador de modelos mediante los atajos de teclado: Ctrl-(tecla arriba) y Ctrl-(tecla abajo).

Nota En caso de protección superpuesta cuando el orden de evaluación de la protección es importante, se recomienda organizar los Segmentos de Elección gráficamente en el diagrama en el mismo orden que en el Explorador de modelos, como se ilustra en la captura de pantalla anterior. El código generado seguirá el mismo orden, como se muestra a la derecha del diagrama anterior.

Evaluación del orden de acción

Cualquier segmento de elección adjunto a una transición agrega las acciones de segmento de elección a la acción realizada por la transición. El orden de evaluación de todas estas acciones es intuitivo y comienza siempre con la acción de transición ejecutada incondicionalmente, seguida de la evaluación condicional de las acciones de segmento de elección.

Por ejemplo, la evaluación del orden de acción en el diagrama anterior se resume con el siguiente pseudocódigo:

. . .
caso trigonométrico: {
/* acción de transición… * /
action0 (); / * ejecutado sin condiciones */
/* segmentos de elección… */
si (g1()) {
action1();
. . .
}
else if (g2()) {
action2();
. . .
}
else {
. . .
}
}
. . .

Segmentos de elección anidados

Como se describió anteriormente, los Segmentos de elección pueden anidarse. Esto le permite crear rutas de transición condicionales complejas, pero, como siempre con guardas, la función no debe usarse en exceso.

Por ejemplo, un error común es usar segmentos de elección profundamente anidados para elegir entre una serie de posibles rutas de transición (consulte el panel (A) en el diagrama a continuación):

Una alternativa mejor y mucho más sencilla es utilizar segmentos de elección múltiple unidos al mismo pseudoestado de elección, como se muestra en el panel (B) en el diagrama anterior.

Nota Recuerde que puede adjuntar muchos segmentos de elección a una transición determinada. Un diagrama con un número menor de pseudoestados de elección (diamantes ) es un diagrama mejor y más fácil de entender. Atención, el generador de código QM ™ limita el número de niveles de anidamiento en el código a 16 (incluido el anidamiento dentro de las funciones del controlador de estado). El uso de segmentos de elección profundamente anidados puede superar fácilmente este límite.

Segmentos de elección de enrutamiento

Una transición con segmentos de elección múltiple, algunos de ellos potencialmente anidados, agrupa muchos elementos en un pequeño espacio de diagrama. Para reorganizar gráficamente una “bola de conectores” tan compleja, debe conocer las reglas básicas que se aplican en esta situación.

La primera regla es que antes de que pueda cambiar la forma de cualquier elemento, primero debe seleccionarlo.

Por ejemplo, si desea mover la opción-pseuodstate (el diamante ), debe hacer clic en la transición entrante original a la opción-pseudoestado. Tenga en cuenta que específicamente no debe hacer clic en la forma del diamante en sí, porque en realidad es una colección superpuesta del extremo de transferencia entrante más todos los segmentos de choce salientes, por lo que es ambiguo a qué forma se refiere en realidad. En su lugar, debe hacer clic en uno de los segmentos de transición o en el inicio y el final del tránsito. (NOTA: También puede seleccionar sin ambigüedades cualquier elemento del modelo en la vista Explorador de modelos). La siguiente animación ilustra el proceso:

Por otro lado, si selecciona un segmento de elección saliente, no podrá mover el pseudoestado de elección. En su lugar, ahora puede mover solo el segmento de elección seleccionado para volver a adjuntarlo a otro lugar.

Leave a Reply