2013-02-11 23 views
12

最近、私はJavaScriptでFinite State Machineの研究を始めました。さらに実装が容易なfound a libraryです。私は、ステートマシンがオブジェクトの「状態」を追跡したり変更したりするために使用されているという考えを抱いていると思いますが(例えば、「準備完了」、「完了」、「非アクティブ」など)、私は私は彼らの実用的な意味を完全に理解していると思う。誰かが次のことを明確にすることによって助けてくださいでした:有限状態マシンとは何ですか?それは何のために使用されていますか?

  • 正確は、有限状態機械である[またはそれだけで、ステートマシンと呼ばれるもの?私は両方の方法に言及したと聞いたことがある?]
  • 有限状態マシン(JavaScript)の実用的な用途は何ですか?
  • 私はではありません有限状態マシンを使用したいですか?
  • どのような本、記事、チュートリアルなどで、有限状態マシン(JavaScript)をより詳しく見ていますか?
+0

ウィキペディア? Google? Btwは、JavaScriptが単なる**スクリプト言語**であることに注意してください(つまり、コアAPIのみを定義しています)。したがって、実際の使用は**環境**(Webブラウザ、Webサーバ、Win8)に依存し、言語そのものには依存しません。 –

+2

私は実際にこれをGoogleでした。だから私は、ステートマシンがアプリケーション内の「状態」を追跡するために使用されているという事実を把握したと言いましたが、実際の意味を把握するのは難しく、誰かが明確にできることを望んでいます。 –

+0

多段階フォームは多分ですか? –

答えて

9

A有限状態マシンは抽象的な概念です。したがって、ステートマシンの概念は、特定の言語に直交しています。 look at wikipediaの場合、「コンピュータプログラムと順次論理回路の両方を設計するために使用される計算の数学的モデルです」と言います。

これは、通常、FSMは、コンピュータ科学者が「xyzはまったく計算できますか?」のような規律で質問に対処するために使用される数学的概念として使用されることを意味します。

あなたの質問とあなたのリンクに基づいて、あなたはステートダイアグラム(またはステートチャート)について異なる質問をしていると思います。状態図を作成するときは、プログラムを一連の状態で分割し、それらの状態で発生する可能性のあるイベントを分割します。たとえば、プログラムが「EditingForm」状態にあり、イベント「doSave」を受け取り、「保存」状態に移行し、「保存完了」イベントを受信し、「表示中」状態に戻ります。

それがこの順番に少ないバグにつながる。プログラマは概念的に正しく実装する場合、クリーンでより組織コードにつながるとき、どうするか、物事整理することができますので、この抽象化は非常に便利である。状態図、に応じて、例えば、 "Viewing"には "save"イベントが定義されていない可能性があります。したがって、プログラムが "Viewing"状態にある場合、Saveは無意味ですこれは「編集中」の状態でのみ発生するはずです。

リンク先のフレームワークの概要を見ると、状態の入力、状態の終了、アクションの実行などに使用できるハンドラが多数あることに気付くでしょう。これにより、実際に対応することができます状態/行動にたとえば、「編集中」状態に入ると、フォームをユーザーに提示して「保存」ボタンを使用可能にすることができます。 「保存」状態になると、ボタンを無効にして保存要求を発することがあります。 「SaveComplete」イベントを受け取ると、「表示中」状態に移行し、フォームを削除して、別のものを表示する可能性があります。

+0

ステートマシンは "ステート"を管理します。アプリケーションがページを表示しているときに、JavaScriptを使用して発生したイベントを処理するか無視しますか?これはコントローラ(MVC)やイベントバスのように聞こえるでしょう。 –

+1

非常に似ています。私が使用した実装では、ステートチャート上でイベントを呼び出すことによってアプリケーションを移動するので、実際には追跡されません。プログラム制御のためのエントリポイントです。 – hvgotcodes

+0

Flux、特にReduxを使用してクライアント側アプリケーションで単方向データフローを調べて使用してきたので、私はReduxが決定的な有限状態機械を使用してUI状態を処理するのを本当に助けてくれることを理解し始めました。 Reduxでは、発生したイベントはアクションとして表され、純粋な関数であるレデューサー関数は遷移関数のようなもので、発生したイベント/アクションから現在の状態と入力を受け取り、新しい状態を作成し、UIを次の状態。 – lastmjs

2

これは、言語パーサのスキャナとレクサーでよく使用されます。特定の構文規則に基づいて、ソースコードの各トークンを作成し、分析します。

基本的に、現在の状態をチェックして、次の文字やトークンが意味を成しているかどうか、どのように整理するかを確認します。

+0

ああ、素晴らしい例です。 –

10

有限状態マシンとは何ですか?

これは、イベントとそれらの間の移行の副作用を宣言する方法です。

有限状態マシンの実用的な用途は何ですか?

の代わりに、このようなコード:

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 
} 

あなたはどの状態で何が起こるかを定義、わずか数の状態を維持し、機能にあなたのイベントを破ります。

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

}以下回帰、より保守性を意味した状態やイベントの分離につながる

いつ有限状態マシンを使用したくないですか?

この時点で回答します。あなたがただ一つの状態を持っているならば、状態機械を気にしないでください。

どのような書籍、記事、チュートリアルなどで、有限状態マシン(JavaScript)をより詳細に見ることができますか?

学問分野では、jqueryプラグインのソースを読むことをおすすめします。たとえば、_mouseMoveと_mouseUpの下にあるのはthe jquery ui sourceです。

関連する問題