【问题标题】:Pattern/idiom for clean nested State Machines?干净的嵌套状态机的模式/习语?
【发布时间】:2014-07-24 10:16:12
【问题描述】:

我正在尝试找出一种干净的 ruby​​/oo 方法来解决嵌套状态机的问题。

我正在为一个接受订单的系统建模。订单以状态机的形式实现,根据是住宅/商业、qc/no-qc、国外/国内,流量会发生各种变化。

我对设计这个的好方法一无所知。每个选项组合都有自己的工作流程的新类可以工作,但非常不干燥,并且可以通过其他选项快速分支。

我试图弄清楚是否有一种方法可以通过组合来构建它,其中订单将根据前面提到的住宅/商业/等在每个分支机构推迟/委托到其适当的子工作流程状态,然后完成后返回主订单流程。

我正在使用的工作流 gem 似乎没有办法做到这一点,而且我看过的其他状态机实现都不支持它。

是否有一种非常红宝石的方法可以让我根据内部状态进行委派?是否有一个通用的 OO 模式在这里可以很好地工作?我是不是以一种奇怪的方式接近这个问题?

【问题讨论】:

  • 根据内部状态委托让我想到State Pattern
  • 很难说没有看到更多的问题。如果工作流之间的大多数差异是简单的做这个或不做这个决定,您也许可以编写少量的策略类来处理复杂的差异并将它们参数化以处理简单的选项。如果它更复杂,您可能希望在 DSL 中组合步骤,这是我以前在商业工作流软件中看到的。

标签: ruby oop design-patterns state-machine


【解决方案1】:

因为 Ruby 与 Python 非常相似,您可以查看使用状态模式的 python implementation of a nested state machine。状态机(消息处理程序)根据单个事件“源”(消息类型)更改其超级状态(服务中/停止服务)和继承状态(活动、待机/可疑、失败)。 python 实现是 C++ 示例的一个端口。可以找到C++例子here的类图和解释。

【讨论】:

  • 始终欢迎提供潜在解决方案的链接,但请add context around the link,以便您的其他用户知道它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。考虑到仅仅是指向外部站点的链接Why and how are some answers deleted? 的一个可能原因。
  • 你完全正确。但我不是重复的朋友,我不知道哪些额外信息有助于更详细地回答问题(因为问题本身没有包含更多细节)。对我来说,删除这个答案是可以的。但是,它也会删除目前可能解决方案的唯一提示......
猜你喜欢
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 2016-06-24
  • 2016-05-27
  • 2017-11-29
  • 2016-08-23
  • 2013-04-01
  • 1970-01-01
相关资源
最近更新 更多