Kod źródłowy pochodzący z mojego wystąpienia na konferencji MS Tech Summit 2022
- .NET 6.0
cd src/Shopper.ConsoleClient
dotnet run
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.
- 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.
- 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).
- Instalacja biblioteki
dotnet add package Stateless
- 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);
- Konfiguracja stanów i dopuszczalnych przejść
machine.Configure(LampState.Off)
.Permit(LampTrigger.Push, LampState.On);
machine.Configure(LampState.On)
.Permit(LampTrigger.Push, LampState.Off);
- 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"));
- Uruchamionie wyzwalacza
machine.Fire(LampTrigger.Push);
- Pobranie bieżącego stanu
Console.WriteLine(machine.State)
- Sprawdzenie czy jest możliwość uruchomienia wyzwalacza w aktualnym stanie
machine.CanFire(LampTrigger.Push)
machine.OnTransitioned(transition => Console.WriteLine($"{transition.Source} -> {transition.Destination}"));
Console.WriteLine(Stateless.Graph.UmlDotGraph.Format(machine.GetInfo()));
- Biblioteka Automation