Comportamientos: máquina de estados sin dolor de cabeza

El enfoque estándar para describir la secuencia de las entradas y reacciones de los usuarios (por ejemplo, al controlar un personaje en un juego) es una máquina de estados. Sin embargo, a menudo conduce a programas engorrosos, cuya comprensión requiere un esfuerzo considerable o incluso dibujar en papel. En este artículo, propongo un pequeño cambio en la descripción, lo que ahorra espacio en la pantalla y recursos cerebrales.


imagen

El cambio en la descripción es el uso de la técnica corutina. Para aplicar esta técnica, debe imaginar qué tipo de comportamiento esperamos de la computadora como resultado. Por lo tanto, llamé a la pequeña biblioteca que creé para esta tarea: Comportamientos.

Cuando el usuario interactúa con el programa, la computadora espera una determinada acción y responde a la entrada de cierta manera. Los comportamientos primitivos y sus combinaciones pueden reemplazar máquinas voluminosas de estado, que a menudo se encuentran formal o informalmente en los programas. Por ejemplo, cuando un programa está en un estado de espera para que se presione una determinada tecla, podemos decir que realiza el comportamiento waitForKey (...). La conveniencia es que los comportamientos se combinan en una forma fácil de leer, a diferencia de las máquinas de estado. Un ejemplo simple de arrastrar y soltar:

* DragAndDrop = * draggedObject =  MouseDown  -  * First *  MouseUp * Forever *  MouseMove *  draggedObject 

El comportamiento tiene un principio, un final y puede devolver un valor. Los comportamientos se ejecutan en orden o pueden ejecutarse en paralelo utilizando combinadores. Por ejemplo, el primer combinador ejecuta varios comportamientos en paralelo y finaliza cuando uno de los comportamientos está terminado, devolviendo su resultado. Para siempre: repite la ejecución de un comportamiento específico hasta el infinito. A diferencia de la ejecución de funciones, el comportamiento no bloquea el hilo principal de ejecución, por lo que los comportamientos infinitos pueden ser muy útiles.

Implementé comportamientos utilizando funciones que reciben eventos primitivos (como MouseDown, MouseUp, MouseMove, ...) como parámetro y producen un objeto de la forma:

 { done: true|false, value: result value } 

Puede ver la implementación aquí: behaviour.js en GitHub y el ejemplo de arrastrar y soltar aquí: jsFiddle .

¿Dónde se pueden usar los comportamientos?

  • Juegos de computadora : es muy conveniente escribir lógica e inteligencia artificial, a veces incluso hago todo con Comportamientos, incluida la animación y el movimiento de objetos, pero es necesario controlar el rendimiento
  • Tutorial en la interfaz (recorrido por nuevas características): muestra información, espera la interacción del usuario, continúa dependiendo de la entrada, todo el código en un lugar y lee casi como un pseudocódigo
  • El analizador de lenguaje orientado a temas es un código idiomático, no es necesario "mirar hacia adelante" en la entrada, ya que puede ejecutar varios comportamientos en paralelo

Foto: Comportamiento por Nick Youngson CC BY-SA 3.0 Alpha Stock Images

Source: https://habr.com/ru/post/436972/


All Articles