最近,我开始对JavaScript中的有限状态机进行一些研究,甚至对发现了一个图书馆中的有限状态机进行研究,这使得它们更易于实现。虽然我已经掌握了状态机用于跟踪和更改对象的“状态”(例如,“准备”、“完成”、“不活动”等)的概念,但我认为我并不完全理解它们的实际含义。有人能帮忙澄清以下几点吗?
发布于 2013-02-11 14:54:59
有限状态机是一个抽象的概念。因此,状态机的概念与任何特定语言都是正交的。如果你是看看维基百科,它说“是一种计算的数学模型,用于设计计算机程序和时序逻辑电路”。
这意味着FSM通常被用作数学概念,被计算机科学家用来解决这门学科的问题,比如“能计算出xyz吗?”
基于您的问题和链接,我认为您的意思是询问状态图(或Statechart),这是不同的。创建状态图时,您将程序划分为一系列状态,以及在这些状态中可能发生的事件。例如,您的程序可能处于"EditingForm“状态,接收事件"doSave",然后进入”保存“状态,接收事件‘保存完成’,然后返回”查看“状态。
这种抽象非常有用,因为它允许程序员在概念上组织当正确实现时应该发生的事情,从而产生更干净和更有组织的代码。这反过来又会导致更少的bug。状态图(取决于实现)仅通过处理为状态定义的事件来防止意外效果--例如,“查看”可能没有定义' Save‘事件,因此,如果程序处于“查看”状态,任何保存都是没有意义的,因为只有在“编辑”状态下才会发生这种情况。
如果您查看链接到的框架的概述,您将注意到有一组处理程序可以用来挂钩进入状态、留下状态、正在发生的操作等。这允许您实际执行与状态/操作相对应的事情。例如,在进入“编辑”状态时,您可以将表单呈现给用户并启用保存按钮。在进入“保存”状态时,您可以禁用该按钮,并启动要保存的请求。在接收到"SaveComplete“事件时,您可能会切换到”查看“状态,删除表单,并显示其他内容。
发布于 2013-02-11 15:05:18
什么是有限状态机?
这是一种声明状态和在它们之间过渡的副作用的方法。
有限状态机的一些实际用途是什么?
而不是这样的代码:
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中的jquery源
发布于 2013-02-11 14:57:12
它经常用于语言解析器的扫描器和词法。根据特定的语法规则创建并分析源代码中的每个令牌。
基本上,这里您检查当前状态,看看下一个字符或标记是否有意义,以及它们应该如何组织。
https://stackoverflow.com/questions/14814367
复制相似问题