lunes, 27 de abril de 2015

UML Capítulo 14: Vista de Máquina de Estados II

¡Hola de nuevo internauta!,

     En la entrada de hoy finiquitaremos la vista de máquinas de estados hablando sobre el estado compuesto y los tipos de estado que engloba. Así que sin más preámbulos, ¡al meollo!.

1. Estado Compuesto

Un estado compuesto es aquel que se ha descompuesto en uno o más subestados directos, formando estos últimos, parte de su estructura interna. Los subestados realmente son estados pero los llamamos así para diferenciarlos del estado que los contiene. Los distintos tipos de subestados son:

Tipo de estado
Descripción
Notación
Estado simple
Un estado sin estructura.
Estado ortogonal
Un estado que se divide a su vez en dos o más regiones, diferenciadas entre sí por líneas discontinuas. Sólo uno de los subestados directos se encuentra activo concurrentemente cuando el estado compuesto está activo.

Al entrar en el mismo ell número de hilos de control se incrementa, y cuando se sale del mismo, se decrementan.
Estado no ortogonal
Un estado que se divide a su vez en dos o más subestados. Sólo uno de los subestados se encuentra activo en cada momento cuando el estado compuesto está activo y todo ellos heredan las transiciones del estado externo.
Estado inicial
Un pseudoestado que indica el estado inicial cuando es invocado el estado que lo engloba.
Estado final
Un estado especial que indica la finalización de la actividad del estado que lo engloba.

Representa la destrucción de todos los objetos pertenecientes a ese estado.
Finalizador
Un estado especial cuya activación finaliza la ejecución del objeto al que pertenece la máquina de estados.
Conjunción
Un pseudoestado que encadena segmentos de transición de una transición de ejecución hasta la finalización.
Elección
Un pseudoestado que realiza una bifurcación dinámica dentro de una transición de ejecución hasta su finalización.
Estado de historia
Un pseudoestado que al activarse restaura el estado que se encontraba previamente activo dentro de un estado compuesto.
Estado de referencia a submáquina
Un estado que referencia a la definición de una máquina de estados, que conceptualmente, reemplaza la submáquina de estados.
Punto de entrada
Un pseudoestado externo dentro de la máquina de estado que identifica un estado interno como destino.
Punto de salida
Un pseudoestado externos dentro de la máquina de estados que identifica un estado interno como origen.

La invocación de estos subestados dentro del estado compuesto es, primero, siempre el psudoestado inicial , y después, por orden de invocación hasta llegar al estado final que será siempre el último. Siempre habrá solamente un estado inicial aunque pueden existir varios estados finales (no es lo normal) pero sólo se ejecutará uno de ellos.

Veamos un par de ejemplos:

Ejemplo Maquina de Estados
Ejemplo de una máquina de estados para representar una compra virtual
En este gráfico podemos ver los pasos necesarios para realizar una compra virtual usando el típico sistema de carrito de la compra:
  1. Se permite al usuario identificarse. Para ello se llama al estado identificar cliente cuya entrada es el usuario y la contraseña.
    1. Si se produce un fallo se lleva el flujo hasta el estado final para finalizar la operación. También he visto como en vez de usar la notación de finalización se dirige el flujo hacia un estado final de error. Cómo siempre, dependerá de cada cliente, pero la forma genérica aceptada es la aquí expuesta.
    2. Si no hay fallo se sigue el flujo y se ejecuta la transición ok.
  2. Se muestran los productos y se le permite al usuario seleccionarlos:
    1. Se ejecuta  la transición interna elegir(producto), donde producto será el código del mismo.
    2. Si se pulsa comprar se pasa al siguiente estado.
  3. Se añade al carro el producto seleccionado:
    1. Se ejecuta la transición interna añadir(producto).
    2. Si se pulsa continuar se vuelve al estado  confirmarProducto.
    3. Si se pulsa confirmar se ejecuta el siguiente estado. Me he dado cuenta que en el gráfico no he puesto esta transición y he dejado "pulsar continuar", es lo que tiene el copiar + pegar como tampoco he puesto el entry/producto ya que es necesario pasárselo como entrada para que se ejecute correctamente, pero no me apetece cambiar el dibujo, vaguetes que estamos hoy, oiga ;) .
  4. Se procesa la compra:
    1. Se ejecuta la actividad entry/producto donde se recoge el producto enviado por el estado anterior.
    2. Se ejecutan las siguientes transacciones internas, y por ese orden:
      1. vender().
      2. vaciarCarrito().
    3. Se ejecuta la transicción ok y se finaliza el estado. Una vez finalizado todos los objetos usados en el mismo son liberados de la memoria.
Al ávido y astuto lector no se le habrá pasado por alto que sólo he añadido una finalización en el estado identifiarCliente y no en el resto. ¿Es necesario que aparezca dicha finalización en los demás estados?, respuesta: Sí, si queremos gestionar bien cualquier tipo de error. ¿Entonces por qué no lo hemos añadido zagal?, pues porque como somos humanos se nos ha pasado, hay que cabeza, y por lo dicho antes, que estamos vaguetes y no nos apetece rehacer el gráfico ;).

Imagen Comica
Para que os hagáis una idea de lo que hace la falta de sueño ^^!
Ahora veremos otro ejemplo con un estado compuesto ortogonal que merece la pena leñe:

Ejemplo Maquina de Estados con Estado Compuesto Ortogonal
Ejemplo de máquina de estados con un estado compuesto ortogonal
Fuente: El Lenguaje Unificado de Modelado, Manual de Referencia (Booch, Jacobsom y Rumbaugh)
En este ejemplo podemos ver como el estado compuesto está formado solamente por un estado ortogonal. Se ha representado muy a groso modo el flujo correspondiente a una asignatura en la universidad:
  1. La primera región hace referencia a las prácticas en laboratorio y como ha de tener las dos prácticas para concluir esta parte de forma correcta.
  2. La segunda región representa el proyecto que se pide en la asignatura.
  3. La tercera y última región representa el examen final de la asignatura que tiene dos posibles resultados: aprobar o suspender.
¿Qué información podemos extrapolar de esto?. Bueno, vamos a esquematizarlo un poco para que sea más claro:
  1. Es necesario que todas las regiones del estado ortogonal lleguen a su estado final para que el flujo prosiga, ya sea habiendo aprobado el examen final o no.
  2. Cada región representa las pruebas de una asignatura.
  3. No se ejecutan a la vez y para ejecutar una hay que finalizar todo el flujo teniendo que invocar el estado compuesto nuevamente para ejecutar las demás secciones del estado ortogonal.
Realmente esto es un ejemplo muy básico pues no están reflejadas, por ejemplo, lo que pasa si no se asiste a un laboratorio o no se aprueba el proyecto. Pero espero que nos valgas para entender la aplicación del estado ortogonal.

2. Reutilizar Máquina de Estados


Imagen Comica
Buenas noticias se acercan por el horizonte capitán, ¡aaaar!
Efectivamente se pueden reutilizar las máquinas de estados ya creadas con anterioridad permitiendo ahorrarnos de esta manera tiempo y trabajo. La máquina de estados referenciada se denomina submáquina y el estado que la referencia se denomina estado de referencia a submáquina.

Aquí un ejemplo:

Ejemplo de Maquina Principal y Subsistema
Fuente: El Lenguaje Unificado de Modelado, Manual de Referencia (Booch, Jacobsom y Rumbaugh)

La figura de la izquierda es la máquina principal desde la que se invocan las submáquinas y la figura de la derecha es la submáquina invocada de ayuda.

Ahora interpretemos lo que significa:
  1. Máquina principal:
    1. El estado EsperaDeComando tiene dos transiciones: ejecución y ayuda.
    2. Existen dos subsistemas:
      1. ejecutar: Ejecutar (para ejecutar el comando indicado en el estado EsperaDeComando).
      2. ayuda: Ayuda (cuando se introduce ayuda en el estado EsperaDeComando).
      3. Ambos subsistemas devuelven el control a EsperaDeComando cuando han finalizado su ejecución de manera automática.
  2. Subsistema Ayuda:
    1. Al ejecutarse el subsistema vemos que en su entrada se ejecuta la actividad "mostrar pantalla de ayuda".
    2. Dicho subsistema tiene un bucle o loop en el estado interno suyo (consultar/mostrar respuesta) del cual se saldrá cuando se active la transición salir.
    3. Cuando se ejecute la transición salir se llega al estado final, donde se liberaran de la memoria sus objetos y devolverá el control del flujo a su transición de salida.
Esto nos permite llamar al subsistema Ayuda desde cualquier otra máquina de estados donde sea necesario evitando así tener que modelarlo nuevamente.

Hasta aquí la vista de máquina de estados. Seguiremos con más y esperemos que mejor en siguientes entradas.

¡Gracias por leerme!.

No hay comentarios:

Publicar un comentario