Diagramas de Estado
Un estado es una condición durante la vida de un objeto, de forma que cuando dicha condición se satisface se lleva a cabo alguna acción o se espera por un evento. El estado de un objeto se puede caracterizar por el valor de uno o varios de los atributos de su clase, además, el estado de un objeto también se puede caracterizar por la existencia de un enlace con otro objeto.
El diagrama de estados y transiciones engloba todos los mensajes que un objeto puede enviar o recibir. En un diagrama de estados, un escenario representa un camino dentro del diagrama. Dado que generalmente el intervalo entre dos envíos de mensajes representa un estado, se pueden utilizar los diagramas de secuencia (4.2) para buscar los diferentes estados de un objeto.
En todo diagrama de estados existen por lo menos dos estados especiales inicial y final: start y stop. Cada diagrama debe tener uno y sólo un estado start para que el objeto se encuentre en estado consistente. Por contra, un diagrama puede tener varios estados stop.
Una transición en un diagrama de estados puede tener asociada una acción y/o una guarda, además, una transición puede disparar un evento. La acción será el comportamiento que se obtiene cuando ocurre la transición, y el evento será el mensaje que se envía a otro objeto del sistema. Por último, la guarda es una expresión boolena sobre los valores de los atributos que hace que la transición sólo se produzca si la condición evalúa a true.
Tanto las acciones como las guardas son comportamientos del objeto y generalmente se traducen en operaciones de alguna clase.
Una transición entre estados representa un cambio de un estado origen a un estado sucesor destino que podría ser el mismo que el estado origen, dicho cambio de estado puede ir acompa nado de alguna acción. Las acciones se asocian a las transiciones y se considera que ocurren de forma rápida y no interrumpible. Por contra, las actividades se asocian a los estados pudiendo consumir más tiempo, dicha actividad puede verse interrumpida por la ocurrencia de algún evento.
Existen dos formas de transicionar en un diagrama de estados: automáticamente y no automáticamente. Se produce una transición automática cuando se acaba la actividad del estado origen (no hay un evento asociado con la transición). Se produce una transición no automática cuando existe un evento que puede pertenecer a otro objeto o incluso estar fuera del sistema.
Los diagramas de estados muestran el comportamiento de los objetos, es decir, el conjunto de estados por los cuales pasa un objeto durante su vida, junto con los cambios que permiten pasar de un estado a otro. Un ejemplo para el caso de la máqina de café son los estados posibles de la clase Maquina Cafe (figura 5.1).
Figura: Ejemplo de diagrama de estados de la Máquina de Café
Un estado identifica un período de tiempo (no instantáneo) en la vida del objeto durante el cual está esperando alguna operación, tiene cierto comportamiento característico o puede recibir cierto tipo de estímulos. En notación UML, un estado se representa mediante un rectángulo con los bordes redondeados, que puede tener tres compartimentos: uno para el nombre, otro para el valor característico de los atributos del objeto en ese estado y otro para las acciones que se realizan al entrar, salir o estar en un estado (entry, exit o do, respectivamente). En el caso de la figura 5.1, se tienen cuatro estados (Lista, Introduciendo Monedas, Seleccionando Azucary Producto?, Sirviendo Producto?), en los cuales se desarrollan ciertas acciones al entrar, por ejemplo, al entrar al estado Introduciendo Monedas se debe realizar la accion Mostrar Dinero Actual?. Los estados iniciales y finales se representan mediante los símbolos de la figura 5.2.
Figura 5.2: Estado final
Otros conceptos relacionados con los diagramas de estados son: • Eventos Un evento es una ocurrencia que puede causar la transición de un estado a otro de un objeto. Esta ocurrencia puede ser: o Condición que toma el valor de verdadero o falso. o Recepción de una se nal de otro objeto en el modelo. o Recepción de un mensaje . o Paso de cierto período de tiempo, después de entrar al estado o de cierta hora y fecha particular. El nombre de un evento tiene alcance dentro del paquete en el cual está definido, no es local a la clase que lo nombra. En el caso del ejemplo de la figura 5.1, encontramos en varias transiciones el evento userInput, que recibe como parámetro un objeto Button indicando el botón que ha sido presionado por el usuario de la máquina de café. • Envío de mensajes Además de mostrar la transición de estados por medio de eventos, puede representarse el momento en el cual se envían mensajes a otros objetos. Para ello se utiliza una línea punteada dirigida al diagrama de estados del objeto receptor del mensaje. Si tomamos como ejemplo un control remoto que puede enviar órdenes de encender o apagar al televisor o a la videograbadora se puede obtener un diagrama de estados como el de la figura 5.3
Figura: Ejemplo de envío de mensajes
En la figura observamos un diagrama de estados para cada uno de los tres aparatos, algunas de las transiciones del control remoto causan el envío de mensajes togglePower a los otros aparatos (televisión y videograbadora). • Transición simple Una transición simple es una relación entre dos estados que indica que un objeto en el primer estado puede entrar al segundo estado y ejecutar ciertas operaciones cuando un evento ocurre y si ciertas condiciones son satisfechas. Se representa como una línea sólida entre dos estados, que puede venir acompa nada de un texto con el siguiente formato: event-signature [guard-condition] action-expression send-clause Donde event-signature es la descripción del evento que da lugar a la transición; guard-condition son las condiciones adicionales al evento necesarias para que la transición ocurra; action-expression es un mensaje al objeto o a otro objeto que se ejecuta como resultado de la transición y el cambio de estado; y send-clause son acciones adicionales que se ejecutan con el cambio de estado, por ejemplo, el envío de eventos a otros paquetes o clases. En el caso del ejemplo inicial de la máqina de café se tiene una transición entre los estados Introduciendo Moneda? y Seleccionado Azucary Producto? que tiene una transición con el siguiente detalle: userInput(Button) | [Todo Ok?=true] / Mostrar Nivel Azucar?, Mostrar Producto? El evento que dispara el cambio de estado es userInput(Button). Se requiere como condición adicional que no se haya detectado ningún fallo (Todo Ok = true) y se ejecuta Mostrar Nivel Azucar y Mostrar Producto. • Transición interna Es una transición que permanece en el mismo estado, en vez de involucrar dos estados distintos. Representa un evento que no causa cambio de estado. Se denota como una cadena adicional en el compartimento de acciones del estado. Supongamos el estado de una interfaz pidiendo password al usuario. En este caso puede tenerse una transición interna que muestre una ayuda al usuario. Esta transición se muestra en el diagrama de la figura 5.4 con la cadena ``help / display help’‘ dentro del cuerpo del estado.
Figura: Ejemplo de transición interna
• Subestados Un estado puede descomponerse en subestados, con transiciones entre ellos y conexiones al nivel superior (superestado). Las conexiones se ven al nivel inferior como estados de inicio o fin, los cuales se suponen conectados a las entradas y salidas del nivel inmediatamente superior. Un ejemplo es el estado marcando de un teléfono (figura 5.5), que puede descomponerse en los subestados Inicio y marcado parcial.
Figura 5.5: Ejemplo de subestados
• Transición compleja Una transición compleja relaciona tres o más estados en una transición de múltiples fuentes y/o múltiples destinos. Representa la subdivisión en hilos del control del objeto o una sincronización. Se representa como una línea vertical de la cual salen o entran varias líneas de transición de estado. En el ejemplo de la figura 5.6 se muestra una transición a dos hilos concurrentes que luego se sincronizan.
Figura: Ejemplo de transición compleja
• Transición a estados anidados Una transición hacia un estado complejo, descrito mediante estados anidados, significa la entrada al estado inicial del subdiagrama. Las transiciones que salen del estado complejo se entienden como transiciones desde cada uno de los subestados hacia afuera, a cualquier nivel de profundidad. En la figura 5.1 se encuentran los dos casos nombrados: desde el estado inicial se pasa al estado Buen Funcionamiento (a su estado inicial) y de este estado salen transiciones hacia Mal Funcionamiento? y hacia el estado final, dichas transiciones deben comprenderse como transiciones de cada uno de los estados internos hacia los estados externos. Los diagramas de estado resultan adecuados para describir el comportamiento de un objeto a través de diferentes casos de uso, sin embargo, no resultan del todo adecuados para describir el comportamiento que incluye a una serie de objetos colaborando entre sí. Por lo tanto, resulta útil combinar los diagramas de estado con otras técnicas. Por ejemplo, los diagramas de interacción (4.1) son idóneos para la descripción del comportamiento de varios objetos en un único caso de uso, y los diagramas de actividades (5.2) muestran de forma adecuada la secuencia general de acciones en diferentes objetos y casos de uso. No nos debemos plantear el dise nar diagramas de estados para todas las clases en el sistema, sino sólo para aquellas que exhiban un comportamiento interesante de forma que la elaboración del diagrama de estados nos ayude a entender dicho comportamiento. ________________________________________