问题标签 [state-machine]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
22830 浏览

regex - 正则表达式转换为状态机的简短示例?

在 Stack Overflow 播客 #36 ( https://blog.stackoverflow.com/2009/01/podcast-36/ ) 中,表达了这种观点:一旦您了解设置状态机是多么容易,您就会永远不要再尝试不恰当地使用正则表达式。

我做了一堆搜索。我找到了一些学术论文和其他复杂的例子,但我想找到一个简单的例子来帮助我理解这个过程。我使用了很多正则表达式,并且我想确保我永远不会再“不恰当地”使用一个。

0 投票
2 回答
1776 浏览

ruby-on-rails - 对 Rails 工作流程实施有什么建议吗?

有人有使用 Rails 工作流插件的经验吗? 路线/OpenWFEru。

我正在寻找具有基于角色的编辑、提交、批准、回滚等状态的 CMS 类型工作流。这个插件是不是有点矫枉过正?使用状态机 (AASM) 做同样的事情并充当可审计/充当版本控制会更好吗?

0 投票
7 回答
4518 浏览

c - 代码中的真值表?如何构造状态机?

我有一个(有点)大的真值表/状态机,需要在我的代码(嵌入式 C)中实现。我预计此状态机的行为规范将来会发生变化,因此我希望将来可以轻松修改它。

我的真值表有 4 个输入和 4 个输出。我将所有内容都保存在 Excel 电子表格中,如果我可以将其粘贴到我的代码中并进行一些格式化,那将是理想的选择。

我在想我想像这样访问我的真值表:

然后我可以通过以下方式访问输出值:

但为了得到它,看起来我必须做一个相当混乱的表,如下所示:

那些嵌套的括号可能有点令人困惑——有没有人对如何在我的代码中保持漂亮的表格有更好的想法?

谢谢!

根据 HUAGHAGUAH 的回答进行编辑:

结合每个人的输入(谢谢——我希望我能“接受”这些答案中的 3 个或 4 个),我想我会尝试将它作为一个二维数组。我将使用一个小的位移宏来索引我的数组:

这将使我的真值表数组看起来像这样:

然后我可以像这样访问我的真值表:

我会试一试,看看效果如何。我还将用更有用的 #defines 替换 0 和 1,这些 #defines 表达了每个状态的含义,以及解释每行输出的输入的 /**/ 注释。谢谢大家的帮助!

0 投票
7 回答
17928 浏览

.net - .NET 的状态机框架

在我的工作中,我们有一个系统,它基本上是一个消息驱动的状态机。它接收各种类型的消息,根据消息查找一些上下文/状态,然后根据消息和当前状态决定要做什么。通常,结果是一条消息被发送出系统。

有没有什么好的开源框架可以在 .NET 中实现状态机?我查看了最新版本的 Windows Workflow,它似乎是一个不错的选择;但是,我对默认的持久性机制(我们需要报告状态转换数据)、可测试性以及 WF 团队在我们所说的(假设)重新构建框架这一事实有些担忧。

而不是WF,我正在考虑尝试实现一个普通的GoF“状态”模式,并使用Spring.NET将所有东西连接在一起。有没有什么东西已经这样做了,或者类似的东西?

0 投票
2 回答
1456 浏览

.net - 数据驱动的状态机应用

我们目前正在开发一个“数据驱动”的状态机应用程序。目前,状态流都在数据库中配置,但在我们当前的设计中,没有任何决策/业务逻辑可以在数据库中配置。正因为如此,代码也必须基本上“知道”状态流,所以在数据库中配置流真的没有意义。

我想到了一个设计,它允许我们使用依赖注入(Spring.NET)将状态模式连接在一起,但我不确定使这种数据驱动的最佳方法。我不是在数据库中配置类似代码的东西(如类或方法名称)的忠实粉丝,但我想到的设计需要我们在数据库中连接应用程序(类似于在 Spring XML 中的连接文件),所以这看起来很糟糕。

我们已经研究过使用 Windows WF,但我认为我们有点担心 WF 的未来,以及现在是否是采用它的好时机。我从来没有处理过规则引擎,所以我想知道这在这里是否有用。有没有人对如何实现这一点有任何建议?

0 投票
2 回答
318 浏览

design-patterns - 状态机是否适合处理促销系统中的状态变化?

