2015-07-01 26 views
14

Aggiornamento:modello di Stato e guardia di

modello di Stato potrebbero un modo sbagliato per risolvere questo problema. Quindi, qualsiasi altro modello è benvenuto. Fondamentalmente sto cercando un modo per avere condizioni di protezione per ogni stato pur avendo un codice pulito e gestibile. In che modo i sistemi di routing lato front-end come, emberjs, ui-router e react-router implementano guard conditions per evitare di entrare in uno stato specifico se la condizione non viene soddisfatta?


Voglio implementare una macchina a stati finiti usando State Pattern ma non riesco a capirlo. In breve è come:

If error -> error state 
If A && B && C -> second state 
If only A -> first state 

In qualsiasi stato, in caso di errore, si passa allo stato di errore. input (eventi) A, B e C potrebbero arrivare a qualsiasi ordine ma se passano tutti andiamo al 2 ° stato. Se si applica solo l'input A, passiamo al 1 ° stato.

Il seguente diagramma di stato è tratto dal libro di lingue specifiche di Martin Fowler.

DSL

Nella descrizione che dice:

signorina Grant, ha un vano segreto nella sua camera da letto che viene normalmente bloccata e nascosto. Per aprirlo, deve chiudere lo sportello , quindi aprire il secondo cassetto nel suo petto e accendere la luce del comodino su nell'ordine. Una volta che questi sono fatti, il pannello segreto è sbloccato per lei da aprire.

sottolineo, che turning light e opening 2nd drawer può accadere in qualsiasi ordine . Idem come A, B e C.

Sulla base di commento @SQLPolice e il libro, ho tratto questa:

enter image description here

Ma il problema è, potrei avere (A & & B & & C & & D & & D & & E). In tal caso sarà complicato avere tutti gli stati intermedi di combinazione.

+0

si dispone di uno stato di partenza, presumo? –

+0

Cosa stai disegnando in ... UML/Flow ...? –

+0

@DavidBarker, nessuno dei due. Ho solo bisogno di qualcosa di visivo per capire come implementare. – norbertpy

risposta

3

Una bozza rapida simile a questa:

enter image description here

+0

Grazie, ma come evitare di scrivere' if (A && B && C) '? Il motivo è che ho già un sacco di se e con varie condizioni. L'unica ragione per scegliere una macchina a stati era evitare di farlo. – norbertpy

+0

Ah, capisco. Cosa c'è dietro - è un compito a scuola, o cosa vuoi realizzare? –

+0

Non è un compito a casa. Sono più vecchio di questa cosa. È un vero problema che abbiamo e stiamo cercando di semplificare le cose. – norbertpy

4

È possibile utilizzare una qualche forma di analisi lessicale per questo. Mi avvicinerei limitando la possibilità di transizione da uno stato a meno che non vengano soddisfatti i vincoli posti sul bordo tra i due stati. Recentemente ho scritto un FSM in PHP per il framework Laravel che ha un esempio come questo in cui tutti i vincoli devono essere veri prima che si verifichi una transizione. Utilizza pseudo stati o handle all'interno di uno stato per attivare una bandiera che indica che un processo è stato completato. Solo quando tutti i flag sono impostati su true, è possibile la transizione di stato.

Sample lexical state analysis

Usando il pacchetto FSM che ho scritto per laravel, un esempio di configurazione FSM would look something like this.

Ogni stato (su onEnter) o tramite uno stato pseudo imposta il flag di vincolo su FSM OR State su true.

Ciò attiverà anche un checkReady() che attiverà la transizione o manterrà lo stato corrente in base ai flag dei vincoli.

L'aggiunta di nuovi vincoli è un caso di aggiungerli a una matrice di vincoli all'interno dello stato o del contenitore FSM contenente e creare un metodo per consentire la rimozione del vincolo quando viene eseguita un'attività.

Quando si esaminano più stati, con ciascuno stato che costituisce un requisito per i vincoli. A sample state would look something like this.

Quando si guarda un singolo stato con pseudo stati/gestori. The state would look something like this, where it's logic is contained.

1

Una macchina astrazione stato è composto da:

  1. Uniti
  2. Eventi o ingressi
  3. Transitions
  4. azioni

Una dichiarazione come un & & b & & c è effettivamente un evento o input ... un'etichetta per una transizione. Quindi deve essere mappato su un evento se si sta andando ad adattarsi all'astrazione della macchina di stato. Devi scrivere il codice per fare quella mappatura.

Se la macchina di stato è generalmente guidata da condizioni come queste, è necessario agganciare eventi in cui cambiano i colori e controllarli periodicamente sul timer. Ogni volta che cambiano, il tuo codice si associa a un evento e lo inserisce in qualunque codice avanzi la macchina a stati.