
Calma não se assuste, não vou falar de nenhum maquinário tecnológico maluco. A Máquina de Estado Finito ou FSM( Finite State Machine ) é uma forma de programar.
O conceito de uma Máquina de Estado Finito segundo a wikipedia é: Uma modelagem de um comportamento, composto por estados, transições e ações.
Num modo prático, se você já participou de uma "aventura solo" dos antigos livros-jogo, clássicos para iniciação ao mundo do RPG, naturalmente entenderá a FSM. Eu como todo bom NERD passei a infância rodeado dos livros-jogos de Peter Jackson e Ian Livingstone.
Os livros-jogos são livros interativos em que o leitor encarna um personagem inserido em várias situações, ele era todo dividido em trechos numerados onde no final de cada um destes exisitiam escolhas em que o leitor precisava escolher uma que conduziria para outro trecho.
Apenas para exemplificar segue um pedaços de uma aventura retirado da revista Só Aventuras #2 da Dragão Brasil.
"1) Você é um jovem iniciante nas artes mágicas. Tudo o que sabe atualmente foi ensinado por um velho homem da cidade que, outrora, foi considerado um grande feiticeiro.
Mas este conhecimento não é o suficiente para você. Sua sede pela magia, têm motivado-o a buscar mais conhecimentos mágicos.
Você ouve boatos sobre um lugar ao norte, além da Floresta Maldita, onde a magia reina absoluta.
O unico caminho que leva a Floresta Maldita dizem que esta repleto de ladrões e criaturas famintas. Após horas de caminhada, você tem a impressão de que alguém o observa, mas não vê nada, continua a andar até que escuta um graveto estalar muito próximo.
Quando subitamente quatro criaturas saltam para a trilha. Pele cinzenta, cheiram mal e empunham espadas curtas. Um deles, toma a frente e grita:
'Passe suas moedas para cá!'
O que você faz?
Entrega as moedas para evitar confusão. Vá para 4
Saca o punhal e enfrenta os assaltantes. vá para 2
Tenta uma magia. vá para 3
2)
Você saca seu punhal de prata e grita: "Venham criaturas! E encontrem a morte em minha lâmina!" Mas... o que você pensa que está fazendo? É um mago, não um guerreiro. Esta tolice lhe custou a vida.
3)
Você recorda que já ouviu falar dessas criaturas, são goblins, seres imensamente covardes, com pavor de magia. Você começa a dizer as palavras mágicas e fazer gestos necessários para invocar um feitiço, mas antes que consiga terminar o encantamento, aquele que parece o líder grita:
'Ele é um feiticeiro! Vai nos transformar em humanos feios! Fujam!!'
E você segue o seu caminho tranquilo.
4)
Achando mais prudente entregar as moedas às pequenas criaturas, voc6e joga a pequena bolsa de veludo para o líder. Então eles fogem por entre as árvores, sumindo da visão deixando-o livre para prosseguir sua jornada."
Tá bom mas o que isto tem a ver com Máquina de Estado Finito? Bom, tudo...
Seguindo a estória apresentada no trecho 1 nos deparamos com 3 escolhas, ao escolher uma destas alternativas é gerado um evento que acarreta numa consequência, a opção 2 leva a morte =D
Assim como no jogo você possui opções pré-definidas na FSM você determina as ações de acordo com o estado.
Agora vamos utilizar a FSM no Rails, um plugin bem funcional é o acts_as_state_machine, existe muito pouco material sobre ele.
A instalação não tem segredo:
./script/plugin install http://elitists.textdriven.com/svn/plugins/acts_as_state_machine/trunk/
Vamos criar uma FSM para controlar um Forno Microondas em Rails para entender o funcionamento do acts_as_state_machine.
Funcionamento do Forno Microondas:
O Forno tem um botão de Ligar para iniciar e um Temporizador que determina o período de cozimento. O Cozimento pode ser interrompido a qualquer momento que a porta do Forno for aberta. Depois de fechada a porta o cozimento continua. O cozimento irá terminar quando o temporizador estiver zerado.
1 class Microondas < ActiveRecord::Base
2 # Inicialmente o Microondas estará no estado "Desligado"
3 acts_as_state_machine :initial => :desligado
4
5 state :desligado
6 state :ligado
7 state :interrompido
8 state :concluido
9
10 # No evento 'iniciar' eh realizada a transicao do estado "pendente" para "iniciada"
11 event :iniciar do
12 transitions :from => :desligado, :to => :ligado
13 end
14
15 event :concluir do
16 transitions :from => :ligado, :to => :concluido unless self.temporizador > 0
17 end
18
19 event :interromper do
20 transitions :from => :ligado, :to => :interrompido
21 end
22
23 event :continuar do
24 transitions :from => :interrompido, :to => :ligado
25 end
26 end
OBS: O plugin assume que o estado de seu model fica no campostate.
1 microondas = Microondas.create
2 microondas.state # "desligado"
3 microondas.temporizador = 5
4 microondas.iniciar? # true
5 microondas.interromper
6 microondas.state # "interrompido"
7 microondas.continuar
8 microondas.state # "ligado"
9 microondas.concluir?
A utilização de uma FSM é além dos limites da imaginação. Um exemplo clássico de utilização é um cadastro de usuário.
O cadastro de usuário pode ter, por exemplo, os seguintes estados:
Recém Cadastrado (aguardando confirmacao de email), Membro e Banido(desativado).
Outro exemplo seriam os estados de um documento dentro de um GED(gestor eletronico de documentos), ou um projeto em um gestor de projetos, ou um ticket em um BPM (bussiness process management).
Mais sobre aventuras-solo http://www.sobresites.com/rpg/aventurassolo.htm
Mais sobre FSM http://www.programmingbasics
http://www.brasiltech.net/developez/2008/02/22/mini-tutorial-de-maquina-de-estado-state-machine-parte-1/
