Lev*_*ith 13 javascript state-machine
最近,我开始在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