Mini tutorial de Máquina de Estado (State Machine) - Parte 2

No post anterior, falamos rapidamente sobre como funciona o um diagrama de Máquina de Estado. Neste post estarei dando um exemplo simples e uma implementação.

Imagine que você precise construir uma função que retire os espaços excedentes entre os nomes de uma pessoa de um cadastro.

Exemplo:

  • De: “Alex        Sandre           Dundes                    Rodrigues”
  • Para: “Alex Sandre Dundes Rodrigues”

Você pode pensar, é fácil fazer um algorítmo para solucionar este problema? - Verdade! Mas lembremos que este é um exemplo simples, quando partimos para um exemplo mais complexo, de fato a análise por Máquina de Estado nos ajudará.

Imaginando agore que iremos percorrer caracter à caracter da seqüência de entrada e quando encontrarmos um caracter espaço excedente, não copiaremos ele para a seqüência de saída. Lembrando que queremos retirar da saída o segundo caracter espaço em diante.

Para isso imaginemos uma máquina de estado, com 2 estados possíveis. Um estado em que estamos analisando os espaços e outro quando analisamos os outros caracteres. Indo direto ao ponto, veja o diagrama que eu fiz:

retira_espacos

Baseado neste diagrama, montei o seguinte código usando JavaScript.

function RetiraEspacosExcedentes(Entrada) {
  encontrouEspaco = false;
  aux = "";
  for(laco = 0; laco < Entrada.length; laco++) {
    if(encontrouEspaco){

      //Estado 1
      if(Entrada.substr(laco, 1) == " ") {
        encontrouEspaco = true;
        //Não faz nada
      } else {
        encontrouEspaco = false;
        aux += Entrada.substr(laco, 1);
      }    

    } else {

      //Estado 0
      if(Entrada.substr(laco, 1) == " ") {
        encontrouEspaco = true;
        aux += Entrada.substr(laco, 1);
      } else {
        encontrouEspaco = false;
        aux += Entrada.substr(laco, 1);
      }
    }
  }
  return aux;
}

WScript.Echo(RetiraEspacosExcedentes("Alex        Sandre      " +
  "     Dundes                    Rodrigues"));
 

Uma implementação de uma máquina de estado é caracterizada por uma variável de controle de estado, no exemplo é a variável encontrouEspaco, e um laço.

A cada interação do laço, devemos verificar em qual estado estamos e desviar o código para a execução de uma rotina para o estado determinado.

Na rotina do estado, devemos analisar todas as condições para as transições de estados, a cada condição válida, devemos determinar na variável de estado (encontrouEspaco) o novo estado (destino da flecha) e executar a ação associada a transição de estado.

Observo o diagrama e o código fonte. Veja que o fonte nada mais é que a forma escrita do diagrama.

A utilização do diagrama facilita o entendimento do problema e a possibilidade do teste mental (como falamos no artigo anterior). Traduzir isso em código, se torna mecânico, facilitando a implementação do algorítimo e dimunindo um possível erro de implementação.

No próximo artigo, estarei mostrando um exemplo mais complexo.

1 Resposta para “Mini tutorial de Máquina de Estado (State Machine) - Parte 2”


  1. 1 Douglas Cunha

    Muito bom. Esse exemplo citado, apesar de simples, é um exemplo de um problema muito comum e que muita gente se perde na hora de resolver, tornando algo que requer um algorítimo simples em algo confuso e propenso a bugs apenas porque não encontrou uma forma de descrever o problema de uma forma clara como você fez nesse artigo.
    Parabéns.

  1. 1 Validando endereço de e-mail com máquina de estado de DevelopeZ

Deixe uma Resposta