Lab3 Maykon Bergamaschi

aluno: Maykon Bergamaschi
ano/sem: 2008/2o.
data do laboratório (num. da semana) : 12/10/2008 (2)

Introdução

Este laboratório teve por objetivo o desenvolvimento de uma biblioteca de máquina de estados finita movida a eventos. As informações dadas consistiam somente em uma descrição das funções da máquina, além de casos de teste e especificações relativas à interface.

Foram trabalhados conceitos relativos a classes anônimas, além dos padrões Command e Observer.

Desenvolvimento

A máquina de estados criada foi totalmente encapsulada em um Package. O diagrama de estados correspondente está mostrado abaixo.

diagrama-máquina_de_estados.JPG
Figura 1 - Diagrama da Máquina de Estados

Para a implementação da máquina, foram desenvolvidas as seguintes classes:

Classe StateMachine

É a classe que implementa a máquina de estados propriamente dita. Contém informações sobre o estado atual da máquina, eventos e estados suportados. Possui também a implementação do padrão Observer.

Os eventos e os estados referentes à máquina, bem como a implementação do Observer, estão armazenados em uma estrutura de dados conhecida como Hash Map, que associa chaves com valores. Tal estrutura muito útil para fazer operações de lookup, realizadas freqüentemente na máquina.

Classe StateCommand

Trata-se de uma classe abstrata que contém o método abstrato execute, responsável por implementar as ações de estado da máquina. Juntamente com a classe EventCommand, que será descrita a seguir, constituem a implementação do padrão Command, em que os objetos representam ações. Objetos dessas duas classes encapsulam uma ação e seus parâmetros.

Classe EventCommand

Como já mencionado no item anterior, é uma classe que faz parte do padrão Command. Abstrata, também contém o método abstrato execute, que implementa as ações relativas aos eventos da máquina.

Classe State

É uma classe que implementa os estados da máquina. Possui informações sobre o nome do estado e um objeto da classe StateCommand.

Classe Event

Classe análoga à State, implementa os eventos da máquina. Contém informações sobre o nome do evento e um objeto da classe EventCommand. Além disso, possui também um objeto da interface EventGuard e um Hash Map com objetos da classe Transition associados ao nome das transições. A interface EventGuard e a classe Transition serão descritas a seguir.

Interface EventGuard

Contém o método shouldPerform, com as condições de guarda.

Classe Transition

Trata-se de uma classe que contém informações sobre uma transição, ou seja, os estados de origem e de destino.

Interface Observer

É uma classe que implementa o padrão Observer. Possui o método update, que atualiza as informações da máquina para os observadores pertencentes ao seu Hash Map observersList, objetos adicionados por meio do método registerObserver.

Aplicação da biblioteca da máquina de estados

Foi necessário fazer uma alteração no nome das classes dos erros, pois a aplicação fornecida continha os nomes UndefinedStateError e UndefinedEventError, ao passo que eram esperados UndefinedStateException e UndefinedEventException.

O resultado dos testes com a aplicação fornecida está mostrado abaixo. Como se pode ver, o teste foi bem sucedido.

resultado_testes01.JPG
Figura 2 - Resultado dos testes com a aplicação fornecida

Foram realizados testes manuais, lançando uma seqüência de eventos de motivação e desmotivação de um objeto da classe Professor. O resultado está mostrado a seguir. Foi obtido um resultado que se esperava, seguindo o diagrama de estados que foi proposto.

resultado_testes02.JPG
Figura 3 - Resultado dos testes manuais com a aplicação fornecida

Testando as condições de guarda, que correspondem à variável booleana isGanhandoMilhoesDeDolares, nota-se que o objeto da classe Professor não sai do estado motivado, como se vê a seguir.

resultado_testes03.JPG
Figura 4 - Resultado dos testes manuais com a condição de guarda

Seguindo com os testes, foi criada um cofre, cujo segredo é de três dígitos que devem ser inseridos em seqüência. O diagrama dessa máquina de estados está mostrado a seguir. Para exemplificar, o segredo do cofre é 3-2-5.

diagrama-máquina_cofre.JPG
Figura 5 - Aplicação da Máquina de Estados: Diagrama do cofre

O código relativo ao cofre encontra-se no arquivo "lab3-teste.zip". A seguir, o resultado dos testes, novamente bem sucedidos.

resultado_testes04.JPG
Figura 6 - Resultado dos testes de abertura do cofre

Conclusão

Com este laboratório, foi desenvolvida com sucesso uma biblioteca de máquina de estados finita movida a elementos. Assim, foi possível aprender mais sobre os padrões Command e Observer. O encapsulamento da máquina de estados de fato torna as implementações mais simples para os usuários.

Uma sugestão é deixar no roteiro da prática uma observação sobre o uso de Hash Maps, estruturas que facilitam bastante a realização da prática. Foi importante conhecer essa estrutura, mesmo que não tenha sido um dos objetivos (diretos) do laboratório.

Add a New Comment
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License