Die einfachsten Zustandsautomaten oder Zustandsautomaten in drei Schritten

BildHallo Habr!

Kommen wir zur Sache, aber ein wenig Hintergrundwissen ist noch erforderlich: Vor anderthalb Jahren wurde es notwendig, eine einfache Zustandsmaschine (Zustandsmaschine) zu implementieren, die die Theorie der Universität besaß. Ich war mir sicher, dass dieses Problem trivial war (wir sind alle Optimisten).


Die Zeit, die mit Google verbracht wurde, verlief ergebnislos, da die vorhandenen Lösungen nicht nur einen schwerwiegenden Fehler aufwiesen , sondern auch eine Reihe anderer schwerwiegender Mängel wie die komplexe Struktur und den Mangel an Dokumentation.



Ich stieß bald auf diesen Artikel , der den Mangel an bequemen Lösungen bestätigte.



Was hast du dann getan?



Da die Aufgabe (wie üblich) schnell gelöst werden musste, wurde meine Finite-State-Maschine mithilfe von Wörterbüchern implementiert, dh:



  • es gibt eine Liste von Staaten (Enum)
  • ( )
  • (map): --


, « » , , ( )



?



« » . , , , - .



: .

, .



...





wpf ReactiveUI.



.

, xml .



Bild



, — . 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. Automatische Zuordnung von Knoten - magische Schaltfläche zum automatischen Layout von Elementen auf Leinwand
  3. Plattformübergreifend

    - Übersetzung des Projekts auf AvaloniaUI


Schlussfolgerungen



  • Wir erstellen eine Zustandsmaschine in drei Schritten und können jederzeit die Struktur der Maschine visuell anzeigen und bearbeiten.
  • Weiterentwicklung des Projekts


Verweise



Grafikeditor , Quellen auf GitHub: SimpleStateMachineNodeEditor

Library, Quellen auf GitHub: SimpleStateMachineLibrary




All Articles