2013-02-11 4 views
12

Vor kurzem habe ich begonnen, einige Forschung in Finite State Machines in JavaScript und ich sogar found a library, die sie einfacher zu implementieren macht. Während ich denke, dass ich die Idee verstanden habe, dass eine Zustandsmaschine zum Verfolgen und Ändern des "Zustands" eines Objekts verwendet wird (z. B. "bereit", "vollständig", "inaktiv" usw.), tue ich das nicht Ich denke, ich verstehe die praktischen Auswirkungen von ihnen vollständig. Könnte jemand bitte durch eine Klarstellung der folgenden helfen:Was ist eine endliche Maschine und wofür wird sie verwendet?

  • Was genau ist eine Finite State Machine [oder ist es nur eine Zustandsmaschine genannt? Ich habe gehört, dass es in beide Richtungen gemeint ist]?
  • Was sind einige praktische Anwendungen für endliche Automaten (in JavaScript)?
  • Wann würde ich nicht wollen eine endliche Maschine verwenden?
  • Welche Bücher, Artikel, Tutorials etc. bieten einen tieferen Einblick in endliche Automaten (in JavaScript)?
+0

Wikipedia? Google? Übrigens, beachten Sie, dass JavaScript nur eine ** Scripting ** -Sprache ist (d. H. Es definiert nur die Kern-API). Die praktische Nutzung hängt also von der ** Umgebung ** (Web-Browser, Webserver, Win8) und nicht von der Sprache selbst ab. –

+2

Ich habe tatsächlich das Google. Deshalb habe ich erwähnt, dass ich die Tatsache begriffen habe, dass eine Zustandsmaschine verwendet wird, um "Zustand" in einer Anwendung zu verfolgen, aber es fällt mir schwer, die praktischen Implikationen zu verstehen und hoffe, dass jemand klären könnte. –

+0

Multi-Step-Formulare vielleicht? –

Antwort

9

Eine endliche Staatsmaschine ist ein abstraktes Konzept. Daher ist das Konzept der Zustandsmaschine orthogonal zu einer bestimmten Sprache. Wenn Sie look at wikipedia, sagt es "ist ein mathematisches Modell der Berechnung verwendet, um Computerprogramme und sequenzielle Logikschaltungen zu entwerfen".

Dies bedeutet, dass FSM normalerweise als mathematisches Konzept verwendet wird, das von Informatikern verwendet wird, um Fragen mit der Disziplin zu adressieren, wie "kann xyz überhaupt berechnet werden?"

Basierend auf Ihrer Frage und Ihrem Link, ich denke, Sie wollen nach State-Diagramm (oder Statechart) fragen, die anders ist. Wenn Sie ein Zustandsdiagramm erstellen, teilen Sie Ihr Programm in eine Reihe von Zuständen und die Ereignisse auf, die in diesen Zuständen auftreten können. Zum Beispiel Ihr Programm könnte im „EditingForm“ werden, erhalten das Ereignis „DoSave“, und gehen Sie dann in den „Speichern“ Zustand, erhalten das Ereignis ‚Save Complete“, und gehen Sie zurück in die ‚Anzeigen‘ -Zustand.

Diese Abstraktion ist unglaublich nützlich, weil es der Programmierer, was die Dinge zu konzeptionell organisieren kann passieren sollen, wenn, die, wenn sie richtig umgesetzt, um sauberen und organisierten Code führt. Dies wiederum zu weniger Fehlern führt. Ein Zustandsdiagramm, in Abhängigkeit von der Implementierung, kann unbeabsichtigte Effekte verhindern, indem nur die Ereignisse behandelt werden, die für einen Zustand definiert sind. Zum Beispiel hat das "Anzeigen" wahrscheinlich kein "Speichern" -Ereignis definiert, wenn also das Programm im "Betrachtungs" -Zustand ist, ist ein Speichern bedeutungslos Dies sollte nur im Zustand "Editing" geschehen.

Wenn Sie sich die Übersicht über den Rahmen suchen, auf die Sie verknüpfen, werden Sie es bemerken, eine Reihe von Handler sind Sie zur Eingabe Staaten anschließen, so dass Staaten verwenden können, Handlungen geschieht, etc. Dies Sie tatsächlich erlaubt, Dinge zu tun, die entsprechen zum Staat/zur Handlung. Wenn Sie beispielsweise den Status "Bearbeiten" eingeben, können Sie dem Benutzer das Formular präsentieren und die Schaltfläche zum Speichern aktivieren. Wenn Sie den Status "Speichern" eingeben, können Sie die Schaltfläche deaktivieren und eine Anforderung zum Speichern auslösen. Wenn Sie das Ereignis "SaveComplete" erhalten, wechseln Sie möglicherweise in den Status "Anzeigen", entfernen das Formular und zeigen etwas anderes an.

+0

So verwaltet die State Machine "Zustand" durch Tracking, was die Anwendung macht ("Anzeigen" einer Seite) und dann entweder reagiert oder ignoriert Ereignisse, die ausgelöst werden (in JavaScript-Begriffen)? Das klingt fast wie ein Controller (MVC) oder ein Event-Bus. –

+1

Es ist sehr ähnlich. In Implementierungen, die ich verwendet habe, bewegen Sie sich durch Ihre Anwendung, indem Sie Ereignisse auf dem Statechart aufrufen, so dass es nicht wirklich verfolgt - es ist der Einstiegspunkt für die Programmsteuerung. – hvgotcodes

+0

Da ich den unidirektionalen Datenfluss in clientseitigen Anwendungen mit Flux und insbesondere Redux untersucht und verwendet habe, habe ich angefangen zu verstehen, dass Redux Ihnen wirklich hilft, einen deterministischen endlichen Automaten für den UI-Status zu verwenden. In Redux werden erhöhte Ereignisse als Aktionen dargestellt, und Reduzierfunktionen, die reine Funktionen sind, sind wie Übergangsfunktionen, die den aktuellen Status und die Eingaben von den erhöhten Ereignissen/Aktionen übernehmen und einen neuen Zustand erstellen, wodurch Ihre Benutzeroberfläche auf die nächste übergeht Zustand. – lastmjs

2

Es wird oft im Scanner und Lexer eines Sprachparsers verwendet. Erstellen und Analysieren jedes Tokens im Quellcode basierend auf bestimmten Syntaxregeln.

Hier überprüfen Sie im Prinzip den aktuellen Status, um zu sehen, ob die nächsten Zeichen oder Tokens sinnvoll sind und wie sie organisiert werden sollten.

+0

Ah ja, tolles Beispiel. –

10

Was ist ein endlicher Automat?

Es ist eine Möglichkeit, Ereignisse und Nebenwirkungen des Übergangs zwischen ihnen zu deklarieren.

Was sind einige praktische Anwendungen von endlichen Automaten?

Statt Code wie folgt:

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 
} 

Sie halten nur wenige Staaten und Ihre Ereignisse in Funktionen brechen, zu definieren, was in welchem ​​Zustand geschieht.

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

}

, die auf die Trennung von Zuständen und Ereignissen führt, die weniger Regressionen und Wartbarkeit bedeutet.

Wann würde ich keine endliche Automaten verwenden wollen?

Antworten an dieser Stelle. Wenn Sie nur einen Zustand haben, kümmern Sie sich nicht um eine Zustandsmaschine.

Welche Bücher, Artikel, Tutorials etc. bieten einen tieferen Einblick in endliche Automaten (in JavaScript)?

Gegen die akademischen, empfehle ich, die Quelle für Jquery-Plugins zu lesen. Zum Beispiel schauen Sie unter _mouseMove und _mouseUp in the jquery ui source