问题标签 [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.
c# - 在无状态状态下重新进入状态时是否保留子状态?
我有一个状态机,如下所示。我已经在 C# 中使用Stateless实现了这一点。
在触发的On
情况下,状态可以重新进入。RequestStatus
发生这种情况时,状态机可以处于以下任何状态On
:On > Standby
或On > Operational
。现在,对于这个触发器,当前状态应该保持原样,并且应该只返回状态,即执行ReturnStatus()
。
OnEntryFrom(Trigger, Action)
可以使用该方法执行取决于触发器的功能。但问题是,如果我设置OnEntryFrom
了On
状态,每次触发触发器时,如果其中任何一个子状态都处于活动状态,则它们首先退出,然后On
退出状态,然后OnEntry
出现On
状态。
现在我想要的是,无论状态机处于激活状态的 3 个状态中的哪一个,对于RequestStatus
触发器,只需执行该ReturnStatus()
方法即可。
我可以做到这一点的一种方法是设置OnEntryFrom(PowerOn, () => Initialize())
和OnEntryFrom(RequestStatus, () => ReturnStatus())
。通过添加新触发器对子状态执行相同操作,StandbyRequestStatus
并OperationalRequestStatus
根据之前激活的触发器来触发它们。我认为这很乏味,尤其是在子状态数量增加的情况下。
另一种方法是保留子状态并只处理一次。但我找不到在无状态中做到这一点的方法。
使用无状态可以实现吗?有没有人这样做过?
c# - 返回调用者状态?
我正在使用 C# 的无状态状态机,但我过去在使用其他状态机实现时遇到过这个问题。这个问题主要是理论上的,但如果需要,我可以添加一些虚拟代码。
我有一种情况,我很不确定如何解决。假设您有 2 种状态(步行和奔跑),它们都可以转换到第三种状态(跳跃)。一旦第三个状态完成,我希望回到调用者状态。在某种程度上,我必须能够影响被调用者触发器,但这只会传递给OnEntry
诸如此类,而不是状态本身。
usingEntryFrom
似乎不起作用,因为没有办法影响“跳转”状态本身,只有OnEntry
功能。使用PermitDynamic
似乎也不起作用,因为一旦处于“跳跃”状态,我不知道我来自哪里。
我可以使用一个OnEntry
函数有 2 个跳转状态(jumpfromrun、jumpfromwalk),以尽量减少一些重复代码。这是我目前使用的。
我可以将先前的状态保存在一个外部变量中,并将其传递给我的状态更新。我不想这样做(根本)。
是否有已知的技术或方法来处理此类问题?有一个共享状态,应该转换回调用者?谢谢!
c# - 状态机:确定下一个状态的多个条件?
TL;博士:
状态机框架应该在哪里/如何确定下一个状态应该是什么?或者,这实际上是否超出了状态机的范围,状态机实际上仅用于跟踪当前状态并验证是否允许请求的转换?
背景和细节:
考虑一个简单的杂志文章发布工作流程。下图显示了对该过程的基本概念理解,我们希望将其转换为代码(在本例中使用Stateless)。它涵盖了出版的基本“快乐之路”,以及一些可能的问题:
我的问题是关于如何考虑状态转换,特别是编辑完成审查后的转换。
一种方法(A)是让用户有责任选择适当的过渡;所以在这种情况下,编辑器将有单独的按钮,称为Revert to Check Spelling
,Refer for Legal Review
和Defer Publication
。这些将被连接到对象上的相应方法,根据推荐Article
的方法,这些方法在内部调用相应的方法。.Fire(...)
_stateMachine
Triggers
然而,这至少有两个缺点。首先,它增加了用户的认知负担(在这种情况下,只是勉强,但为了这个例子,请留在我身边)。她不应该选择做什么,她应该能够一次性完成所有的数据输入,表格如下:
然后应用程序应该决定做什么。这也将防止用户做出错误的选择:回答有关内容的事实问题比在给定潜在的许多输入(想象一个更复杂的示例)的情况下决定正确的行动方案更容易。
第二个缺点是审查可能会过早中断:每当发现一个问题并触发相应的操作时,编辑就无法继续审查以潜在地发现其他问题。一旦第一个问题得到解决并且文章再次返回审查,实际上它又从头开始。
我见过的另一个建议(B)Grammar Issue
是对更多状态进行建模:一个状态,一个Contains Libel
状态等等。然而,这又回到了同样的问题:用户必须单独触发到这些状态的转换(假设并非所有这些问题都可以通过例如语法检查器等自动确定)。
此外,这感觉就像远离我们相对干净的世界模型,或者至少远离状态机库提供的假设清洁度。想象在一个更复杂的例子中状态的扩散,用户输入更多的变量。正如他们所说,我期待使用 Stateless 的导出到 DOT 图功能来实现代码作为权威来源和图表作为副产品。但是,如果输出充满了相当不直观的“状态”,这些状态不再对应于通常理解的工作流“阶段”,那么利益相关者沟通的价值就会降低。
这似乎给我留下了(C),给编辑器一个Submit
函数的选项,它只包含一堆if
语句来确定正确的下一个触发器到.Fire()
. 一方面,这感觉像是从状态机框架旨在提供的优势中倒退(这对无状态来说并不轻视——这个问题的目的是确定我是否持有错误)。另一方面,我认识到我仍然从它的结构中获得了与其他状态相关的好处,并且转换更简单。
还有另一个 SO question提供了一个更简单的示例:
让我们以简单的 ATM 为例。如果用户按下“确认”并且 PIN 正确,则转到状态 2。如果用户按下“确认”并且 PIN 不正确,则转到状态 3。
这个问题似乎更多地询问建模/符号而不是实现,但这个例子类似于我的编辑器按下Submit
她完成的表格的例子。
c# - 状态机 - 无状态与传统 if-else 代码,难以把握优势
我最近遇到了一个脏的 if-else 代码,所以我寻找了一个重构选项,并找到了state-machine
作为脏if-else
代码的优雅替代品的推荐。但是我很难理解:作为客户,我有责任将机器从一种状态转移到另一种状态。现在,如果有 2 个转换选项(取决于在当前状态下完成的工作的结果)我还需要使用 if-else 吗?如果是这样,这种模式的主要好处是什么?从我的角度来看,机器可能会从起始状态自动转换
在询问之前,我已经阅读了以下内容,它只会加强我的观点:
在我的示例中,我有一个MarketPriceEvent
需要存储在 Redis 中的内容。在存储之前,它必须通过验证路径。验证路径状态为:
- 基本验证
- 比较
- 另一个比较
- 存储
- 错误审计
问题是我有很多决定要做。例如:只有BasicValidation
成功通过我才想移动到Comparison
. 现在,如果Comparison
成功,我想搬到Storing
,否则搬到ErrorAuditing
。因此,如果我们要进入代码:
在我的客户端/包装器代码中,我将编写:
简而言之,如果我需要使用if-else
,我从这样的状态机概念中得到了什么好处?如果它是确定性的,为什么它不会自我移动到下一个状态?如果我错了,有什么问题?
c# - .NET 无状态多重 PermitIf
我需要在我的.Net Stateless state machine中为某个状态添加多个警卫。
考虑以下模拟场景。如果满足两个条件,我只能允许从插入到修改:
在上面的代码中,仅评估第一个条件。我也可以将两个条件捆绑成一个条件,在一个 PermitIf 中传递它,但我宁愿不这样做:
有没有办法在 dotnet-state-machine 中实现多个防护?
c# - StateMachine(一个触发器有两个状态)
我正在使用 Statless.StateMachine 并且我面临一个触发器有两个状态的情况!让我解释一下,我有一个应用程序,当用户填写文本框时,我需要激活一些按钮,但同时,当用户清除文本框时,这些按钮将被停用。
我所做的是我创建了两个状态 Waiting 和 Editing。在等待时,按钮会被停用,而在编辑时,只要文本框不为空,按钮就会被激活。为了解决这个问题,我编写了以下代码:
现在文本框的 KeyUp 事件是:
前面的代码工作正常,当文本框为空时按 Backspace 时出现问题
System.InvalidOperationException:'触发器'编辑'对于从状态'ChoiceWaiting'的转换有效,但不满足保护条件。守卫描述:'功能
我知道我可以通过有一个条件来确定在 KeyUp 事件上触发哪个触发器来解决这个问题,但我觉得这违背了状态设计模式的目的,因为我需要控制状态而没有代码中的 if-else 混乱像 KeyUp (在 StateMachine 之外,因为 PermitIf 将自行决定)。
是状态设计模式的正确应用吗?还是我错过了什么?
c#-5.0 - 如何在 .net 核心 WebApi 中为用户注册用例构建 .NET 无状态状态机
我正在尝试使用 .NET Stateless 库作为工作流引擎/状态机,但我见过的大多数实现都是为控制台应用程序编写的。对于工作流持久性、用户及其状态历史的任何帮助,我将不胜感激。
c# - 无状态库 - PermitIf 与 SetTriggerParameters 一起使用
我该如何PermitIf
使用SetTriggerParameters
?
在这个例子中,我正在模拟一个电机,它可以前进、后退或关闭(不移动)。前进和后退可以是一种double
速度,因此我需要SetTriggerParameters<double>
. 但是,将速度设置为 0 会关闭电机。
我希望禁止能够触发TurnOnForwards
或TurnOnBackwards
使用 0 参数 - 我希望TurnOff
触发器明确地成为关闭电机的方式。否则,您将到达当前状态Forwards/Backwards
但速度为 0 的情况。
这是我得到的错误:
CS1503 参数 1:无法从 'UserQuery.Triggers' 转换为 'Stateless.StateMachine<UserQuery.State, UserQuery.Triggers>.TriggerWithParameters'
这可能吗?
c# - OnUnhandledTrigger 和状态恢复的最佳实践
注意:这个问题专门针对 C# 的无状态库及其状态机的实现。
设想:
我有一个典型的状态机。但是,如果我遇到意外的错误触发器,我需要一种方法来恢复到不同的状态。
OnUnhandledTrigger
并且OnUnhandledTriggerAsync
可用于在为状态抛出错误触发器时调用功能。但是,尝试移动到可以反馈到正常状态机的“错误状态”的最佳实践是什么?毕竟,我不能直接“设置”状态机的状态。
我应该创建一个临时转换,强制它触发,然后删除转换吗?我是否应该创建中间存储,以便可以强制将状态设置在状态机对象之外?还是有不同的方法可以在这里采取?
示例案例
定义:
状态触发
我需要unexpectedbadtrigger
将状态移动到errorstate
.