Staats- en toestandsmachines

Staatsmachines gebruiken om gedragingen en toestandsovergangen te definiëren – uitgelegd met dating-apps

(20 dec.2020)

Wat is een staat?

In informatietechnologie en informatica wordt een systeem beschreven als stateful als het is ontworpen om voorgaande gebeurtenissen of gebruikersinteracties te onthouden; de onthouden informatie wordt de status van het systeem genoemd .

De statussen van een systeem worden vaak bepaald door de aggregatie van gedragingen die de gebruikers doen. Staten zijn belangrijk omdat het een meer systematische manier is om te controleren of bepaald gedrag in bepaalde staten geldig is of niet.

Toestanden van een verkeerslicht

Beschouw een verkeerslicht als voorbeeld. Als het groen is geweest, verwachten bestuurders en passagiers geel te zien – niet rood – hierna. Als het geel wordt, verwachten ze rood en niet groen. Dus de toestanden hier zijn eenvoudig:

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

Volg de pijlen (ook bekend als de toegestane overgangen van toestanden) en je stoplicht is klaar om te gaan.

Status van de overeenkomsten in dating-apps

Laten we nu een dating-app als een ingewikkelder voorbeeld nemen. Stel je voor dat we een app bouwen waarmee mensen online kunnen matchen. Laten we zeggen dat we de algoritmen klaar hebben en we moeten beginnen met het schrijven van de logica achter de overeenkomsten die verschijnen in de apps van onze gebruikers.

Laten we een entiteit definiëren match eerst om de match tussen twee mensen weer te geven. Er zijn verschillende staten voor een match waarmee we rekening moeten houden als we deze zouden ontwerpen.

We hebben de staten nodig zodat mensen geen onverwacht gedrag zien, zoals een willekeurige, niet-overeenkomende persoon die opduikt op het scherm en zeg hallo.

Foto door Yogas-ontwerp op Unsplash

Mijn denkproces:

  1. Allereerst moet een match gemaakt zijn , wat betekent dat een bepaalde set algoritmen om twee mensen te selecteren die klaar zijn voor een wedstrijd. Natuurlijk moeten de algoritmen er van tevoren voor zorgen dat ze allebei in aanmerking komen voor een wedstrijd, passen bij elkaars voorkeuren, niet verbannen, enz.
  2. Deze wedstrijd kan dan in afwachting van (wachten op swipe van iemand anders) of mislukt afhankelijk van de actie van de eerste gebruiker. Als de gebruiker naar rechts veegt (wat ik vind je leuk betekent in termen van datingapps), springt de status van aangemaakt naar in behandeling . Als de gebruiker naar links veegt (wat betekent Ik vind je niet leuk), verandert de status in mislukt .
  3. Als beide mensen elkaar leuk vinden, gaat het van in afwachting van naar matched .
  4. Een van de personen in een match kan ook een match “unmatchen”, waardoor de staat op ongeëvenaard .
  5. Ik denk dat ik alle toestandsveranderingen heb behandeld. Maar zijn dit allemaal? Hmm … is er niet een betaalde functie genaamd terugspoelen waarmee je terug kunt gaan en opnieuw kunt vegen? Wat moeten we hiermee doen?

Hoe zorgen we ervoor dat we alle wijzigingen hebben opgenomen? Zo ja, hoe programmeren we het?

Wat is een toestandsmachine?

Een methodologie voor het modelleren van het gedrag van een entiteit met een gevestigde levenscyclus

Bij het bouwen van toestandsgeoriënteerde systemen zijn toestandsmachines nuttig om ons te helpen de gecompliceerde overgangen en triggers beter te bepalen.

Finite state machines (FSM)

Het is een abstracte machine die zich in exact een van een eindig aantal staten op elk gewenst moment. De FSM kan van de ene staat naar de andere veranderen als reactie op sommige invoer ; de verandering van de ene staat naar de andere wordt een overgang genoemd. Een FSM wordt gedefinieerd door een lijst met de statussen, de begintoestand en de invoer die elke overgang activeert.

Laten we doorgaan met ons voorbeeld van een datingapp.Als we een toestandsdiagram maken op basis van de logica achter een overeenkomst , het ziet er ongeveer zo uit:

* Verschillende betrokken gebruikers kunnen verschillende methoden toepassen: ofwel de gematchte klanten, ofwel de datingapp (platformbouwer / bedrijf).

Het heeft een eindig aantal toestanden, waarbij alle gedragingen binnen de levenscyclus van een wedstrijd worden gemodelleerd. Om een ​​toestandsmachine te bouwen, hoeven we alleen maar de regels te volgen en te zien hoe de entiteit reageert op verschillende gedragingen.

Waarom zou ik een toestandsmachine gebruiken?

Oké, nu weet ik dat het toestandsdiagram is echt nuttig, maar toch, waarom zou ik een toestandsmachine gebruiken als ik mijn code schrijf?

Laten we aan de hand van hetzelfde voorbeeld eens kijken naar een vereenvoudigde code voor en na is er een toestandsmachine bij betrokken.

Voordat u een toestandsmachine gebruikt

Je kunt veel if/else statements.

Na gebruik van een state machine

Laat de ChangeState methode zorgen voor toestandsovergangen met het StateTransition type. Alle andere methoden kunnen zich nu concentreren op de logica van het afhandelen van de match.

Wat kan ik nog meer doen?

Om er maar een paar te noemen:

  • Voorlopig gaan we ervan uit dat de “Rewind” -methoden goed genoeg zijn om frontend-interfaces aan te roepen. Een meer delicate manier om met methoden om te gaan, zou moeten zijn om te controleren of de overeenkomst is opgenomen – en zo ja, is het leuk of niet leuk – en vervolgens te beslissen welk commando je wilt gebruiken. In plaats van de gebruikersinterface te laten oordelen (en het risico te lopen dat het verkeerd is), wordt meer aangeraden om het af te handelen in de klasse MatchEntity.
  • Als de staat verandert wordt te ingewikkeld, probeer een matrix te gebruiken met assen van huidige toestanden en opdrachten. De gegevens in de matrix kunnen de bijgewerkte staten zijn. Op deze manier wordt de code beter leesbaar.

Samenvatting

Dus waarom zou je een toestandsmachine gebruiken? Omdat het, gezien de toestandsveranderende gebeurtenissen (ook bekend als het belangrijke gedrag van een entiteit), een systeem beter modelleert. Bijna al het andere kan worden opgelost met basis CRUD-methoden. Het maakt uw code ook beter leesbaar en onderhoudbaar.

Als het gaat om het bouwen van APIs, ontwerp ze dan niet alleen op basis van de verzoeken die productmanagers doen. Ontwerp APIs (in ieder geval minimum APIs) voor uw entiteit met de kritieke gedragingen en overgangen (statussen) in gedachten.

Referentie

Richard Clayton – Gebruik State Machines!

Finite State Machines (FSM, of in de context van dit bericht, simpelweg “State Machines”) zijn een methodologie voor het modelleren van de …

rclayton. silvrback.com

Eindige-toestandsmachine

Een eindige-toestandsmachine (FSM) of eindige-toestandsautomaat (FSA, meervoud: automaten), eindige automaat, of gewoon een staat …

en.wikipedia.org

Eenvoudig toestandsmachine-voorbeeld in C #?

Ik heb zojuist dit bijgedragen: https://code.google.com/p/ysharp/source/browse/#svn\%2Ftrunk\%2FStateMachinesPoC Hier is er een …

stackoverflow.com

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *