问题标签 [stateless-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 投票
0 回答
363 浏览

c# - 在无状态状态下重新进入状态时是否保留子状态?

我有一个状态机,如下所示。我已经在 C# 中使用Stateless实现了这一点。

在触发的On情况下,状态可以重新进入。RequestStatus发生这种情况时,状态机可以处于以下任何状态OnOn > StandbyOn > Operational。现在,对于这个触发器,当前状态应该保持原样,并且应该只返回状态,即执行ReturnStatus()

OnEntryFrom(Trigger, Action)可以使用该方法执行取决于触发器的功能。但问题是,如果我设置OnEntryFromOn状态,每次触发触发器时,如果其中任何一个子状态都处于活动状态,则它们首先退出,然后On退出状态,然后OnEntry出现On状态。

现在我想要的是,无论状态机处于激活状态的 3 个状态中的哪一个,对于RequestStatus触发器,只需执行该ReturnStatus()方法即可。

我可以做到这一点的一种方法是设置OnEntryFrom(PowerOn, () => Initialize())OnEntryFrom(RequestStatus, () => ReturnStatus())。通过添加新触发器对子状态执行相同操作,StandbyRequestStatusOperationalRequestStatus根据之前激活的触发器来触发它们。我认为这很乏味,尤其是在子状态数量增加的情况下。

另一种方法是保留子状态并只处理一次。但我找不到在无状态中做到这一点的方法。

使用无状态可以实现吗?有没有人这样做过?

使用无状态状态机

0 投票
1 回答
949 浏览

c# - 返回调用者状态?

我正在使用 C# 的无状态状态机,但我过去在使用其他状态机实现时遇到过这个问题。这个问题主要是理论上的,但如果需要,我可以添加一些虚拟代码。

我有一种情况,我很不确定如何解决。假设您有 2 种状态(步行和奔跑),它们都可以转换到第三种状态(跳跃)。一旦第三个状态完成,我希望回到调用者状态。在某种程度上,我必须能够影响被调用者触发器,但这只会传递给OnEntry诸如此类,而不是状态本身。

usingEntryFrom似乎不起作用,因为没有办法影响“跳转”状态本身,只有OnEntry功能。使用PermitDynamic似乎也不起作用,因为一旦处于“跳跃”状态,我不知道我来自哪里。

我可以使用一个OnEntry函数有 2 个跳转状态(jumpfromrun、jumpfromwalk),以尽量减少一些重复代码。这是我目前使用的。

我可以将先前的状态保存在一个外部变量中,并将其传递给我的状态更新。我不想这样做(根本)。

是否有已知的技术或方法来处理此类问题?有一个共享状态,应该转换回调用者?谢谢!

0 投票
1 回答
1335 浏览

c# - 状态机:确定下一个状态的多个条件?

TL;博士:

状态机框架应该在哪里/如何确定下一个状态应该是什么?或者,这实际上是否超出了状态机的范围,状态机实际上仅用于跟踪当前状态并验证是否允许请求的转换?


背景和细节:

考虑一个简单的杂志文章发布工作流程。下图显示了对该过程的基本概念理解,我们希望将其转换为代码(在本例中使用Stateless)。它涵盖了出版的基本“快乐之路”,以及一些可能的问题:

我的问题是关于如何考虑状态转换,特别是编辑完成审查后的转换。

一种方法(A)是让用户有责任选择适当的过渡;所以在这种情况下,编辑器将有单独的按钮,称为Revert to Check Spelling,Refer for Legal ReviewDefer Publication。这些将被连接到对象上的相应方法,根据推荐Article的方法,这些方法在内部调用相应的方法。.Fire(...)_stateMachineTriggers

然而,这至少有两个缺点。首先,它增加了用户的认知负担(在这种情况下,只是勉强,但为了这个例子,请留在我身边)。她不应该选择做什么,她应该能够一次性完成所有的数据输入,表格如下:

然后应用程序应该决定做什么。这也将防止用户做出错误的选择:回答有关内容的事实问题比在给定潜在的许多输入(想象一个更复杂的示例)的情况下决定正确的行动方案更容易。

第二个缺点是审查可能会过早中断:每当发现一个问题并触发相应的操作时,编辑就无法继续审查以潜在地发现其他问题。一旦第一个问题得到解决并且文章再次返回审查,实际上它又从头开始。

我见过的另一个建议(B)Grammar Issue是对更多状态进行建模:一个状态,一个Contains Libel状态等等。然而,这又回到了同样的问题:用户必须单独触发到这些状态的转换(假设并非所有这些问题都可以通过例如语法检查器等自动确定)。

此外,这感觉就像远离我们相对干净的世界模型,或者至少远离状态机库提供的假设清洁度。想象在一个更复杂的例子中状态的扩散,用户输入更多的变量。正如他们所说,我期待使用 Stateless 的导出到 DOT 图功能来实现代码作为权威来源和图表作为副产品。但是,如果输出充满了相当不直观的“状态”,这些状态不再对应于通常理解的工作流“阶段”,那么利益相关者沟通的价值就会降低。

这似乎给我留下了(C),给编辑器一个Submit函数的选项,它只包含一堆if语句来确定正确的下一个触发器到.Fire(). 一方面,这感觉像是从状态机框架旨在提供的优势中倒退(这对无状态来说并不轻视——这个问题的目的是确定我是否持有错误)。另一方面,我认识到我仍然从它的结构中获得了与其他状态相关的好处,并且转换更简单。


还有另一个 SO question提供了一个更简单的示例:

让我们以简单的 ATM 为例。如果用户按下“确认”并且 PIN 正确,则转到状态 2。如果用户按下“确认”并且 PIN 不正确,则转到状态 3。

这个问题似乎更多地询问建模/符号而不是实现,但这个例子类似于我的编辑器按下Submit她完成的表格的例子。

0 投票
1 回答
4074 浏览

c# - 状态机 - 无状态与传统 if-else 代码,难以把握优势

我最近遇到了一个脏的 if-else 代码,所以我寻找了一个重构选项,并找到了state-machine作为脏if-else代码的优雅替代品的推荐。但是我很难理解:作为客户,我有责任将机器从一种状态转移到另一种状态。现在,如果有 2 个转换选项(取决于在当前状态下完成的工作的结果)我还需要使用 if-else 吗?如果是这样,这种模式的主要好处是什么?从我的角度来看,机器可能会从起始状态自动转换

在询问之前,我已经阅读了以下内容,它只会加强我的观点:

无状态自动推进状态机

如何封装 .NET 无状态状态机

转换到目标状态并触发转换和状态之间的状态机?

在我的示例中,我有一个MarketPriceEvent需要存储在 Redis 中的内容。在存储之前,它必须通过验证路径。验证路径状态为:

  • 基本验证
  • 比较
  • 另一个比较
  • 存储
  • 错误审计

问题是我有很多决定要做。例如:只有BasicValidation成功通过我才想移动到Comparison. 现在,如果Comparison成功,我想搬到Storing,否则搬到ErrorAuditing。因此,如果我们要进入代码:

在我的客户端/包装器代码中,我将编写:

简而言之,如果我需要使用if-else,我从这样的状态机概念中得到了什么好处?如果它是确定性的,为什么它不会自我移动到下一个状态?如果我错了,有什么问题?

0 投票
1 回答
1072 浏览

c# - .NET 无状态多重 PermitIf

我需要在我的.Net Stateless state machine中为某个状态添加多个警卫。

考虑以下模拟场景。如果满足两个条件,我只能允许从插入到修改:

在上面的代码中,仅评估第一个条件。我也可以将两个条件捆绑成一个条件,在一个 PermitIf 中传递它,但我宁愿不这样做:

有没有办法在 dotnet-state-machine 中实现多个防护?

0 投票
1 回答
431 浏览

c# - .NET Stateless 一个并行工作流/长并行后台进程

我有一个stateMachine需要在后台下载大量数据的地方State.LoadingOrderInfos。当我的应用程序正在下载这些东西(在后台)时,操作员应该继续工作并通过下一个states. 在State.InsertPcbs我需要下载的数据。

简而言之。我想LoadECMDataAsync在进入时打电话State.LoadingOrderInfos,它不应该干扰正常的工作流程。

在此处输入图像描述

0 投票
0 回答
302 浏览

c# - StateMachine(一个触发器有两个状态)

我正在使用 Statless.StateMachine 并且我面临一个触发器有两个状态的情况!让我解释一下,我有一个应用程序,当用户填写文本框时,我需要激活一些按钮,但同时,当用户清除文本框时,这些按钮将被停用。

我所做的是我创建了两个状态 Waiting 和 Editing。在等待时,按钮会被停用,而在编辑时,只要文本框不为空,按钮就会被激活。为了解决这个问题,我编写了以下代码:

现在文本框的 KeyUp 事件是:

前面的代码工作正常,当文本框为空时按 Backspace 时出现问题

System.InvalidOperationException:'触发器'编辑'对于从状态'ChoiceWaiting'的转换有效,但不满足保护条件。守卫描述:'功能

我知道我可以通过有一个条件来确定在 KeyUp 事件上触发哪个触发器来解决这个问题,但我觉得这违背了状态设计模式的目的,因为我需要控制状态而没有代码中的 if-else 混乱像 KeyUp (在 StateMachine 之外,因为 PermitIf 将自行决定)。

是状态设计模式的正确应用吗?还是我错过了什么?

0 投票
0 回答
307 浏览

c#-5.0 - 如何在 .net 核心 WebApi 中为用户注册用例构建 .NET 无状态状态机

我正在尝试使用 .NET Stateless 库作为工作流引擎/状态机,但我见过的大多数实现都是为控制台应用程序编写的。对于工作流持久性、用户及其状态历史的任何帮助,我将不胜感激。

0 投票
1 回答
129 浏览

c# - 无状态库 - PermitIf 与 SetTriggerParameters 一起使用

我该如何PermitIf使用SetTriggerParameters

在这个例子中,我正在模拟一个电机,它可以前进、后退或关闭(不移动)。前进和后退可以是一种double速度,因此我需要SetTriggerParameters<double>. 但是,将速度设置为 0 会关闭电机。

我希望禁止能够触发TurnOnForwardsTurnOnBackwards使用 0 参数 - 我希望TurnOff触发器明确地成为关闭电机的方式。否则,您将到达当前状态Forwards/Backwards但速度为 0 的情况。

这是我得到的错误:

CS1503 参数 1:无法从 'UserQuery.Triggers' 转换为 'Stateless.StateMachine<UserQuery.State, UserQuery.Triggers>.TriggerWithParameters'

这可能吗?

0 投票
0 回答
28 浏览

c# - OnUnhandledTrigger 和状态恢复的最佳实践

注意:这个问题专门针对 C# 的无状态库及其状态机的实现。

设想:

我有一个典型的状态机。但是,如果我遇到意外的错误触发器,我需要一种方法来恢复到不同的状态。

OnUnhandledTrigger并且OnUnhandledTriggerAsync可用于在为状态抛出错误触发器时调用功能。但是,尝试移动到可以反馈到正常状态机的“错误状态”的最佳实践是什么?毕竟,我不能直接“设置”状态机的状态。

我应该创建一个临时转换,强制它触发,然后删除转换吗?我是否应该创建中间存储,以便可以强制将状态设置在状态机对象之外?还是有不同的方法可以在这里采取?

示例案例

定义:

状态触发

我需要unexpectedbadtrigger将状态移动到errorstate.