A abordagem padrão para descrever a sequência de entradas do usuário e reações a elas (por exemplo, ao controlar um personagem em um jogo) é uma máquina de estado. No entanto, muitas vezes leva a programas pesados, cuja compreensão requer um esforço considerável ou até mesmo esboços no papel. Neste artigo, proponho uma pequena mudança na descrição, que economiza espaço na tela e recursos cerebrais.

A mudança na descrição é o uso da técnica de corotina. Para aplicar essa técnica, é necessário imaginar que tipo de
comportamento esperamos do computador como resultado. Portanto, chamei a pequena biblioteca que criei para esta tarefa - Comportamentos.
Quando o usuário interage com o programa, o computador aguarda uma determinada ação e responde à entrada de uma certa maneira. Comportamentos primitivos e suas combinações podem substituir máquinas de estado volumosas, geralmente encontradas formal ou informalmente em programas. Por exemplo, quando um programa está em um estado de espera para que uma determinada tecla seja pressionada, podemos dizer que ele executa o Comportamento waitForKey (...). A conveniência é que os comportamentos são combinados de uma forma fácil de ler, diferente das máquinas de estado. Um exemplo simples de arrastar e soltar:
* DragAndDrop = * draggedObject = MouseDown - * First * MouseUp * Forever * MouseMove * draggedObject
O comportamento tem um começo, um fim e pode retornar um valor. Os comportamentos são executados em ordem ou podem ser executados em paralelo usando combinadores. Por exemplo, o Primeiro combinador executa vários comportamentos em paralelo e termina quando um dos comportamentos é concluído, retornando seu resultado. Para sempre - repete a execução de um comportamento específico para o infinito. Diferentemente da execução das funções, o Behavior não bloqueia o thread principal da execução, portanto, os Behaviors infinitos podem ser muito úteis.
Implementei Comportamentos usando funções que recebem eventos primitivos (como MouseDown, MouseUp, MouseMove, ...) como parâmetro e produzimos um objeto do formulário:
{ done: true|false, value: result value }
Você pode ver a implementação aqui:
behavior.js no GitHub e o exemplo Drag & Drop aqui:
jsFiddle .
Onde os comportamentos podem ser usados?
- Jogos de computador - é muito conveniente escrever lógica e IA, às vezes até faço tudo com Comportamentos, incluindo animação e movimento de objetos, mas você precisa monitorar o desempenho
- Tutorial no frontend (tour de novos recursos) - mostre informações, aguarde a interação do usuário, continue dependendo da entrada, todo o código em um só lugar e leia quase como pseudo-código
- O analisador de linguagem orientado a assunto é um código idiomático, não há necessidade de "olhar para frente" na entrada, pois você pode executar vários comportamentos em paralelo
Foto:
Comportamento de Nick Youngson CC BY-SA 3.0 Alpha Stock Images