最近,我开始对JavaScript中的有限状态机进行一些研究,我甚至found a library使它们更容易实现。虽然我认为我已经掌握了状态机用于跟踪和改变对象的“状态”(例如,“准备好”,“完成”,“不活动”等)的想法,但我不知道我认为我完全理解他们的实际意义。有人可以帮助澄清以下内容:
答案 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)
它经常用于语言解析器的扫描程序和词法分析器。根据某些语法规则创建并分析源代码中的每个标记。
基本上,在这里,你检查当前的状态,看看下一个字符或标记是否有意义,以及它们应该如何组织。