2013-02-11 24 views
12

Recentemente, ho iniziato a fare delle ricerche sulle macchine a stati finiti in JavaScript e ho anche found a library che li rende più facili da implementare. Mentre penso di aver afferrato l'idea che una macchina a stati è usata per tracciare e cambiare lo "stato" di un oggetto (ad esempio, "pronto", "completo", "inattivo", ecc.), Non lo faccio penso di comprendere appieno le implicazioni pratiche di essi. Qualcuno potrebbe aiutare chiarendo quanto segue:Che cos'è una macchina a stati finiti e a cosa serve?

  • Cosa esattamente è una macchina a stati finiti [o è solo chiamato una macchina a stati? Ho sentito parlare di entrambi i modi]?
  • Quali sono alcuni usi pratici per macchine a stati finiti (in JavaScript)?
  • Quando dovrei non voler utilizzare una macchina a stati finiti?
  • Quali libri, articoli, esercitazioni, ecc. Offrono uno sguardo più approfondito sulle macchine a stati finiti (in JavaScript)?
+0

Wikipedia? Google? A proposito, nota come JavaScript sia semplicemente un ** linguaggio di scripting ** (cioè definisce solo l'API di base). Pertanto, gli usi pratici dipendono dall'ambiente ** ** (browser Web, server Web, Win8) e non dalla lingua stessa. –

+2

Ho fatto di fatto Google questo. Questo è il motivo per cui ho accennato al fatto che ho colto il fatto che una macchina a stati è utilizzata per tracciare lo "stato" in un'applicazione, ma sto attraversando un periodo difficile a cogliere le implicazioni pratiche di questo e spero che qualcuno possa chiarire. –

+0

Forme multi-passo forse? –

risposta

9

Una macchina a stati finiti è un concetto astratto. In quanto tale, il concetto di macchina a stati è ortogonale a qualsiasi linguaggio particolare. Se si look at wikipedia, si dice "è un modello matematico di calcolo utilizzato per progettare sia i programmi per computer che i circuiti logici sequenziali".

Ciò significa che FSM viene solitamente utilizzato come concetto matematico utilizzato dagli informatici per rispondere a domande con la disciplina, ad esempio "è possibile calcolare xyz?"

In base alla tua domanda e al tuo link, penso che intendi chiedere informazioni sullo State Diagram (o Statechart) che è diverso. Quando si crea un diagramma di stato, si divide il programma in una serie di stati e gli eventi che possono verificarsi in quegli stati. Ad esempio, il tuo programma potrebbe trovarsi nello stato "Modifica", ricevere l'evento "doSave", quindi andare nello stato "Salvataggio", ricevere l'evento "Salva completato" e tornare allo stato "Visualizzazione"

Questa astrazione è incredibilmente utile perché consente al programmatore di organizzare concettualmente cosa dovrebbe accadere quando, implementato correttamente, porta a un codice più pulito e più organizzato, che a sua volta porta a un numero inferiore di bug. implementazione, può prevenire effetti indesiderati gestendo solo gli eventi definiti per uno stato - Ad esempio, la "Visualizzazione" probabilmente non ha un evento di 'salvataggio' definito, quindi se il programma è nello stato di "Visualizzazione" qualsiasi Salva non ha significato , poiché ciò dovrebbe avvenire solo nello stato di "Modifica"

Se guardi la panoramica del framework a cui ti colleghi, noterai che ci sono un sacco di gestori che puoi usare per collegare gli stati entranti, lasciando gli stati, le azioni che accadono, ecc. Ciò ti consente di fare effettivamente le cose che corrispondono allo stato/azione. Ad esempio, entrando nello stato "Modifica" è possibile presentare il modulo all'utente e attivare il pulsante Salva. Entrando nello stato "Salvataggio" è possibile disabilitare il pulsante e attivare una richiesta di salvataggio. Alla ricezione dell'evento "SalvaComplete" è possibile passare allo stato "Visualizzazione", rimuovere il modulo e mostrare qualcos'altro.

+0

Quindi la macchina di stato gestisce lo "stato" tracciando ciò che il l'applicazione sta facendo ("visualizzando" una pagina) e poi agisce o ignora gli eventi che vengono generati (in termini JavaScript)? Sembra quasi un controller (MVC) o un event bus. –

+1

È molto simile. Nelle implementazioni che ho usato, ti sposti attraverso la tua applicazione invocando eventi sullo statechart, quindi non traccia realmente - è il punto di ingresso per il controllo del programma. – hvgotcodes

+0

Come ho studiato e utilizzato il flusso di dati unidirezionale nelle applicazioni lato client con Flux e in particolare Redux, ho iniziato a capire che Redux ti sta davvero aiutando a utilizzare la macchina a stati finiti deterministici per gestire lo stato dell'interfaccia utente. In Redux, gli eventi sollevati sono rappresentati come azioni e le funzioni di riduzione che sono funzioni pure sono come le funzioni di transizione, che prendono lo stato corrente e gli input dagli eventi/azioni sollevati e creano un nuovo stato, quindi la transizione dell'interfaccia utente alla successiva stato. – lastmjs

2

Viene spesso utilizzato nello scanner e nel lexer di un parser di lingua. Creazione e analisi di ciascun token nel codice sorgente in base a determinate regole di sintassi.

Fondamentalmente, qui si controlla lo stato corrente per vedere se i caratteri oi token successivi hanno senso e come dovrebbero essere organizzati.

+0

Ah sì, ottimo esempio. –

10

Che cos'è una macchina a stati finiti?

È un modo di dichiarare eventi ed effetti collaterali della transizione tra di essi.

Quali sono alcuni usi pratici delle macchine a stati finiti?

Invece di codice come questo:

function decide() 
{ 
    if(mouseButtonIsDown && mouseIsMoving && mouseCoordinatesAreWithin(0, 0, 100, 100) && thePixelIsRed) { 
    clearBuffers(); 
    startPlaying(); 
    cursorBecomeHand(); 
    } 
    else if(!mouseButtonIsDown && !mouseIsMoving && mouseCoordinatesAreWithin(0, 0, 100, 100) && thePixelIsRed) { 


    } 
    // more ifs 
} 

si mantiene solo pochi stati e rompere i vostri eventi in funzioni, definendo ciò che accade in quale stato.

function drag_started() { 
switch(your_state) { 
    case "within_box": 
    clearBuffers(); 
    cursorBecomeHand(); 
    your_state= "playing"; 
    startPlaying(); 
    break; 
} 

}

che porta alla separazione di stati ed eventi, che significa meno regressioni e più manutenibilità.

Quando non si desidera utilizzare una macchina a stati finiti?

Risposte a questo punto. Se hai solo uno stato, non preoccuparti di una macchina a stati.

Quali libri, articoli, esercitazioni, ecc. Offrono uno sguardo più approfondito sulle macchine a stati finiti (in JavaScript)?

Contro il mondo accademico, consiglio di leggere il codice sorgente per i plugin jquery. Ad esempio, guarda _mouseMove e _mouseUp in the jquery ui source