工作流状态机里的状态复用

07-04-24 elseif
目前比较流行的方法是,抽象出很多子业务流状态机,根据整个业务应用,选择部分子业务流状态机,组成复合业务状态机,以实现各种业务功能。

我的疑问是,能不能在状态层面进行复用呢,有没有人实现过这样的模型:针对业务抽象出A、B、C等等很多状态,在实现工作流状态机时,从之前抽象好的状态中选择一部分状态就可以快速组成各种工作流程控制。

谢谢!

elseif
2007-04-24 15:04
一直以来,我都有一个疑惑:状态和流程是一个什么样的关系?

有一种观点是,状态是属于流程的一部分,即状态离开了流程就什么都不是。如果是这样,流程状态机中,状态层面的复用就没有意义。

但以我的项目经验来看,状态并不一定属于流程,状态可能只是当时一种“状态”的体现,比如在工业控制中,状态可能是硬件的某种整体状况,它不属某一个流程,各种不同的流程都会有产生这种状态的可能。如果是这样,状态层面的状态复用就变得有意义了。

望大家赐教!

banq
2007-04-24 16:14
>能不能在状态层面进行复用呢,有没有人实现过这样的模型

状态模式 和工作流其实都是在状态这个层面抽象重用,不知是否是这个意思

elseif
2007-04-24 21:44
举个例子来说明我的问题。

在一个游戏中,有角色A、B、C,其中角色A有9个状态,分别为A1-A9;角色B有4个状态,分别为B1-B4;角色C有5个状态,分别为C1-C5。

游戏中有各种各样的任务,每个任务需要的角色各不相同,假设有任务T1,需要角色A、B、C共同完成,但在该任务中,角色A只可能出现状态1、状态3、状态5,角色B只可能出现状态B1、B3,角色C只可能出现状态2、状态4;任务T2只需要角色A、C,角色A的状态只可能是A5-A9,角色C的状态只可能是C3-C5。

我的意思是,根据以上的例子,在每个任务中,各个角色可能出现的状态各不相同,如果能抽象角色A所有的状态,且定义好角色A各个状态的迁移规则(B、C也如此),那么根据不同的任务(可理解为业务流程),选择不同的状态,快速组成该业务流程的状态机控制。

在这个思路中,角色的状态是不从属于某个流程的,根据流程的规则选择角色及角色的状态,即可快速搭建业务流程状态机控制。请问,这个思路是否可行?有何利弊?

如果按照角色的状态是从属于业务流程的思想,以上例子中角色A的状态在各个任务中都不相同,这样一来,每新增一个任务,各个角色的状态都要新增很多?我的理解是否存在误区?

谢谢!

banq
2007-04-25 10:12
>角色的状态是不从属于某个流程的

状态模式就是将状态从流程中隔离分离出去,状态机里面封装当前状态或转换到下一个状态的规则,相当于一个黑盒子,或者集成芯片,有输入信号和输出信号.

输入信号就是:当前事件,这个事件由哪个角色发出的,是什么事件.这里引入事件Event概念很重要,因为万事万物状态不会自动改变,一定有来自外界的能量事件触发,在软件系统中,事件可能源自于系统用户在终端的按键或鼠标,也可能来自系统内部的任务.

输出信号是:在该事件作用下,改变后的当前状态.

elseif
2007-04-28 10:00
banq兄,可能是我没有表达清楚,我再举个直观的例子来说明我的问题,以下是一个角色的状态图。

注:图中的数字是指让状态迁移的最小粒度事件。

假设目前状态是A,此时外部向该状态机发送一条外部命令,该命令的期望是达到状态E。

那么有两个问题:

1)A->E,有两条路径可选,A->B->E或A->B->C->E,分别对应两条外部命令Ext1、Ext2。我们可以理解这两条路径就是两个业务流程flow1、flow2,而A、B、C、E状态是解耦合于业务流程的。那么,在架构设计中,如何体现状态和路径(业务流程)的关系呢?在架构中,如何区分flow1中的A->B和flow2中的A->B两种流程中的B状态,如何根据外部命令是Ext1或Ext2来决定下一步的流程走向?

2)我们制定这样一条规则,每一条外部命令执行结束(到达期望状态或遇到异常达到异常后状态)后,才能执行另一条外部命令。对于flow1的A->B->E的过程,有三种可能的情况:

a.经过A->B->E顺利到达E状态;

b.A->B后,没有收到触发事件6,无法到达状态E,目前状态停留在状态B;

c.A->B后,遇到异常(事件9),到达状态D,即A->B->D.

处理外部命令Ext1时,这三种情况的结果之一产生后,才能处理其它外部命令。那么,我们如何在架构中体现这种规则?

[该贴被elseif于2007年04月28日 10:04修改过]


elseif
2007-04-28 10:23
首先,我谈谈自己对上贴问题的思考。

两个方案:

1)根据流程将状态区分开来,即A->B->E和A->B->C->E中的B区分为两个状态,即

A->B1->E和A->B2->C->E。根据每个流程来区分过程状态,这种方案的好处是,容易区分过程状态,控制的粒度非常细。但坏处也是显而易见的,业务流程中可能到达的状态越多,整个状态机中抽象的状态数目就越多,状态中的共性没有提炼出来(比如对最小粒度事件的响应),粒度越细,代码量越大。

2)对系统建模分层,即在最小粒度事件层面上抽象一个层次,在外部命令层面上抽象一个层次。这种方案的好处是,在最小粒度事件的抽象层次是共通的,这个层次上的状态从外部命令(每个外部命令对应一种业务流程)解耦合出来。

我比较趋向于第二种方案,但我在两个层次的结合设计上,始终没有一个清晰的思路,也望各位牛人指点一二,万分感谢!

banq
2007-05-10 17:48
>目前状态是A,此时外部向该状态机发送一条外部命令,该命令的期望是达到状态E

我觉得这个命题有些问题,外部发送命令,但是它不能对命令结果产生期望,因为状态如何转换不是由外部决定得,外部只能被动地接受状态机的输出结果。

在状态机中,封装的是A在哪些外部命令条件下可能转换到的所有状态,如果A-->E需要经过B C D,那么A实际可能转换到的状态只是它的下一个状态(如B),而不是最终状态(如E)。

猜你喜欢