转载自http://www.agilelabs.cn/blogs/linkin/archive/2005/11/30/225.aspx
今天看了一篇关于WWF的BLOG,记录一下学习心得,原文参见:http://blogs.msdn.com/davegreen/archive/2005/10/20/483309.aspx
在WWF中有两种类型的工作流,序列工作流和状态机工作流,和我一样,许多刚接触WWF的人可能比较迷惑,什么时候该选择序列工作流,而什么时候又该选择状态机工作流呢?
序列工作流是最容易让人理解的一种工作流概念,比如挂号->看病->缴费->取药这个流程是一个非常典型的序列工作流,用Sequential工作流模型可以很容易的为这种情景建模。
但是,现实中还有一些流程可能不会这么简单,考虑一个缺陷管理系统,当测试人员发现了一个BUG,新建一个缺陷,然后将它分配给某开发人员,然后他解决了改BUG,然后返回给测试人员进行回归测试,测试人员确认该BUG被解决后,关闭该缺陷。该情景看起来和挂号看病的流程很类似。但是,现实情景很可能是这样的,测试人员发现了BUG,将它分配给开发人员Bill,而Bill在看了该Bug后说:这不是我的问题,这是Clive的。然后将该Bug重新分配给了Clive。或者Bill说,是测试人员弄错了,这根本就不是一个Bug。然后拒绝了该Bug。或者Bill请测试人员提供更详细的信息。或者,Bill今天心情很好,处理了该Bug。或者原始的测试人员出去了,被另外一个测试人员接手该Bug的回归。或者该测试人员失误打开了一个不应该被打开的缺陷等等。每一个参与者都有可能在一堆选择中做出一个跳到任意一个其它的步骤。请问如何设计该序列工作流?
面对这样的问题,使用状态机工作流就会是一个更好的选择。可以将Bug的每个状态设置为一个环节(Stage),工作流的行为就是在各个状态之间进行转换。你可以非常容易的使用State Machine Workflow来为这个流程建模。
那么,什么情况下使用何种类型的工作流有没有一个简单的评判依据呢?
Cave给出了一个简单的判断标准:影响工作流程的一些重要的选择是否发生在工作流外部(out of workflow)?是否由用户进行控制?假如是,那么采用序列工作流的概念来建模将是一件非常让人头疼的工作。而状态机工作流则比较期望工作流的状态选择发生在工作流的外部。
那么为什么状态机工作流会更加适合这种情况?根本原因在于序列工作流在本质上是对工作流的路径建模,将路径信息都编码到了模型之中。但是在某些时候,我们并不关心工作流的路径,我们只关心当前的工作流状态,并且有哪些可能的选择会跳转到某个另外的状态。假如一定要用序列工作流来描述这种情形,那么会画出许多复杂的路径流程,但是这些复杂的路径却并非我们所关注的问题域。造成了开发成本的浪费。