Tilstander og tilstandsmaskiner

Bruk av tilstandsmaskiner til å definere atferd og tilstandsoverganger – forklart med datingapper

(20. des 2020)

Hva er en tilstand?

I informasjonsteknologi og informatikk blir et system beskrevet som stateful hvis den er designet for å huske tidligere hendelser eller brukerinteraksjoner; den huskede informasjonen kalles tilstand til systemet .

Et systems tilstander defineres ofte av aggregeringen av atferd brukerne gjør. Stater er viktige fordi det er en mer systematisk måte å verifisere om visse atferd i visse stater er gyldige eller ikke.

Tilstander til et trafikklys

Tenk på et trafikklys som et eksempel. Hvis det har vært grønt, forventer sjåfører og passasjerer å se gult – ikke rødt – neste. Når det blir gult, forventer de rødt og ikke grønt. Så tilstandene her er enkle:

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

Følg pilene (også kjent som tillatte overganger av stater), og trafikklyset ditt er i orden.

Status i kampene i datingapper

La oss ta en dating-app som et mer komplisert eksempel, tenk at vi bygger en app for folk å «matche» online. La oss si at vi har algoritmene klare, og vi må begynne å skrive logikken bak kampene som dukker opp på brukernes apper.

La oss definere en enhet samsvar først for å representere kampen mellom to personer. Det er flere stater for en kamp vi bør ta i betraktning hvis vi skulle designe den.

Vi trenger statene slik at folk ikke ser uventet oppførsel som en tilfeldig, ikke-samsvarende person som dukker opp på skjermen og sier hei.

Foto av Yogas Design Unsplash

Min tankeprosess:

  1. Først og fremst må en kamp være opprettet , noe som betyr at et bestemt sett med algoritmer har for å velge to personer som er klare for en kamp. Selvfølgelig må algoritmene på forhånd sørge for at de begge er oppe til en kamp, ​​passer hverandres preferanser, ikke utestengt osv.
  2. Da kan denne kampen bli enten venter (venter på en annen persons sveip) eller mislyktes avhengig av den første brukerens handling. Hvis brukeren sveiper til høyre (som betyr «Jeg liker deg» i forhold til datingapper), hopper staten fra opprettet til venter . Hvis brukeren sveiper til venstre (som betyr «Jeg liker deg ikke»), endres tilstanden til mislyktes .
  3. Hvis begge menneskene liker hverandre, går det fra i påvente av til matchet .
  4. Enten av personen i en kamp kan også «unmatch» en kamp, ​​og bringe staten til umatchet .
  5. Jeg tror jeg fikk dekket alle endringene av stater. Men er alt dette? Hmm … er det ikke en betalt funksjon som kalles «tilbakespoling» som lar deg gå tilbake og sveipe igjen? Hva skal vi gjøre med dette?

Hvordan sikrer vi at vi har tatt med alle endringene? I så fall hvordan programmerer vi det?

Hva er en tilstandsmaskin?

En metodikk for å modellere oppførselen til en enhet med en etablert livssyklus

Når vi bygger tilstandsorienterte systemer, er tilstandsmaskiner nyttige for å hjelpe oss med å bedre bestemme de kompliserte overgangene og utløserne.

Endelige tilstandsmaskiner (FSM)

Det er en abstrakt maskin som kan være i nøyaktig ett av et endelig antall stater til enhver tid. FSM kan skifte fra en tilstand til en annen som svar på noen innganger ; endringen fra en tilstand til en annen kalles en overgang . En FSM er definert av en liste over tilstandene, den opprinnelige tilstanden og inngangene som utløser hver overgang.

La oss fortsette med vårt datingapp-eksempel.Hvis vi lager et tilstandsdiagram fra logikken bak et treff , det ser noe slik ut:

* Forskjellige metoder kan tas av forskjellige involverte brukere: enten av de matchede kundene eller datingappen (plattformbygger / selskap).

Den har et endelig antall stater, som modellerer all atferd i kampens livssyklus. For å bygge en statsmaskin, må vi bare følge linjene og se hvordan enheten reagerer på ulike atferd.

Hvorfor skal jeg bruke en statsmaskin?

Ok, nå vet jeg at tilstandsdiagrammet er veldig nyttig, men likevel hvorfor skal jeg bruke en tilstandsmaskin når jeg skriver koden min?

Fra det samme eksemplet, la oss ta en titt på noen forenklet kode før og etter er en statsmaskin involvert.

Før du bruker en tilstandsmaskin

Du kan få øye på mye if/else utsagn.

Etter bruk av en tilstandsmaskin

La ChangeState -metoden ta seg av tilstandsoverganger ved hjelp av StateTransition -typen. Alle andre metoder kan nå fokusere på logikkene for å håndtere kampen.

Hva mer kan jeg gjøre?

Bare for å nevne noen:

  • For nå antar vi at «Rewind» -metodene er gode nok til at frontend-grensesnitt kan ringes. En mer delikat måte å håndtere metoder på, bør være å sjekke om kampen er spilt inn – og i så fall er det likt eller mislikt – og deretter bestemme hvilken kommando du vil bruke. I stedet for å la brukergrensesnittet dømme (og risikere at det blir feil), foreslås det mer at vi håndterer det i klassen MatchEntity.
  • Hvis staten overgår bli for komplisert, prøv å bruke en matrise med aksen til gjeldende tilstander og kommandoer. Dataene i matrisen kan være de oppdaterte tilstandene. På denne måten blir koden mer lesbar.

Sammendrag

Så hvorfor bruke en statsmaskin? Fordi vurderer de tilstandsendrende hendelsene (også kjent som en enhets viktige oppførsel), modellerer det bedre et system. For det meste kan alt annet løses med grunnleggende CRUD-metoder. Det gjør også koden din mer lesbar og vedlikeholdbar.

Når det gjelder å bygge API-er, må du ikke utforme dem bare basert på forespørslene produktansvarlige kommer med. Design APIer (minst minimum APIer) for enheten din med kritisk atferd og overganger – tilstander – i tankene.

Referanse

Richard Clayton – Bruk statsmaskiner!

Endelige tilstandsmaskiner (FSM, eller i sammenheng med dette innlegget, bare «State Machines») er en metodikk for modellering av …

rclayton. silvrback.com

Finite-state machine

En finite-state machine (FSM) eller finite-state automaton (FSA, flertall: automata), endelig automat, eller rett og slett en tilstand …

en.wikipedia.org

Eksempel på enkel tilstand i C #?

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

stackoverflow.com

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *