STATECHARTS

Autor: Dante Carlos Antunes - GPT

STATECHARTS é um formalismo visual concebido por David Harel para especificar sistemas em tempo real do tipo reativo. Este tipo de sistemas, em contraste com os sistemas do tipo transformacional, é caracterizado por ser event-driven, isto é, deve continuamente reagir a estímulos externos e internos.

A busca de meios visuais para representar sistemas complexos tem produzido uma série de propostas de abordagem, todas elas tendo um paradigma específico como sustentáculo conceitual. Algumas delas, por exemplo, procuram enfocar os sistemas como sendo um conjunto de processos que se relacionam entre si - é o caso do DFD. Outras analisam pelo ângulo dos dados é o caso do DER. E também há as que procuram entender um sistema como sendo um conjunto de estados e de transições entre estes estados. Não é possível determinar qual é a melhor destas abordagens, pois cada uma delas atende melhor um certo espectro de sistemas.

O presente artigo descreve um método que se baseia no paradigma da transição de estados, chamado de STATECHARTS. Trata-se de uma condensação dos artigos [HAR 87a] e [HAR 87b] escritos por David Harel.

STATECHARTS é na verdade uma evolução dos clássicos Diagramas de Transição de Estados, pois produz representações mais "enxutas" e claras, sendo especialmente indicado para descrever sistemas complexos do tipo event-driven também chamados de sistemas reativos.

São exemplos característicos de sistemas reativos:
  • telefones, redes de comunicação de dados, sistemas operacionais,
  • sistemas aviônicos, circuitos VLSI e
  • as interfaces homem-máquina contidas em vários softwares.

Descrever o comportamento de sistemas complexos através dos seus estados e eventos pode ser considerada uma forma natural de abordagem, e por isto indicada, de proceder. Um fragmento básico desta descrição pode ser: "estando o sistema em um determinado estado A, quando um evento a a ocorre e neste mesmo momento uma condição C é verdadeira, então o sistema passa para o estado B".

Especificar sistemas do tipo reativo através da análise dos estados e eventos não é uma proposta nova. Já há algum tempo os Diagramas de Transição de Estado (DTE) baseados no formalismo conhecido como máquinas de estado finito têm sido utilizados com este propósito. O grande problema desta abordagem tradicional é a dificuldade de visualização quando usado na descrição de sistemas muito grandes e complexos, onde a multiplicidade de estados e transições entre estes estados cresce de forma exponencial.

Para que uma técnica que pretenda representar um sistema reativo através dos seus estados e eventos possa ser considerada satisfatória, ela deve ser capaz de descrever eficientemente as seguintes situações:

  • 1. "Estando o avião em qualquer estado, quando a alavanca amarela for acionada, o assento deverá ser ejetado".
  • 2. "O estado da caixa de câmbio de um carro é independente do sistema de freios".
  • 3. "Quando o botão de seleção é acionado, entrar no modo que foi selecionado".
  • 4. "Modo-de-exibição consiste de exibição-da-hora, exibição-da-data e exibição-do-cronômetro".

A declaração 1, acima, necessita da capacidade de agrupar estados em um superestado (clustering). Se não houver esta habilidade, de todos os estados existentes no sistema aviônico, deveria partir uma seta para o estado "acento ejetado" gerando uma grande poluição visual no diagrama. A declaração 2 introduz o conceito de independência ou concorrência de estados. A declaração 3 sugere a necessidade de transições mais genéricas que uma simples seta identificando um evento. Por fim, a declaração 4 mostra a possibilidade de refinamento de estados.

STATECHARTS atende a todas estas necessidades de especificação.

Os conceitos básicos modelados por STATECHARTS são:

Estado - é a situação em que um sistema se encontra em um determinado instante do tempo.

Evento - são acontecimentos que ocorrem tanto externamente ao sistema como internamente e que ao serem percebidos pelo sistema provocam transições de estado, isto é, o sistema passa de um estado A para um estado B.

