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

Lev*_*ith 13 javascript state-machine

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

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

hvg*_*des 10

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

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

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

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

如果你看一下你链接到的框架的概述,你会发现有很多处理程序你可以用来挂钩进入状态,离开状态,动作发生等等.这可以让你实际做一些对应的事情.国家/行动.例如,在进入"编辑"状态时,您可以将表单呈现给用户并启用保存按钮.进入"保存"状态后,您可以禁用该按钮并激活保存请求.收到"SaveComplete"事件后,您可能会转换到"查看"状态,删除表单并显示其他内容.


nur*_*tin 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
}
Run Code Online (Sandbox Code Playgroud)

您只保留几个状态并将事件分解为函数,定义在哪个状态中发生的事情.

function drag_started() {
 switch(your_state) {
   case "within_box":
    clearBuffers();
    cursorBecomeHand();
    your_state= "playing";
    startPlaying();
    break;
 }
Run Code Online (Sandbox Code Playgroud)

}

这导致了状态和事件的分离,这意味着更少的回归和更多的可维护性.

我什么时候不想使用有限状态机?

在这一点上回答自己.如果你只有一个状态,请不要打扰状态机.

哪些书籍,文章,教程等可以更深入地了解有限状态机(在JavaScript中)?

针对学术界,我建议阅读jquery插件的源代码.例如,在jquery ui源代码中查看_mouseMove和_mouseUp