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:
Baseado neste diagrama, montei o seguinte código usando JavaScript.
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.
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.