Las máquinas de estado o máquinas de estado más simples en tres pasos.

imagenHola Habr!

Pasemos a los negocios, pero todavía se necesita un poco de experiencia: hace un año y medio, se hizo necesario implementar una máquina de estado simple (máquina de estado), que poseía la teoría de la universidad, estaba seguro de que este problema era trivial (todos somos optimistas).


El tiempo pasado con Google transcurrió sin resultados, ya que las soluciones existentes no solo tenían un defecto fatal , sino también una serie de otras deficiencias graves, como una estructura compleja y la falta de documentación.



Pronto me encontré con este artículo , que confirmó la falta de soluciones convenientes.



¿Entonces que hiciste?



Como la tarea debía resolverse rápidamente (como de costumbre), mi máquina de estados finitos se implementó utilizando diccionarios, es decir:



  • hay una lista de estados (Enum)
  • ( )
  • (map): --


, « » , , ( )



?



« » . , , , - .



: .

, .



...





wpf ReactiveUI.



.

, xml .



imagen



, — . gif .



, ( )





image



:







  • ( )




image





image





image





image





image





image





image





image



/ / xml





<?xml version="1.0" encoding="utf-8"?>
<StateMachine>
  <States>
    <State Name="Start" Position="37, 80" IsCollapse="False" />
    <State Name="State 1" Position="471, 195.54" IsCollapse="False" />
    <State Name="State 2" Position="276, 83.03999999999999" IsCollapse="False" />
  </States>
  <StartState Name="Start" />
  <Transitions>
    <Transition Name="Transition 2" From="State 2" To="State 1" />
    <Transition Name="Transition 1" From="Start" To="State 2" />
  </Transitions>
</StateMachine>


PNG/JPEG



image





:



  1. .



    StateMachine stateMachine = new StateMachine("scheme.xml");
  2. , «» , .



    stateMachine.GetState("State1").OnExit(Action1);
    stateMachine.GetState("State2").OnEntry(Action2);
    stateMachine.GetTransition("Transition1").OnInvoke(Action3);
    stateMachine.OnChangeState(Action4);
  3. .



    stateMachine.Start(parameters);


, , , , export , .



?



, Entry/Exit , :





StateMachine.InvokeTransition("Transition1", parameters);


, , , .



?



  • .
  • Data — , StateMachine .


, .



, ( )

:



  • /
  • / / xml




, .

.

, — , !



. :





. , .



:



stateMachine.GetState("State1");




stateMachine.State1;


, dynamic .

- -, .



. :



  1. .


  2. Asignación automática de nodos : botón mágico para el diseño automático de elementos en el lienzo
  3. Cross

    - platform - Traducción del proyecto en AvaloniaUI


conclusiones



  • Creamos una máquina de estado en tres pasos, mientras que en cualquier momento podemos visualizar y editar visualmente la estructura de la máquina.
  • Desarrollo posterior del proyecto.


Enlaces



Editor gráfico, fuentes en GitHub: SimpleStateMachineNodeEditor

Library, fuentes en GitHub: SimpleStateMachineLibrary




All Articles