Států a stavových automatů

Použití stavových automatů k definování chování a přechodů stavů – vysvětleno pomocí datovacích aplikací

(20. prosince 2020)

Co je to stát?

V informačních technologiích a počítačové vědě je systém popsán jako stavový pokud je navržen tak, aby si pamatoval předchozí události nebo interakce uživatelů; zapamatovaná informace se nazývá stav systému .

Stavy systému jsou často definovány agregací chování jeho uživatelů. Státy jsou důležité, protože jde o systematičtější způsob ověřování, zda je určité chování v určitých státech platné, či nikoli.

Stavy semaforu

Jako příklad si vezměte semafor. Pokud bude zelená, řidiči a cestující očekávají, že uvidí další žlutou – ne červenou. Když se změní na žlutou, očekávali by červenou a ne zelenou. Zde uvedené stavy jsou tedy jednoduché:

Green -> Yellow -> Red
^ |
|\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_|

Postupujte podle šipek (aka povolené přechody stavů) a váš semafor je v pořádku.

Stavy zápasů v seznamovacích aplikacích

Nyní si vezmeme seznamovací aplikaci jako komplikovanější příklad, představme si, že vytváříme aplikaci pro lidi, aby se „shodovali“ online. Řekněme, že máme algoritmy připravené a musíme začít psát logiku za shodami, které se objevují v aplikacích našich uživatelů.

Pojďme definovat entitu shoda první, která představuje shodu mezi dvěma lidmi. Existuje několik stavů pro shodu, které bychom měli vzít v úvahu, pokud bychom ji měli navrhnout.

Potřebujeme stavy, aby lidé neuviděli neočekávané chování, jako je náhodný, neshodující se člověk na obrazovce ahoj.

Foto: Yogas Design on Unsplash

Můj myšlenkový proces:

  1. Nejdříve ze všeho musí být vytvořen , což znamená, že určitá sada algoritmů má vybrat dva lidi připravené na zápas. Algoritmy se samozřejmě musí předem ujistit, že jsou oba připraveni na shodu, vzájemně vyhovět jejich preferencím, nebanovat atd.
  2. Potom by se tato shoda mohla stát buď čeká (čeká na přejetí prstem jiné osoby) nebo se nezdařilo v závislosti na akci prvního uživatele. Pokud uživatel přejede prstem doprava (což znamená „mám tě rád“ v termínech seznamovacích aplikací), stav skočí z vytvořeného na čeká na . Pokud uživatel přejede prstem doleva (což znamená „Nemám tě rád“), stav se změní na se nezdařil .
  3. Pak, pokud se oba lidé mají rádi, přechází z čekající na uzavřeno .
  4. Kdokoli z člověka v zápase může také „zrušit shodu“ se shodou a stát se tak dostane do bezkonkurenční .
  5. Myslím, že mám zahrnuty všechny změny států. Ale jsou to všechno? Hmm … není k dispozici placená funkce zvaná „zpět“, která vám umožní vrátit se zpět a přejet prstem znovu? Co bychom s tím měli dělat?

Jak zajistíme, aby byly zahrnuty všechny změny? Pokud ano, jak to naprogramujeme?

Co je to stavový stroj?

Metodika modelování chování entity se zavedeným životním cyklem

Při budování stavově orientovaných systémů jsou stavové stroje užitečné, aby nám pomohly lépe určit komplikované přechody a spouštěče.

Konečné stavové stroje (FSM)

It je abstraktní stroj , který může být přesně v jednom z konečného počtu států kdykoli. FSM se může změnit z jednoho stavu do druhého v reakci na některé vstupy ; změna z jednoho stavu do druhého se nazývá přechod . FSM je definován seznamem svých stavů, počátečním stavem a vstupy, které spouštějí každý přechod.

Pojďme pokračovat v našem příkladu seznamovací aplikace.Pokud vytvoříme stavový diagram z logiky za shodou , vypadá to asi takto:

* Různé zúčastněné uživatele mohou zvolit různé metody: buď odpovídající zákazníci, nebo seznamovací aplikace (tvůrce platformy / společnost).

Má konečný počet stavů, modelování veškerého chování v rámci životního cyklu zápasu. Chcete-li vytvořit stavový automat, musíme postupovat podle řádků a zjistit, jak entita reaguje na různá chování.

Proč bych měl používat stavový automat?

Dobře, vím, že stavový diagram je opravdu užitečný, přesto proč bych měl při psaní kódu používat stavový stroj?

Ze stejného příkladu se podívejme na nějaký zjednodušený kód před a po zapojení státního stroje.

Před použitím stavového stroje

Můžete si všimnout mnoha if/else prohlášení.

Po použití stavového stroje

Nechte metodu ChangeState postarat se o přechody stavu pomocí StateTransition typu. Všechny ostatní metody se nyní mohou zaměřit na logiku manipulace se zápasem.

Co dalšího mohu udělat?

Stačí jen jmenovat několik:

  • Prozatím předpokládáme, že metody „Rewind“ jsou dost dobré pro volání rozhraní frontend. Choulostivějším způsobem, jak se vypořádat s metodami, by mělo být zkontrolovat, zda je shoda zaznamenána – a pokud ano, zda se jí líbí nebo nelíbí – a poté se rozhodnout, který příkaz použít. Místo toho, abychom nechali UI provést úsudek (a riskovat, že bude chybný), je více navrženo, abychom to zvládli ve třídě MatchEntity.
  • Pokud stav přechází příliš komplikovaný, zkuste použít matici s osou aktuálních stavů a ​​příkazů. Data v matici mohou být aktualizované stavy. Tímto způsobem bude kód čitelnější.

Shrnutí

Proč tedy používat stavový stroj? Protože vzhledem k událostem měnícím stav (aka důležitému chování entity), lépe modeluje systém. Většinou vše lze vyřešit základními metodami CRUD. Díky tomu je váš kód také čitelnější a udržovatelnější.

Pokud jde o vytváření rozhraní API, nevytvářejte je pouze na základě požadavků produktových manažerů. Navrhujte rozhraní API (alespoň minimální API) pro vaši entitu s ohledem na kritické chování a přechody – stavy.

Odkaz

Richard Clayton – Use State Machines!

Finite State Machines (FSM, nebo v kontextu tohoto příspěvku jednoduše „State Machines“) jsou metodikou modelování…

rclayton. silvrback.com

Stroj s konečným stavem

Stroj s konečným stavem (FSM) nebo automat s konečným stavem (FSA, množné číslo: automaty), konečný automat nebo jednoduše stav…

en.wikipedia.org

Příklad jednoduchého stavového stroje v C #?

Právě jsem přispěl tímto: https://code.google.com/p/ysharp/source/browse/#svn\%2Ftrunk\%2FStateMachinesPoC zde je jeden …

stackoverflow.com

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *