Tilstande og statsmaskiner

Brug af statsmaskiner til at definere adfærd og tilstandsovergange – forklaret med datingapps

(20. dec 2020)

Hvad er en tilstand?

I informationsteknologi og datalogi beskrives et system som stateful hvis det er designet til at huske foregående begivenheder eller brugerinteraktioner; den huskede information kaldes tilstand af systemet .

Et systems tilstande defineres ofte af den aggregering af adfærd, dets brugere gør. Stater er vigtige, fordi det er en mere systematisk måde at kontrollere, om visse adfærd i bestemte stater er gyldige eller ej.

Tilstande for et trafiklys

Overvej et trafiklys som et eksempel. Hvis det har været grønt, forventer chauffører og passagerer at se gul – ikke rød – næste. Når det bliver gult, forventer de rødt og ikke grønt. Så staterne her er enkle:

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

Følg pilene (aka de tilladte overgange af stater), og dit trafiklys er godt at gå.

Matchstatus i datingapps

Lad os nu tage en datingapp som et mere kompliceret eksempel. Forestil dig, at vi bygger en app, som folk kan “matche” online. Lad os sige, at vi har algoritmerne klar, og at vi skal begynde at skrive logikken bag de match, der dukker op i vores brugeres apps.

Lad os definere en enhed match først for at repræsentere matchet mellem to personer. Der er flere tilstande til en kamp, ​​som vi skal tage i betragtning, hvis vi skulle designe den.

Vi har brug for staterne, så folk ikke kan se uventet opførsel som f.eks. på skærmen siger hej.

Foto af Yogas Design Uplash

Min tankeproces:

  1. Først og fremmest skal et match være oprettet , hvilket betyder, at et bestemt sæt algoritmer har for at vælge to personer, der er klar til en kamp. Selvfølgelig skal algoritmerne på forhånd sørge for, at de begge er klar til en kamp, ​​passer til hinandens præferencer, ikke er forbudt osv.
  2. Derefter kan denne kamp blive enten afventende (venter på en anden persons swipe) eller mislykkedes afhængigt af den første brugers handling. Hvis brugeren stryger til højre (hvilket betyder “Jeg kan lide dig” i forhold til datingapps), springer staten fra oprettet til afventer . Hvis brugeren stryger til venstre (hvilket betyder “Jeg kan ikke lide dig”), ændres tilstanden til mislykkedes .
  3. Hvis begge mennesker kan lide hinanden, går det fra afventende til matchede .
  4. Enten af ​​personen i en kamp kunne også “unmatch” en match, hvilket bragte staten til uovertruffen .
  5. Jeg tror, ​​jeg har fået alle statusændringer dækket. Men er det alt sammen? Hmm … er der ikke en betalt funktion kaldet “tilbagespoling”, der giver dig mulighed for at gå tilbage og stryge igen? Hvad skal vi gøre med dette?

Hvordan sikrer vi, at vi har medtaget alle ændringer? I så fald hvordan programmerer vi det?

Hvad er en tilstandsmaskine?

En metode til modellering af en enheds adfærd med en etableret livscyklus

Når vi bygger statsorienterede systemer, er tilstandsmaskiner nyttige til at hjælpe os med bedre at bestemme de komplicerede overgange og udløsere.

Endelige tilstandsmaskiner (FSM)

Det er en abstrakt maskine , der kan være i nøjagtigt et af et endeligt antal stater til enhver tid. FSM kan skifte fra en tilstand til en anden som svar på nogle input ; ændringen fra en tilstand til en anden kaldes en overgang . En FSM defineres af en liste over dens tilstande, dens oprindelige tilstand og de input, der udløser hver overgang.

Lad os fortsætte med vores datingapp-eksempel.Hvis vi opretter et tilstandsdiagram fra logikken bag et match , det ser lidt sådan ud:

* Forskellige metoder kan tages af forskellige involverede brugere: enten af ​​de matchede kunder eller datingappen (platformbygger / firma).

Det har et endeligt antal tilstande, der modellerer al adfærd i en kamps livscyklus. For at bygge en statsmaskine er vi bare nødt til at følge linjerne og se, hvordan enheden reagerer på forskellige adfærd.

Hvorfor skal jeg bruge en statsmaskine?

Okay nu ved jeg det tilstandsdiagrammet er virkelig nyttigt, men hvorfor skal jeg stadig bruge en tilstandsmaskine, når jeg skriver min kode?

Lad os fra det samme eksempel se på en forenklet kode før og efter er en statsmaskine involveret.

Før du bruger en tilstandsmaskine

Du kan få øje på en masse if/else udsagn.

Efter brug af en tilstandsmaskine

Lad ChangeState -metoden tage sig af tilstandsovergange ved hjælp af StateTransition -typen. Alle andre metoder kan nu fokusere på logikken i håndtering af matchet.

Hvad mere kan jeg gøre?

Bare for at nævne nogle få:

  • For nu antager vi, at “Rewind” -metoderne er gode nok til, at frontend-grænseflader kan ringe. En mere delikat måde at håndtere metoder på bør være at kontrollere, om kampen er optaget – og hvis det er tilfældet eller ikke lide – og derefter beslutte, hvilken kommando der skal bruges. I stedet for at lade brugergrænsefladen dømme (og risikere at være forkert), foreslås det mere, at vi håndterer det i klassen MatchEntity.
  • Hvis staten overgår Bliv for kompliceret, prøv at bruge en matrix med aksen for aktuelle stater og kommandoer. Dataene i matricen kan være de opdaterede tilstande. På denne måde bliver koden mere læselig.

Oversigt

Så hvorfor bruge en statsmaskine? Fordi man overvejer de statsændrende begivenheder (også kendt som en enheds vigtige opførsel), modellerer det bedre et system. For det meste kan alt andet løses med grundlæggende CRUD-metoder. Det gør også din kode mere læsbar og vedligeholdelig.

Når det kommer til at opbygge APIer, skal du ikke designe dem kun baseret på de anmodninger, produktadministratorer fremsætter. Design APIer (mindst minimum APIer) til din enhed med den kritiske adfærd og overgange – tilstande – i tankerne.

Reference

Richard Clayton – Brug statsmaskiner!

Endelige statsmaskiner (FSM, eller i forbindelse med dette indlæg, simpelthen “statsmaskiner”) er en metode til modellering af …

rclayton. silvrback.com

Finite-state machine

En finite-state machine (FSM) eller finite-state automaton (FSA, flertal: automata), endelig automaton eller simpelthen en tilstand …

da.wikipedia.org

Eksempel på enkel tilstandsmaskine i C #?

Jeg har lige bidraget med dette: https://code.google.com/p/ysharp/source/browse/#svn\%2Ftrunk\%2FStateMachinesPoC Her er en …

stackoverflow.com

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *