什么是有限状态机及其用途?

时间:2013-02-11 14:42:29

标签: javascript state-machine

最近,我开始对JavaScript中的有限状态机进行一些研究,我甚至found a library使它们更容易实现。虽然我认为我已经掌握了状态机用于跟踪和改变对象的“状态”(例如,“准备好”,“完成”,“不活动”等)的想法,但我不知道我认为我完全理解他们的实际意义。有人可以帮助澄清以下内容:

  • 究竟是一个有限状态机[或者它只是被称为状态机?我听说它提到了两种方式]?
  • 有限状态机(在JavaScript中)有哪些实际用途?
  • 我什么时候想要使用有限状态机?
  • 哪些书籍,文章,教程等能更深入地了解有限状态机(用JavaScript)?

3 个答案:

答案 0 :(得分:10)

有限状态机是一个抽象概念。因此,状态机的概念与任何特定语言正交。如果你look at wikipedia,它说“是用于设计计算机程序和顺序逻辑电路的计算的数学模型”。

这意味着FSM通常用作计算机科学家用来解决问题的数学概念,例如“可以根据xyz计算吗?”

根据您的问题和您的链接,我认为您的意思是询问状态图(或状态图),这是不同的。创建状态图时,您将在一系列状态中划分程序,以及在这些状态中可能发生的事件。例如,您的程序可能处于“EditingForm”状态,接收事件“doSave”,然后进入“保存”状态,接收事件“保存完成”,然后返回“查看”状态。 / p>

这种抽象非常有用,因为它允许程序员在概念上组织应该发生的事情,当正确实现时,会导致更清晰,更有条理的代码。这反过来导致更少的错误。状态图(取决于实现)可以通过仅处理为状态定义的事件来防止意外影响 - 例如,“Viewing”可能没有定义“save”事件,因此如果程序在“查看“状态任何保存都没有意义,因为这应该只在”编辑“状态下发生。

如果您查看链接框架的概述,您会注意到有一堆处理程序可用于挂钩进入状态,离开状态,操作发生等等。这可以让您实际执行操作对应于州/行动。例如,在进入“编辑”状态时,您可以将表单呈现给用户并启用保存按钮。进入“保存”状态后,您可以禁用该按钮并激活保存请求。收到“SaveComplete”事件后,您可能会转换为“查看”状态,删除表单并显示其他内容。

答案 1 :(得分: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插件的源代码。例如,在the jquery ui source

中的_mouseMove和_mouseUp下查看

答案 2 :(得分:2)

它经常用于语言解析器的扫描程序和词法分析器。根据某些语法规则创建并分析源代码中的每个标记。

基本上,在这里,你检查当前的状态,看看下一个字符或标记是否有意义,以及它们应该如何组织。