Condição - é um predicado opcional associado a um evento que habilita o sistema a efetuar uma transição de estado. Em outras palavras, o sistema só passa de um estado para outro, caso ocorra um evento qualquer e se, e somente se, a condição associada for verdadeira no momento do evento.

PRINCIPAIS MECANISMOS DE STATECHARTS

Os principais mecanismos de modelagem disponibilizados por STATECHARTS são: clustering, refinamento, estado default, entrada-pela-história, concorrência e ações.

CLUSTERING

Analisando a Figura 1 encontramos os quatro estados A, B, C e D de um sistema qualquer (representados por retângulos com cantos arredondados) e uma série de setas indicando os eventos que transferem o sistema de um estado para outro. Os estados na forma como estão representados são mutuamente exclusivos entre si, isto é, o sistema não pode estar em mais de um deles ao mesmo tempo.

Statecharts1.gif (4154 bytes)

Figura 1

No exemplo da Figura 1, o sistema pode assumir o estado D vindo, ou do estado A, ou de B, ou de C, basta que quanto estiver em um destes três últimos estados, ocorra o evento a. Portanto, os estados A, B e C possuem uma característica em comum: a transição para D provocada. pelo evento a. Esta característica permite que se agrupem os três estados A, B e C em um superestado E, como mostra a Figura 2.

Statecharts2.gif (5582 bytes)

Figura 2

Note-se que as três setas referentes ao evento a que existiam na situação anterior (Figura 1) foram substituídas por apenas uma, partindo do contorno do superestado E.

Na Figura 2, os estados A, B e C contidos no superestado E são mutuamente exclusivos entre si, o que configura um OR-exclusivo. A criação do cluster E é apenas em função do evento a, não afetando a forma como os eventos b e c são representados. Quando ocorre um clustering, as setas representando os eventos não envolvidos "penetram" no contorno do superestado, indo até o (ou vindo do) estado a que se referem.

O exemplo dado mostra claramente a característica bottom-up do mecanismo de clustering, pois partiu-se de estados mais básicos para formar um estado mais abrangente.

Statecharts3.gif (9872 bytes)

Figura 3 - Refinamento

REFINAMENTO

É o processo inverso do clustering, isto é, funciona de forma top-down. Partindo de um estado mais abrangente, identificam-se os possíveis estados componentes. Supondo que um especificador quando estiver descrevendo o comportamento de um sistema, tenha chegado à representação mostrada na Figura 3a, onde dois estados (E e D) e três eventos (a, b e c) foram identificados. Na busca de um melhor detalhamento (refinamento) este especificador concluiu que o estado E na verdade é um conjunto de três subestados A, B e C (Figura 3b). Aos detectar estes novos três estados, analisou novamente os eventos e notou que apenas o evento a relacionava-se com todos eles; notou também que o evento b relacionava-se apenas com o estado B e o evento c apenas com o estado C. Para resolver isto, estendeu as setas representativas dos eventos b e c atravessando o contorno do estado E até os retângulos representativos dos estados B e C respectivamente, resultando na Figura 3c. Além disto descobriu mais alguns eventos que ocorriam no interior de E, entre os subestados recém identificados. Ao incluir estes novos eventos no seu diagrama, o especificador chegou à situação apresentada na Figura 2.

ESTADO DEFAULT

Supondo um determinado superestado E composto dos subestados A, B e C. Caso ocorra um evento f que resulta em uma transição para este superestado, o sistema entrará naquele subestado indicado como default, ou seja, no subestado B.

Graficamente um estado default deve ser representado como mostra a Figura 4, ou seja, através de uma pequena seta apontando para ele.


Statecharts4.gif (8002 bytes)

Figura 4 - Estado E, contendo o Estado default B

O sistema só não entrará no estado default se houver uma outra indicação em contrário.

No caso da Figura 4, caso ocorra o evento c, o sistema não respeita o default e vai para o estado C, pois trata-se de uma transição explicitamente indicada.

Existem duas formas de se representar um estado default, uma direta e uma outra em dois tempos. As duas, entretanto, são equivalentes. A Figura 5a mostra a forma direta e a Figura 5b mostra a forma em dois tempos.



Statecharts5.gif (12740 bytes)

Figura 5 - Duas formas de representar estados default

Na Figura 5a, B1 é o estado default em relação a tudo que estiver dentro de E. Agora, na Figura 5b, em primeiro lugar o superestado B é default em relação a A e C e, em segundo lugar, B1 é default em relação a B2 e B3.

ENTRADA-PELA-HISTÓRIA

(Enter-by-History)

Entrada-pela-história significa que o sistema ao reentrar em um superestado, vai entrar no seu subestado mais recentemente visitado. O sistema precisa para tanto ter a capacidade de "lembrar" qual é este último estado visitado. A entrada-pela-história é representada graficamente pela letra H dentro de um pequeno círculo.

A Figura 6a serve como exemplo para mostrar como funciona a entrada-pela-história.

Statecharts5.gif (12740 bytes)

Figura 6 - Canectivo "entrada-pela-história"

Quando o sistema entra em K, ou ele vai para G ou para F. Irá para G se, na última vez que esteve em K, foi em visita a um dos subestados de G, ou seja A ou B. lrá para F se, na última vez que esteve em K, foi em visita a um dos subestados de F, ou seja, C, D ou E. Se o sistema for para G, na verdade vai para B que é o subestado default dentro de G. Se for para F, vai para o subestado default C.

Uma forma de ignorar os estados default quando se usa a entrada-pela-história é mostrada na Figura 6b onde o H aparece em companhia de um asterisco. Neste caso o sistema entra no último estado básico visitado do cluster. No caso da Figura 6b, se na visita anterior a K o último estado visitado tenha sido D, então quando se reentrar no superestado K na próxima ocasião, entra-se em D.

A entrada-pela-história pode ocorrer em mais de um nível como mostra a Figura 6c, onde o sistema ou entra em G ou em F, dependendo de qual dos dois ele visitou por último. Se entrar em F, vai também "entrar-pela-história" pois o default C foi overriden, isto é, vai entrar ou em E, ou em D, ou em C, conforme tenha sido o último estado visitado.

A entrada-pela-história não se aplica quando é a primeira vez que se está entrando em um superestado, pois, obviamente, não houve visita anterior a este superestado. Neste caso vale o estado default.

CONCORRÊNCIA (ou ORTOGONALIDADE)

Em muitos casos, principalmente em sistemas complexos, o especificador precisa representar conjuntos de estados concorrentes, tais como o conjunto de estados do sistema de câmbio de velocidades de um automóvel que existe em paralelo com o seu sistema de freios. Um método eficiente de especificação deve fornecer mecanismos para que se possa representar situações deste tipo.


Statecharts7.gif (8144 bytes)

Figura 7 - DTE para dois conjuntos de estados concorrentes {B,C} e {E,F,G}

Um dos motivos que desestimulou o uso dos diagramas de estados tradicionais foi exatamente a dificuldade que apresenta quando se precisa tratar estados concorrentes. Para ilustrar esta dificuldade, tome-se como exemplo um sistema Y que apresenta dois conjuntos de estados concorrentes. O primeiro contendo os estados B e C, e o segundo contendo os estados E, F e G. A Figura 7 mostra como ficaria a representação em DTE clássico. Observar que, a cada momento, o sistema está em um estado do primeiro conjunto e também está, necessariamente, em um estado do segundo conjunto.

O mesmo sistema Y pode ser representado de maneira mais "enxuta", utilizando-se STATECHARTS como é mostrado na Figura 8. A notação usada para representar concorrência é um splitting de um cluster em tantos "compartimentos" quantos forem os conjuntos concorrentes de estados, através de separação de áreas por linhas tracejadas. No exemplo mostrado na Figura 8, dois conjuntos deste tipo são representados: o conjunto A e o conjunto D.

Pode ser percebido claramente que a quantidade de seis estados da Figura 7 é a mesma do produto cartesiano AÄD (2 x 3) da Figura 8. Se por acaso, em vez de 2 conjuntos, A possuísse 100 conjuntos e D, em vez de 3 conjuntos, possuísse 200, o resultado do produto cartesiano seria de 20 mil pares possíveis, o que tornaria uma correspondente representação em DTE clássico extremamente complicada.

Statecharts8.gif (9225 bytes)

Figura 8 - Statechart para dois conjuntos de estados concorrentes

Na Figura 8, é introduzida a notação de condição que pode opcionalmente acompanhar algum evento; é o caso do evento b seguido da condição in G, que faz com que, ao ocorrer o evento Mb, o sistema mude de estado de C para B se, e somente se, o sistema também estiver no estado concorrente G. Portanto, o sistema permanece em C, mesmo ocorrendo o evento b, caso esteja em E ou F e não em G.

Ortogondidade pode ser ententida com um AND entre dois ou mais conjuntos. Na Figura 8, por exemplo, sempre em um determinado momento do tempo o sistema apresenta um par de estados. Começa com o par B-and-F que são os estados default de cada subconjunto concorrente do sistema Y. Se em seguida ocorre o evento a o sistema vai para o par de estados C-and-G e assim por diante.

Podem ocorrer situações onde um evento afeta apenas um dos subconjuntos de Y, por exemplo, se o sistema estiver no par de estados C-and-G e ocorrer o evento d, então o sistema continua em C e muda de G para F, passando a apresentar um novo par de estados: C-and-F.

AÇÕES

Em STATECHARTS, além de especificar estados e transições, é possível também descrever as ações que ocorrem dentro do sistema a partir dos eventos.

Uma ação é representada associada a um evento e a sua notação é "x / S" onde x é o evento gatilho e S é uma ação executada. Por definição, uma ação é algo instantâneo, que não gasta tempo, enquanto que uma atividade dura um certo tempo. Por exemplo, podemos ter unia ação start (X) e uma ação stop (X) como marcos inicial e final de um atividade (X).

Uma ação também pode ser sentida pelo próprio sistema, isto é, pode se configurar em um evento a ser percebido em algum lugar do sistema. A Figura 9 mostra este fenômeno. Na primeira vez o sistema entra simultaneamente nos estados default B, F e J (trata-se de uma trinca de estados porque há uma ortogonalidade entre três conjuntos de estados). Em seguida ocorre o evento m que dispara a ação e. Como e é um evento que afeta o próprio sistema, ocorre uma transição de F para G e de B para C, fazendo com que o sistema passe a apresentar uma nova trinca de estados: C, G e I, numa espécie de reação em cadeia.

Esta capacidade de uma região "sentir" eventos internos ocorridos em outras regiões do sistema é possível graças à capacidade de broadcasting implícita ao formalismo STATECHARTS. Significa que além dos eventos do ambiente externo, também os eventos internos de um sistema podem provocar transições de estado.

CONCLUSÃO

O método STATECHARTS proposto por Harel realmente apresenta vantagens significativas sobre o DTE clássico, conseguindo representar situações que este último, ou não consegue, ou produz diagramas bastante intrincados. É o caso do tratamento de estados concorrentes e da capacidade de clustering.

Além disto, STATECHARTS pela sua abordagem visual e simplicidade de notação constitui-se em um excelente meio de comunicação entre o especificador e o usuário do sistema a ser projetado.

STATECHARTS aplica-se perfeitamente a sistemas de tempo real do tipo que reage a eventos, contudo atende perfeitamente à necessidade de especificação da interface homem-máquina de softwares em geral.

Statecharts9.gif (13311 bytes)

Figura 9 - Ações associadas a eventos provocando reação em cadeia

Referências bibliográficas:

[HAR 87a] HAREL, David. Statecharts: a visual formalism for complex systems. Science of Computer Programming, v. 8, p. 231-274, 1987.

[HAR 87b] HAREL, David. On visual formalisms. Rehovot: The Weizmann Inst. of Science, June 1987.

[RUM91] RUMBAUGH, J. et al. Object-oriented modeling and design. Englewood Cliffs: Prentice-Hall, 1991.