我正在开发促销系统,我刚刚踩到了一些可能用状态机模式处理的东西,但我还没有使用状态机的经验。也许状态机在这种情况下完全没用:) 所以我有一个促销活动,它有一定的持续时间,一些指定的客户、产品、折扣等。每个促销活动也有它的状态。大约有5个州。状态之间的转换是严格定义的——不可能直接将状态 1 更改为状态 3——用户必须先将状态更改为 2。有一些限制,例如“促销处于状态 3-5 时无法添加更多产品”。或者像“只有超级用户可以在状态 3-5 时编辑促销成本”之类的限制。

我刚刚阅读了有关http://www.codeplex.com/SimpleStateMachine的信息,但我不确定对于这种情况是否不太复杂。我可以使用以下方式处理服务层中的状态逻辑:

或者

但我不喜欢这种代码 - 必须有一些更好的方法:) 有人有建议吗?当然,我可以分离关注点并开发诸如 PromotionStatusChangeReviewService、PromotionEditPermissionService 等服务以减少代码耦合,但目前可能有一些更好的解决方案我看不到。

0 投票
3 回答
2676 浏览

wpf - 实现 UI 状态机的最佳方式是什么?

在我的程序中,我有三种不同的 UI 状态(正常、成功和错误),并且在每一种状态中,控件都是可见/隐藏、启用/禁用、颜色变化、标签表示不同的东西……等等。在我的代码隐藏中,我基本上希望能够说 ChangeWindowState(UI.Normal);

所以我的问题是如何最好地实现每个状态的控制更改?

当然,我可以手动更改代码隐藏中的控件,但我想知道是否有更好的方法使用 wpf 主题或样式。然后也许我可以将窗口设置为使用我预先定义的“错误”主题。我目前并不真正理解它们,所以我可能使用错误的术语,但如果有人能指出我正确的方向如何最好地做这样的事情,我将不胜感激。

谢谢!

0 投票
3 回答
1643 浏览

regex - 用于将正则表达式转换为 NFA 的库?

是否有将正则表达式转换为NFA的好?我看到很多关于该主题的学术论文,这些论文很有帮助,但对工作代码的影响不大。

我的问题部分是出于好奇,部分是由于实际需要在我正在开发的生产系统上加快正则表达式匹配。尽管为了学习而探索这个主题可能很有趣,但我不确定它是否是加速我们的模式匹配的“实用”解决方案。我们是一家 Java 商店,但很乐意提供任何语言的优质代码。

编辑

有趣的是,我不知道 Java 的正则表达式已经是 NFA。这篇论文的标题让我不相信。顺便说一句,我们目前正在 Postgres 中进行正则表达式匹配;如果简单的解决方案是将匹配移动到 Java 代码中,那就太好了。

0 投票
5 回答
1181 浏览

design-patterns - 使用状态模式的对象应该如何转换到下一个状态?

我有一个 Order 类,它经历了一系列定义的状态。为了解决这个问题,我实现了 State 模式,使得 Order 对象有一个 CurrentState 成员,该成员实现了 IOrderState 接口。然后我有这个接口的具体实现,例如 OrderStateNew、OrderStateDelivered 等

我的问题是,在状态之间转换 Order 对象的正确方法是什么?有一个允许外部服务设置状态的 Order.SetState() 方法是否可以接受?确定状态更改的标准存储在 Order 对象的外部,因此这似乎是显而易见的答案,但我对在我的对象上使用公共方法来更改像这样基本的东西有点不安。

附加说明 我认为添加更多关于我的实现的细节可能会很有用,因为我想知道我是否首先正确地使用了该模式。这是用于创建和授权订单的公共 API

OrderFacade.Authorise() 函数看起来像这样

如您所见,CurrentState 成员是当前 IOrderState 实现,它确定哪些活动对对象有效。我想知道这是否应该负责确定过渡而不是 OrderFacade?

0 投票
3 回答
492 浏览

text - 用于语法着色的状态机

我目前正在学习词法分析器和解析器的工作方式,并且我有以下关于状态机的问题。例如,我需要通过以下规则为文本着色:对于此规则,简单的状态转换表将如下所示:

这将为 '$' 和行尾之间的每个字符调用 OnColor() 操作,以便我可以对其进行着色。当然同样可以从正则表达式自动生成,但我真的很想知道在大量使用魔法之前它是如何工作的:)。接下来是问题:如果我有一个规则:(想为任何以美元结尾的文本行着色,状态转换表不是很清楚:

我可以教我的状态机调用 OnDollar() 如果它在行尾找到一个“$”符号,但是我可以做些什么来为遇到美元符号之前的文本着色?解决此类问题的常见模式是什么?当然,它将是 1 行与正则表达式,但我真的很想知道如何通过状态机实现这样的解析器,是否有可能。