动态状态进展的高级模式?

时间:2010-01-30 00:19:55

标签: state-machine architecture

你有没有遇到过像这样的情况,如果有的话,你是怎么解决的?

我们有一个经历多个阶段的记录,例如:

提交 - > 初步评估 - > 最终审核 - > 活性

保证这些主要状态类型的进展顺序。但是,有些因素会使事情变得复杂:

  • 其中一些州可能需要一个 附加条件的数量 在记录移动到之前遇到了 下一个州。其中一些条件 或“子状态”可以是可选的 可能需要一些,或者可能需要 需要满足“任意2分之3 可能的条件“标准。这些 子状态或子条件可以 以任何顺序见面。

  • 可以修改该过程 动态地和不同的 不同的群体。那就是多个 组存在于系统和用户中 从每个组可以指定哪个 国家和子条件是 参与该过程(一些州 可以跳过子条件 一些团体)。我们需要存储 以某种方式在数据库中进行处理 为此提供了便利。

现在,我知道这是一套相当复杂的标准,所以我不期待很多反馈......但我想知道是否有一些已发布的设计模式,技术或方法你们都知道以优雅的方式帮助实现这一点。我的同事和我花了好几个小时试图找到最好的解决方案,但我仍然觉得我们目前的解决方案太难看了。

如果您想要更多说明,请随意添加评论 - 这是一个非常难以描述的问题,所以如果我不够清楚,我也不会感到惊讶。谢谢!

1 个答案:

答案 0 :(得分:1)

您可以考虑

Modelling Office Processes with Functional Parsers
Technical report UU-CS-1994-50
Gert Florijn
Utrecht University
[http://www.serc.nl/people/florijn/papers/UU-CS-1994-50.html][1]

这是一个片段:

3.2。第一个例子:费用报销

考虑报销差旅费用的程序。它由必须指定旅行细节的用户发起,特别是花费的钱。然后将此规范发送给用户的经理,该经理必须批准报销,但也可以拒绝报销。如果获得批准,主管部门将把钱转移给员工。稍微简化一下,我们可以按如下方式对此过程的顶层进行建模:

expenseclaim  = arec "expenseclaim" 
            (serie [expenseform, inspect, oneof [reimbursed, refused]])
reimbursed    = arec "reimbursed"  (serie [approved, reimbursement])

填写费用表意味着提供几条信息,进一步细分为个人信息和索赔本身的信息,例如支出的项目,涉及的旅行费用,会议出席费和其他费用:

expenseform = arec "expenseform" (serie [personal, claim])
personal    = arec "personal" (serie [requester,department,bankaccount])
claim       = arec "claim" (serie [project,travel,conference,other])

其他解析器被建模为基本动作解析器,即

inspect     = actl "inspect"        approved    = actl "approved"
refused     = actl "refused"        requester   = actl "requester"
department  = actl "department"     bankaccount = actl "bankaccount"
project     = actl "project"        travel      = actl "travel"
conference  = actl "conference"     other       = actl "other"
reimbursement = actl "reimbursement"