Skip to content

sulmar/mstechsummit2022-state-machine

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Maszyna stanu w praktyce

Kod źródłowy pochodzący z mojego wystąpienia na konferencji MS Tech Summit 2022

Wymagania

  • .NET 6.0

Uruchomienie

cd src/Shopper.ConsoleClient
dotnet run

Abstrakt

Dzień z życia programisty: Aplikacja wreszcie gotowa. Jutro prezentacja. Logika z mnóstwem warunków rozsianych po całym kodzie mozolnie przetestowana. Zapowiada się miły wieczór...

Nagle telefon - trzeba dodać nowy stan! Powoli osuwasz się z krzesła... Game Over.

Maszyna stanów skończonych pewnie kojarzy ci się z nudnym wykładem, o którym zapomniałeś wraz z zaliczonym egzaminem na studiach. Nic bardziej mylnego.

Zapoznaj się z kodem w tym repozytorium.

Definicje

  • Maszyna stanów to zbiór stanów states (s0, s1, s2 ... sN) oraz przejść (t1, t2 ... tN). Maszyna może znajdować się tylko w jednym ze stanów w danym momencie.

State machine abstract

  • Stan początkowy to stan (s0) w którym maszyna stanów rozpoczyna pracę (np. przyjęte)
  • Przejście własne Przejście pomiędzy stanami uruchamianie za pomocą wyzwalacza trigger (np. zatwierdź, anuluj, upłynął czas)
  • Akcje wejściowe Czynności uruchamianie przy wchodzeniu do danego stanu (np. wysłanie emaila)
  • Akcje wyjściowe Czynności uruchamianie przy opuszczaniu danego stanu.
  • Stan końcowy Stan osiągany na koniec pracy. Maszyna może posiadach kilka stanów końcowych (np. zrealizowane, anulowane).

Mapa myśli

Mapa myśli

Implementacja

  1. Instalacja biblioteki
dotnet add package Stateless
  1. Utworzenie maszyny stanów Określamy typ stanu State, typ wyzwalacza Trigger oraz stan początkowy Initial State.
StateMachine<LampState, LampTrigger> machine = new StateMachine<LampState, LampTrigger>(LampState.Off);
  1. Konfiguracja stanów i dopuszczalnych przejść
machine.Configure(LampState.Off)
    .Permit(LampTrigger.Push, LampState.On);

machine.Configure(LampState.On)
    .Permit(LampTrigger.Push, LampState.Off);
  1. Konfiguracja akcji wejścia i wyjścia
machine.Configure(LampState.On)
    .OnEntry(() => Console.WriteLine("Light on"));
    .Permit(LampTrigger.Push, LampState.On)
    .OnExit(() => Console.WriteLine("Light off"));
  1. Uruchamionie wyzwalacza
machine.Fire(LampTrigger.Push);
  1. Pobranie bieżącego stanu
Console.WriteLine(machine.State)
  1. Sprawdzenie czy jest możliwość uruchomienia wyzwalacza w aktualnym stanie
machine.CanFire(LampTrigger.Push)

Diagnostyka

Śledzenie maszyny stanów

 machine.OnTransitioned(transition => Console.WriteLine($"{transition.Source} -> {transition.Destination}"));

Wizualizacja maszyny stanów

DotGraph

Console.WriteLine(Stateless.Graph.UmlDotGraph.Format(machine.GetInfo()));

Mermaid

Arduino

About

Przykłady z wystąpienia Maszyna stanów w praktyce na konferencji MS Tech Summit 2022

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages