Tillstånd och tillståndsmaskiner

Publicerad

Använda tillståndsmaskiner för att definiera beteenden och tillståndsövergångar – förklaras med dejtingsappar

(20 dec 2020)

Vad är ett tillstånd?

I informationsteknik och datavetenskap beskrivs ett system som stateful om den är utformad för att komma ihåg föregående händelser eller användarinteraktioner; den ihågkomna informationen kallas tillstånd för systemet .

Ett systems tillstånd definieras ofta av den aggregering av beteenden som användarna gör. Stater är viktiga eftersom det är ett mer systematiskt sätt att verifiera om vissa beteenden i vissa stater är giltiga eller inte.

Tillstånd för ett trafikljus

Betrakta ett trafikljus som ett exempel. Om det har varit grönt förväntar sig förare och passagerare att se gult – inte rött – nästa. När det blir gult förväntar de sig rött och inte grönt. Så tillstånden här är enkla:

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

Följ pilarna (aka de tillåtna övergångarna av stater) och ditt trafikljus är bra att gå.

Matchens tillstånd i dejtingsappar

Låt oss nu ta en dejtingsapp som ett mer komplicerat exempel, föreställ dig att vi bygger en app för människor att ”matcha” online. Låt oss säga att vi har algoritmerna redo och vi måste börja skriva logiken bakom matchningarna som dyker upp i våra användares appar.

Låt oss definiera en enhet matcha först för att representera matchningen mellan två personer. Det finns flera tillstånd för en matchning som vi bör ta hänsyn till om vi skulle utforma den.

Vi behöver staterna så att människor inte ser oväntade beteenden som en slumpmässig, icke-matchad person som dyker upp på skärmen säger hej.

Foto av Yogas Design Unsplash

Min tankeprocess:

  1. Först och främst måste en matchning vara skapad , vilket betyder att en viss uppsättning algoritmer har för att välja två personer redo för en match. Naturligtvis måste algoritmerna i förväg se till att de båda är redo för en matchning, passar varandras preferenser, inte förbjudna osv.
  2. Då kan denna match bli antingen väntar (väntar på en annan persons svep) eller misslyckades beroende på den första användarens åtgärd. Om användaren sveper åt höger (vilket betyder ”Jag gillar dig” i dejtingsappens termer) hoppar staten från skapad väntande . Om användaren sveper åt vänster (vilket betyder ”Jag gillar dig inte”) ändras tillståndet till misslyckades .
  3. Om båda människorna gillar varandra går det från i väntan på till matchade .
  4. Endera av personen i en matchning kan också ”matcha” en matchning, vilket leder staten till oöverträffad .
  5. Jag tror att jag har fått alla tillståndsändringar täckta. Men är allt detta? Hmm … finns det inte en betald funktion som heter ”spola tillbaka” som låter dig gå tillbaka och svepa igen? Vad ska vi göra med detta?

Hur ser vi till att vi har inkluderat alla ändringar? I så fall hur programmerar vi det?

Vad är en tillståndsmaskin?

En metod för att modellera beteendet hos en enhet med en etablerad livscykel

När vi bygger tillståndsorienterade system är tillståndsmaskiner användbara för att hjälpa oss att bättre bestämma de komplicerade övergångarna och utlösarna.

Finite state machines (FSM)

It är en abstrakt maskin som kan vara i exakt ett av ett ändligt antal tillstånd när som helst. FSM kan ändras från ett tillstånd till ett annat som svar på några ingångar ; ändringen från ett tillstånd till ett annat kallas en övergång . En FSM definieras av en lista över dess tillstånd, dess ursprungliga tillstånd och ingångarna som utlöser varje övergång.

Låt oss fortsätta med vårt dejtingsappsexempel.Om vi ​​skapar ett tillståndsdiagram från logiken bakom en matchning , det ser lite ut så här:

* Olika metoder kan användas av olika användare: någon av de matchade kunderna eller dejtingsappen (plattformsbyggare / företag).

Det har ett begränsat antal stater, som modellerar alla beteenden inom matchningens livscykel. För att bygga en tillståndsmaskin måste vi bara följa raderna och se hur enheten reagerar på olika beteenden.

Varför ska jag använda en tillståndsmaskin?

Okej nu vet jag att tillståndsdiagrammet är verkligen användbart, men ändå varför ska jag använda en tillståndsmaskin när jag skriver min kod?

Från samma exempel, låt oss ta en titt på någon förenklad kod före och efter är en statsmaskin involverad.

Innan du använder en tillståndsmaskin

Du kan upptäcka mycket if/else uttalanden.

Efter att ha använt en tillståndsmaskin

Låt ChangeState -metoden ta hand om tillståndsövergångar med StateTransition -typ. Alla andra metoder kan nu fokusera på logiken för att hantera matchningen.

Vad mer kan jag göra?

Bara för att nämna några:

  • För närvarande antar vi att ”Rewind” -metoderna är tillräckligt bra för att frontend-gränssnitt kan ringas. Ett mer känsligt sätt att hantera metoder bör vara att kontrollera om matchningen spelas in – och om så är gillad eller ogillad – och sedan bestämma vilket kommando som ska användas. Istället för att låta användargränssnittet bedöma (och riskera att det blir fel) föreslås det mer att vi hanterar det i klassen MatchEntity.
  • Om staten övergår bli för komplicerad, försök använda en matris med axel för aktuella tillstånd och kommandon. Data i matrisen kan vara de uppdaterade tillstånden. På så sätt blir koden mer läsbar.

Sammanfattning

Så varför använda en tillståndsmaskin? Eftersom med tanke på de statligt förändrade händelserna (även kallat en enhets viktiga beteenden) modellerar det bättre ett system. För det mesta kan allt annat lösas med grundläggande CRUD-metoder. Det gör också din kod mer läsbar och underhållbar.

När det gäller att bygga API: er ska du inte utforma dem endast baserat på de önskemål som produktchefer gör. Designa API: er (åtminstone minsta API: er) för din enhet med kritiska beteenden och övergångar – tillstånd – i åtanke.

Referens

Richard Clayton – Använd State Machines!

Finite State Machines (FSM, eller i samband med detta inlägg, helt enkelt ”State Machines”) är en metod för att modellera …

rclayton. silvrback.com

Finite-state machine

En finite-state machine (FSM) eller finite-state automaton (FSA, plural: automata), finite automaton, or simply a state…

en.wikipedia.org

Exempel på enkla tillståndsmaskiner i C #?

Jag har just bidragit med detta: https://code.google.com/p/ysharp/source/browse/#svn\%2Ftrunk\%2FStateMachinesPoC Här är en …

stackoverflow.com

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *