18

Recently, I've begun doing some research into Finite State Machines in JavaScript and I even found a library that makes them easier to implement. While I think I've grasped the idea that a state machine is used for tracking and changing the "state" of an object (e.g., 'ready', 'complete', 'inactive', etc.,), I don't think I fully understand the practical implications of them. Could someone please help by clarifying the following:

  • What exactly is a finite state machine [or is it just called a state machine? I've heard it referred to both ways]?
  • What are some practical uses for finite state machines (in JavaScript)?
  • When would I not want to use an finite state machine?
  • What books, articles, tutorials, etc., offer a more in-depth look at finite state machines (in JavaScript)?
4

3 回答 3

11

有限状态机是一个抽象概念。因此,状态机的概念与任何特定语言都是正交的。如果您查看维基百科,它会说“是用于设计计算机程序和时序逻辑电路的计算数学模型”。

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

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

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

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

于 2013-02-11T14:54:59.327 回答
11

什么是有限状态机?

这是一种声明事件和在它们之间转换的副作用的方式。

有限状态机有哪些实际用途?

而不是这样的代码:

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 插件的源代码。例如在jquery ui 源代码中查看 _mouseMove 和 _mouseUp

于 2013-02-11T15:05:18.243 回答
3

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

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

于 2013-02-11T14:57:12.803 回答