Mașini de stare și de stat

Utilizarea mașinilor de stare pentru a defini comportamente și tranziții de stare – explicat cu aplicațiile de întâlnire

(20 decembrie 2020)

Ce este o stare?

În tehnologia informației și informatică, un sistem este descris ca stateful dacă este conceput pentru a aminti evenimentele precedente sau interacțiunile utilizatorilor; informațiile amintite se numesc starea a sistemului .

Stările unui sistem sunt adesea definite de agregarea comportamentelor pe care le fac utilizatorii săi. Statele sunt importante, deoarece este un mod mai sistematic de a verifica dacă anumite comportamente din anumite stări sunt valabile sau nu.

Stările unui semafor

Luați în considerare un semafor ca exemplu. Dacă a fost verde, șoferii și pasagerii se așteaptă să vadă galben – nu roșu – în continuare. Când devine galben, se așteaptă la roșu și nu la verde. Deci, stările de aici sunt simple:

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

Urmați săgețile (cunoscute și tranzițiile permise ale stărilor) și semaforul dvs. este bine să meargă.

Stările meciurilor din aplicațiile de întâlniri

Acum, să luăm o aplicație de întâlniri ca un exemplu mai complicat, să ne imaginăm că construim o aplicație pentru ca oamenii să „se potrivească” online. Să presupunem că avem algoritmii gata și trebuie să începem să scriem logica din spatele meciurilor care apar în aplicațiile utilizatorilor noștri.

Să definim o entitate match mai întâi pentru a reprezenta meciul dintre două persoane. Există mai multe stări pentru o potrivire pe care ar trebui să o luăm în considerare dacă ar fi să o proiectăm.

Avem nevoie de stări, astfel încât oamenii să nu vadă comportamente neașteptate, cum ar fi o persoană aleatorie, care nu se potrivește, care apare pe ecran spunând salut.

Fotografie de Design Yogas pe Unsplash

Procesul meu de gândire:

  1. În primul rând, o potrivire trebuie să fie creată , adică un anumit set de algoritmi are pentru a selecta două persoane pregătite pentru un meci. Desigur, algoritmii trebuie să se asigure în prealabil că ambii sunt pregătiți pentru o potrivire, se potrivesc preferințelor reciproce, nu sunt interzise etc.
  2. Apoi, această potrivire ar putea deveni fie în așteptare (în așteptarea glisării unei alte persoane) sau eșuat în funcție de acțiunea primului utilizator. Dacă utilizatorul glisează spre dreapta (ceea ce înseamnă „îmi place de tine” în termenii aplicațiilor de întâlnire), starea sare de la creat la în așteptare . Dacă utilizatorul glisează la stânga (adică „Nu-mi place de tine”), starea se schimbă în nu a reușit .
  3. Apoi, dacă ambele persoane se plac, acesta va trece de la în așteptare la potrivită cu .
  4. Oricare dintre persoanele dintr-un meci ar putea, de asemenea, să „nu potrivească” o potrivire, aducând statul la de neegalat .
  5. Cred că am acoperit toate modificările stărilor. Dar sunt toate acestea? Hmm … nu există o funcție plătită numită „derulare înapoi” care să vă permită să reveniți și să glisați din nou? Ce ar trebui să facem cu acest lucru?

Cum ne asigurăm că am inclus toate modificările? Dacă da, cum o programăm?

Ce este o mașină de stare?

O metodologie pentru modelarea comportamentului unei entități cu un ciclu de viață stabilit

Atunci când construim sisteme orientate spre stare, mașinile de stare sunt utile pentru a ne ajuta să determinăm mai bine tranzițiile și declanșatoarele complicate.

Mașini cu stare finită (FSM)

este o mașină abstractă care poate fi exact una dintr-un număr finit de stări la un moment dat. FSM se poate schimba de la o stare la alta ca răspuns la unele intrări ; schimbarea de la o stare la alta se numește o tranziție . Un FSM este definit de o listă a stărilor sale, a stării sale inițiale și a intrărilor care declanșează fiecare tranziție.

Să continuăm cu exemplul aplicației noastre de întâlnire.Dacă creăm o diagramă de stare din logica din spatele unei potriviri id = „6d3c38c74f”> , arată oarecum așa:

* Pot fi luate diferite metode de către diferiți utilizatori implicați: fie din clienții potriviți, fie din aplicația de întâlniri (platforma de generare / companie).

Are un număr finit de stări, modelând toate comportamentele din ciclul de viață al unui meci. Pentru a construi o mașină de stare, trebuie doar să urmăm liniile și să vedem cum reacționează entitatea la diferite comportamente.

De ce ar trebui să folosesc o mașină de stare?

Bine acum știu că diagrama de stare este cu adevărat utilă, totuși totuși de ce ar trebui să folosesc o mașină de stare când îmi scriu codul?

Din același exemplu, să aruncăm o privire la un cod simplificat înainte de și după o mașină de stat implicată.

Înainte de a utiliza o mașină de stare

Puteți observa o mulțime de if/else instrucțiuni.

După utilizarea unei mașini de stări

Fie ca metoda ChangeState să aibă grijă de tranzițiile de stare folosind tipul StateTransition. Toate celelalte metode se pot concentra acum pe logica gestionării meciului.

Ce mai pot face?

Doar pentru a numi câteva:

  • Deocamdată presupunem că metodele „Rewind” sunt suficient de bune pentru ca interfețele frontend să poată apela. O modalitate mai delicată de a aborda metodele ar trebui să fie verificarea dacă meciul este înregistrat – și dacă da, îi place sau nu – și apoi decide ce comandă să utilizeze. În loc să lăsați interfața de utilizare să judece (și să riscați să fie greșită), este mai sugerat să o gestionăm în clasa MatchEntity.
  • Dacă statul trece devine prea complicat, încearcă să folosești o matrice cu axa stărilor și comenzilor curente. Datele din matrice pot fi stările actualizate. În acest fel, codul devine mai ușor de citit.

Rezumat

Deci, de ce să folosiți o mașină de stare? Deoarece considerând evenimentele care schimbă starea (alias comportamentele importante ale unei entități), modelează mai bine un sistem. În general, orice altceva poate fi rezolvat cu metode CRUD de bază. De asemenea, vă face codul mai ușor de citit și mai ușor de întreținut.

Când vine vorba de crearea API-urilor, nu le proiectați numai pe baza solicitărilor făcute de managerii de produs. Proiectați API-uri (cel puțin API-uri minime) pentru entitatea dvs. având în vedere comportamentele și tranzițiile critice – stări.

Referință

Richard Clayton – Utilizați mașinile de stat!

Mașinile de stat finit (FSM, sau în contextul acestui post, pur și simplu „Mașinile de stat”) sunt o metodologie pentru modelarea …

rclayton. silvrback.com

Mașină în stare finită

O mașină în stare finită (FSM) sau automat în stare finită (FSA, plural: automate), automat finit sau pur și simplu o stare …

en.wikipedia.org

Exemplu de mașină de stare simplă în C #?

Tocmai am contribuit: https://code.google.com/p/ysharp/source/browse/#svn\%2Ftrunk\%2FStateMachinesPoC Iată unul …

stackoverflow.com

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *