Stati e macchine a stati

Pubblicato il

Utilizzo di macchine a stati per definire comportamenti e transizioni di stato – spiegato con app di appuntamenti

(20 dicembre 2020)

Cosè uno stato?

Nella tecnologia e nellinformatica, un sistema è descritto come stateful se è progettato per ricordare eventi precedenti o interazioni dellutente; le informazioni memorizzate sono chiamate state del sistema .

Gli stati di un sistema sono spesso definiti dallaggregazione dei comportamenti che fanno i suoi utenti. Gli stati sono importanti perché è un modo più sistematico per verificare se determinati comportamenti in determinati stati sono validi o meno.

Stati di un semaforo

Considera un semaforo come esempio. Se è stato verde, guidatori e passeggeri si aspettano di vedere il giallo, non il rosso, dopo. Quando diventa giallo, si aspettano il rosso e non il verde. Quindi gli stati qui sono semplici:

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

Segui le frecce (ovvero le transizioni di stato consentite) e il tuo semaforo è pronto.

Stati delle partite nelle app di appuntamenti

Ora prendiamo unapp di appuntamenti come un esempio più complicato, immagina di creare unapp per le persone da “abbinare” online. Diciamo che abbiamo gli algoritmi pronti e dobbiamo iniziare a scrivere le logiche dietro le corrispondenze che compaiono sulle app dei nostri utenti.

Definiamo unentità match prima per rappresentare la corrispondenza tra due persone. Ci sono diversi stati per una corrispondenza che dovremmo prendere in considerazione se dovessimo progettarla.

Abbiamo bisogno degli stati in modo che le persone non vedano comportamenti inaspettati come una persona casuale e non corrispondente che si presenta sullo schermo salutando.

Foto di Yogas Design su Unsplash

Il mio processo di pensiero:

  1. Prima di tutto, una corrispondenza deve essere creata , il che significa che un certo insieme di algoritmi ha per selezionare due persone pronte per una partita. Ovviamente gli algoritmi devono assicurarsi in anticipo che siano entrambi pronti per una partita, che si adattino alle reciproche preferenze, non banditi, ecc.
  2. Quindi, questa partita potrebbe diventare in attesa (in attesa dello scorrimento di unaltra persona) o non riuscito a seconda dellazione del primo utente. Se lutente fa scorrere il dito verso destra (che significa “Mi piaci” in termini di app di appuntamenti), lo stato passa da created a in attesa . Se lutente fa scorrere il dito verso sinistra (che significa “Non mi piaci”), lo stato cambia in non riuscito .
  3. Quindi, se entrambe le persone si piacciono, va da in attesa a corrisponde a .
  4. Ciascuna delle persone in una corrispondenza potrebbe anche “annullare la corrispondenza”, portando lo stato a senza corrispondenza .
  5. Penso di aver coperto tutti i cambiamenti di stato. Ma sono tutti questi? Hmm … non esiste una funzione a pagamento chiamata “riavvolgimento” che ti consente di tornare indietro e scorrere di nuovo? Cosa dovremmo fare con questo?

Come possiamo assicurarci di aver incluso tutte le modifiche? Se sì, come la programmiamo?

Cosè una macchina a stati?

Una metodologia per modellare il comportamento di unentità con un ciclo di vita stabilito

Quando si costruiscono sistemi orientati allo stato, le macchine a stati sono utili per aiutarci a determinare meglio le transizioni complicate e i trigger.

Macchine a stati finiti (FSM)

It è una macchina astratta che può trovarsi esattamente in uno di un numero finito di stati in qualsiasi momento. La FSM può cambiare da uno stato allaltro in risposta ad alcuni input ; il passaggio da uno stato allaltro è chiamato transizione . Un FSM è definito da un elenco dei suoi stati, del suo stato iniziale e degli input che attivano ogni transizione.

Continuiamo con il nostro esempio di app per appuntamenti.Se creiamo un diagramma di stato dalle logiche alla base di una corrispondenza , ha un aspetto simile a questo:

* Diversi metodi possono essere adottati da diversi utenti coinvolti: i clienti abbinati o lapp di appuntamenti (costruttore di piattaforme / azienda).

Ha un numero finito di stati, modellando tutti i comportamenti allinterno del ciclo di vita di una partita. Per costruire una macchina a stati, dobbiamo solo seguire le linee e vedere come lentità risponde ai vari comportamenti.

Perché dovrei usare una macchina a stati?

Ok ora lo so il diagramma di stato è davvero utile, ma comunque perché dovrei usare una macchina a stati quando scrivo il mio codice?

Dallo stesso esempio, diamo unocchiata ad un po di codice semplificato prima e dopo coinvolta una macchina a stati.

Prima di utilizzare una macchina a stati

Puoi individuare molti if/else.

Dopo aver utilizzato una macchina a stati

Lascia che il metodo ChangeState si occupi delle transizioni di stato utilizzando il tipo StateTransition. Tutti gli altri metodi possono ora concentrarsi sulla logica di gestione della corrispondenza.

Cosaltro posso fare?

Solo per citarne alcuni:

  • Per ora assumiamo che i metodi “Rewind” siano abbastanza buoni per essere richiamati dalle interfacce di frontend. Un modo più delicato di trattare i metodi dovrebbe essere quello di controllare se la corrispondenza è registrata – e in tal caso, è piaciuta o meno – e quindi decidere quale comando usare. Invece di lasciare che sia linterfaccia utente a giudicare (e rischiare che sia sbagliato), è più consigliabile gestirla nella classe MatchEntity.
  • Se lo stato passa diventa troppo complicato, prova a usare una matrice con lasse degli stati e dei comandi correnti. I dati nella matrice possono essere gli stati aggiornati. In questo modo il codice diventa più leggibile.

Riepilogo

Allora perché usare una macchina a stati? Perché considerando gli eventi che cambiano lo stato (ovvero i comportamenti importanti di unentità), modella meglio un sistema. Per lo più tutto il resto può essere risolto con metodi CRUD di base. Inoltre, rende il tuo codice più leggibile e gestibile.

Quando si tratta di creare API, non progettarle solo in base alle richieste che fanno i product manager. Progetta API (almeno API minime) per la tua entità tenendo conto dei comportamenti critici e delle transizioni – stati -.

Riferimento

Richard Clayton – Usa macchine a stati!

Le macchine a stati finiti (FSM, o nel contesto di questo post, semplicemente “Macchine a stati”) sono una metodologia per modellare il…

rclayton. silvrback.com

Macchina a stati finiti

Una macchina a stati finiti (FSM) o automa a stati finiti (FSA, plurale: automi), automa finito o semplicemente uno stato…

en.wikipedia.org

Semplice esempio di macchina a stati in C #?

Ho appena contribuito a questo: https://code.google.com/p/ysharp/source/browse/#svn\%2Ftrunk\%2FStateMachinesPoC Ecco uno …

stackoverflow.com

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *