Bienvenido una vez más a este blog y gracias por tu paciencia porque sé que estos temas son un poquito cansinos.
Hoy empezaremos con el primer artículo sobre la vista de máquinas de estados, fundamental para entender los flujos que se implementarán más adelante. Pero empecemos por el comienzo que exige toda buena historia(si exceptuamos Pulp Fiction, claro).
Tranquilo Samuel... digo Furia, digo Jules |
Bueno, tras esta pequeña interrupción de Mr. Jules, continúo. A modo de introducción indicaros que esta vista se caracteriza por los siguientes puntos:
- Describe el comportamiento dinámico de un objeto en un periodo de tiempo.
- Indica la secuencia de eventos que un objeto puede ejecutar durante su tiempo de vida.
La vista de Máquina de estados está compuesta por los siguientes elementos:
1. Evento
Es un tipo de ocurrencia significativa que tiene localización en tiempo y espacio y no posee una duración determinada. Se modela algo como evento si su ocurrencia tiene consecuencias. Pueden tener parámetros para cada ocurrencia de un evento individual. Los tipos de eventos existentes a día de hoy están explicados en la siguiente tabla:
Tipo de Evento
|
Descripción
|
Sintáxis
|
Evento de cambio
|
|
Cuando(expresión)
|
Evento de llamada
|
|
op(a:T)
|
Evento de señal
|
|
nombreS(a:T)
|
Evento de tiempo
|
Representan el paso del tiempo.
Puede especificarse de manera absoluta(ej: hora) o relativa(ej: tiempo transcurrido desde un evento dado).
|
tras(tiempo)
|
2. Estado
Los estados son las unidades de control a partir de las cuales se construyen las máquinas de estados. Se conectan entre si mediante transacciones, las cuales, son procesadas por el estado que dejan.
Ejemplo de notación de estado |
3. Transición
Una transición es el paso de un estado a través de un evento, una condición de guarda y un efecto. Esto que parece muy complejo es sencillo de entender a través del ejemplo gráfico que pondremos más adelante. Los tipos de transiciones están indicados en la siguiente tabla:
Tipo de transición
|
Descripción
|
Sintaxis
|
Transición de entrada
|
La especificación de una actividad de entrada que se ejecuta cuando se entra en el estado.
|
entry/actividad
entrada/actividad
|
Transición de salida
|
La especificación de una actividad de salida que se ejecuta cuando se sale del estado.
|
exit/actividad
salida/actividad
|
Transición externa
|
Una respuesta a un evento que causa un cambio de estado. Ejecuta las actividades de entrada y salida de los estados si existen.
|
e(a:t)[exp]/actividad
|
Transición interna
|
Respuesta a un evento que causa la ejecución de un efecto pero no causa el cambio de estado o la ejecución de las actividades de entrada y salida.
|
e(a:t)[exp]/actividad
|
Transición de finalización
|
Se dispara cuando finaliza la actividad del estado que deja. Tienen prioridad sobre estados normales
|
Debemos tener en cuenta también los siguientes conceptos que se usan en las transiciones:
Evento disparador: El evento que permite la ejecución de la transición. Se manejan de uno en uno así que se disparará solamente uno cada vez.
Condición de guarda: Es una expresión booleana que evalúa cuando ocurre el evento disparador. Así, si tenemos el mismo evento disparador repetido, sólo ejecutará la transición aquel que cumpla la condición de guarda; si hay un conflicto sólo se ejecuta una de ellas no estando determinado cuál. La elección puede ser aleatoria o depender de los detalles de la implementación.
Efecto: Todo efecto pertenece a una transición por lo que se ejecutará cuando esta se dispare. Puede ser una acción o una actividad.
Cambio de estado: Se produce cuando se completa la ejecución de un efecto, pasando a ser el estado activo aquel en el cual ha finalizado dicha ejecución.
Estados anidados: Son aquellos que están anidados dentro de otro estado(llamado compuesto). Lo veremos en profundidad en la siguiente entrada.
Actividades de entrada y salida: Son aquellas actividades que se realizan cuando se entra y sale del estado. Las de entrada suelen usarse para la configuración necesaria dentro del estado(por ejemplo dar valores a variables) y las de salida se usan para realizar la limpieza de dicha configuración.
Veamos esto con un ejemplo:
¿Y esto que nos quiere decir?, expliquémoslo entonces:
- Aunque no hemos hablado aquí de ellos tenemos un estado inicial(Inicio) desde el cual se ejecuta todo y dos estados finales( Fin y error)en los que se finaliza todos aunque sólo se puede ejecutar uno de ellos debido al flujo de eventos disparadores.
- Se ejecuta Buscar persona donde hay las siguientes actividades:
- Se pide en su entrada el código de persona.
- Se obtiene en su salida el NIF de la persona.
- Hay una transición interna que da el valor de mensaje si esta persona no existe.
- Si la persona no existe se ejecuta el evento no existe, tras cual se ejecuta la acción mostrar mensaje(). Vemos que primero se ejecuta el evento y después la acción. Finalizamos en el estado Fin.
- Si la persona existe se ejecuta el evento existe.
- Se ejecuta Obtener Datos donde hay las siguientes actividades:
- Se pide en su entrada el NIF de la persona.
- Se envía en su salida los datos de esa persona.
- Vemos que hay dos eventos disparadores con una condición de guarda que indica que sólo se puede ejecutar uno u otro si se cumple dicha condición(si no se cumple se implementará la solución o se avisará al analista y tendrá que modificarlo):
- Si operación es igual a correcta se ejecuta el evento ok y se llega al estado final Fin.
- Si operación es igual a incorrecta se ejecuta el evento ko y se llega al estado final error.
Y hasta aquí la entrada de hoy. En la siguiente finalizaremos la vista de máquina de estados y todos estos conceptos quedarán más claros. ¡Espero haberos ayudado!.
¡Gracias por leerme!.
No hay comentarios:
Publicar un comentario