- 浏览: 111663 次
- 来自: ...
文章分类
最新评论
-
Juanjuel:
Django多表查询 -
chenokia:
那么在\grails-app\conf 下的DataSourc ...
Grails如何使用外部配置文件 -
viking2439:
有没有方法去指定用户去获得某个权限呢?
[django]总结Django中的用户权限模块
Windows Workflow Foundation supports three basic styles of workflow: Sequential, State Machine and Data-Driven.
I get a lot of people asking me which style is right for their problem, so I thought I’d share my thoughts on this with you all.
Let’s start with a simple problem. I want Fred to review a document, then Joe to approve it, and finally I want to send it to my customer.
This is an obvious Sequential style workflow. To implement it, I create a Sequential Workflow project, add a sequence of Activities which ask Fred to review, Joe to approve, and finally myself to send the document – and I’m done.
A Sequential workflow is characterized by the fact that the workflow is in control. Fred, Joe and I get to do what we’re told, when we’re told to do it. We do our stuff, let workflow central know that we did it, and then the workflow decides what happens next.
Of course, the Sequential style doesn’t mean that things always happen in a simple linear sequence like this. We can have conditional branching, loops, and so on. What it means is that the workflow controls the sequence. The Sequential style is the classic style of workflow, as implemented by dozens of products over the years.
In my opinion, it is also significantly responsible for giving Workflow a bad name. Not that there’s anything wrong with telling people what to do (I’m known to indulge in the practice myself, occasionally) – but sometimes it just doesn’t work.
Let’s look at an example. Say that I’m testing a product that’s being developed. When I find a problem, I open a bug, assign it to the guilty developer, then wait confidently for the fix. I want to write a workflow to manage this process.
So far, this sounds very familiar. The steps are: tester opens bug, developer fixes bug, tester approves fix. Just like the simple document review we saw before.
But this is illusory. What really happens? A tester opens a bug, and assign it to Bill. Bill says, no not me, this is Clive’s, and reassigns the bug to him. Or Bill says, this tester is not in this case quite correct (or words to that effect), and rejects the bug as nonsense. Or asks the tester for clarifying information. Or even, if he’s in a good mood, fixes it and hands it back to the tester. Or, if the original tester is out, another tester. Or the tester withdraws an erroneous bug (surely not). And so on, with each participant being able to make one of a set of choices at any given stage.
What happens if I write this in the Sequential style? Something like this (if you’ll forgive my pseudocode):
Tester T creates instance of bug workflow
T adds bug details
T assigns to developer D
LabelA: Switch
D assigns to developer E
Goto LabelA
D rejects bug to T:
Switch
T accepts rejection:
T updates bug and assigns to developer F:
Goto LabelA
End Switch
D requests info from T:
T submits info
Goto LabelA
D submits solution to T:
T withdraws bug:
End Switch
You get the idea. Loops and choices which arise within choices are posing structural questions (here I held my nose and used Goto, to try and keep the mapping from the scenario to the code obvious). And if we start making the process more realistic still, with a queue of bugs coming in that a development team leader assigns to individuals (or a developer might grab them from the queue), and we add a project manager to the picture with the ability to set bug priorities in flight, and so on, things will get worse and worse.
This problem is much better tackled using the State Machine style. The pseudo-code above becomes:
State: Initial
Action: T adds bug details
Action: T assigns to developer D; new state = Fixing
State: Fixing
Action: D assigns to developer E
Action: D rejects bug to T; new state = Rejected
Action: D requests info; new state = Pending Info
Action: D submits solution; new state = Pending Approval
Action: T withdraws bug; new state = Closed
State: Rejected
Action: T accepts rejection; new state = Closed
Action: T updates bug and assigns to developer F; new state = Fixing
State: Pending Info
Action: T submits info; new state = Fixing
State: Pending Approval
Action: T rejects solution; new state = Fixing
Action: T accepts solution; new state = Closed
State: Closed
This is much cleaner and more comprehensible. Also, adding more features will not complicate the structure – it will simply mean adding more states and actions.
Implementing this style in Windows Workflow Foundation is simply a matter of creating a State Machine Workflow project and defining the states and actions required.
So what’s the criterion for using the State Machine style? Simply this: are the important choices being made outside the workflow? Is the user in control? If so, then the Sequential workflow’s notion that it calls all the shots will become a nuisance. The State Machine style of workflow, on the other hand, expects the choice of what to do to be made outside the workflow.
So if the workflow makes no choices, what is it for? Well, a State Machine workflow controls the sets of choices. It makes no sense for a tester to accept a solution until one has been submitted. It only becomes valid when the bug workflow has reached an appropriate state – by one of a large number of possible routes.
It’s this last point that leads us to another insight about why the State Machine style is more applicable to this problem. The Sequential workflow, of its nature, encodes all the possible sequences of behavior in its structure. But here, we don’t care. We only need to know about the current state, and what can be done next. So if we spend time modeling routes through the process, event though we don’t in fact care about them, and these routes are many, as they are in the bug problem, then the Return On Investment from the Sequential style inevitably becomes very poor.
OK, so far, so good. What’s this third, Data-Driven, style about?
This time, we’ll use the example of an inventory shortfall. An assembly line is making a gadget, and the computer said there were enough widgets in stock for the purpose, but when the stockroom manager went to fetch the widgets, there was a shortfall of 10.
We want to build a workflow to handle this scenario.
What are the possible actions? The supplies department could order more widgets, perhaps going to a different supplier or paying more money for faster delivery. The account manager could go to the customer and defer delivery, or split the delivery in two parts and bear the extra shipping cost. The production manager could take assembled gadgets from an order for another customer and divert them. The stockroom manager could search his stock to find the missing widgets.
Our workflow will be a collaboration, containing all these actions, restricted to the appropriate roles. Any given action might be performed multiple times. One obvious constraint is that the collaboration is not done until the shortfall is fixed by some combination of the above actions.
There will also be business constraints. For instance, there may be a rule that says deferral of delivery to gold customers is never permitted. Also, the actions will affect each other. For instance, we may say that total added cost from corrective action may not exceed 5% of original factory cost – so placing an order for accelerated supplies might prevent a shipment being split.
This is not a Sequential workflow – all the decisions are being made outside the workflow. Is it a State Machine workflow? Clearly, the sets of actions allowed to each role varies as the collaboration progresses – as splitting shipments becomes impossible, for instance – and the workflow is determining these sets of actions.
But the set of actions available at any given point is determined by the interaction of a number of independent rules – whether the customer is a gold customer, whether we have already deferred delivery once, whether the profit margin on the order is becoming a problem, etc. So the number of possible sets of actions – and therefore the number of corresponding states – is going to be large.
Crucially, we’re actually not interested in what these possible combinations of actions are – only that the rules are enforced. So we find ourselves again in a situation where a modeling approach, in this case the state machine, captures information we don’t care about – and therefore has poor ROI.
What do we get ROI from modeling? Why, simply what are the available actions, and who can perform them under what circumstances. This is just a set of actions, and for each, a role and a boolean expression which determines availability.
There is one more thing. We’d like to know when our collaboration is done – so we add to the model another boolean expression which is true when the collaboration is finished. In this case, the expression will test whether there are, or will be, enough widgets in stock for assembly.
How is this Data-Driven style implemented in Windows Workflow Foundation? There are two model elements to support this approach: the Constrained Activity Group, and the Policy. Both are typically used within a Sequential Workflow project, and represent regions of ‘data-drivenness’.
Clearly, it would be possible to model all workflows in this Data-Driven style. Wouldn’t we then have only one modeling approach to worry about?
This is true, but not optimal. To see why, consider how we know that a Data-Driven workflow is correct. We cannot predict its behavior very easily at all – the number of possible different series of actions that the workflow will allow is very large. So really the only way to test it is to try it, using enough different initial states, and enough different paths through it, that we feel confident in its operation.
Contrast the testing of a Sequential style of workflow. It has only a few possible sequences of behavior, which we can test exhaustively. We can get a higher level of confidence more cheaply.
So the motto is, choose the workflow model which has as much structure as your problem has – and no more. Deviating in either direction costs you money. Using a style with too much structure adds cost because you’re encoding information which has no value. Using a style with too little structure adds cost because your testing costs are higher than they need to be.
And one final word. Do not think that a typical real world application should use only one style. Most applications are most cost-effectively built from a composition of styles. Consider a Call Center application where most of the time the system uses scripts to drive the telephone operators. Probably a Sequential workflow. But then there are always the exceptions, such as an account in a shouldn’t-have-got-there state. Now we want to refer to an expert. Experts need to make choices – and so should be supported with a State Machine or Data Driven workflow.
So there you have it – my thinking on styles of workflow in the Windows Workflow Foundation. Feedback, as ever, solicited and welcome!
发表评论
-
IBatisNet系列-介绍篇
2006-03-25 14:56 974IBatisNET从名字就可以看出,他是从Java的IBati ... -
IBatisNet系列二-QuickStart篇
2006-03-25 14:59 930本节我参考官方网站上的Quick Start Guide,网址 ... -
IBatisNet系列-执行存储过程
2006-03-25 15:24 1118映射xml文件书写如下 <?xml version=& ... -
IBatis.Net系列-Mapped Statements的语法
2006-03-29 15:25 851语法:<statement id="state ... -
Castle- Startable Facility 简单理解
2006-03-30 17:56 837最近在研究Castle开源项目,就下午学习Startable ... -
IBatis.Net系列-多参数的SQL语句的配置
2006-04-15 12:15 1414由于本人对IBatis.Net的并不是很精通,也是在边学边工作 ... -
MonoRail学习-介绍篇
2006-04-24 10:22 717刚刚结束了使用Castle MonoRail的一个项目,所以想 ... -
MonoRail学习-入门实例篇
2006-04-24 11:51 1264MonoRail学习目录实例代码下载:/Files/maply ... -
MonoRails学习- Layouts
2006-04-24 12:14 788MonoRail学习目录实例代码:/Files/maplye/ ... -
MonoRail学习-Component
2006-04-24 13:30 688MonoRail学习目录在我们asp.net中,经常有界面代码 ... -
WF in Asp.Net
2006-05-26 11:19 933这几天在研究Windows Workflow Foundati ... -
WF学习-Console Workflow Application
2006-05-26 16:51 884环境必备:.NET Framework 2.0VS.Net 2 ... -
WF学习-WorkFLow中的参数
2006-05-27 15:46 1111系统和WorkFlow交互有很多种方式,今天介绍的是通过Wor ... -
Castle ActiveRecord.chm
2006-05-31 18:06 718收集 TerryLee's Tech Space 和 SHY5 ... -
使用UserControl时,在Page中定义方式
2006-06-24 10:02 873我们通常,会将一些通用的页面模块作成用户控件,然后加载到页面中 ... -
ASP.Net2.0中自定义控件在page中的注册
2006-06-24 14:15 783今天在网上看到ASP.Net 2.0中注册自定义控件的好方法, ... -
Asp.Net中NHiernate的Session的管理
2006-06-26 11:08 639NHibernate中的Session,在我的理解似乎就相当于 ... -
GridView使用一些记录
2006-06-30 10:45 907现在有个项目开始使用ASP.NET 2.0开发,在开发过程中关 ... -
NHiernate中自定义Generator
2006-07-04 13:50 873我的这个自定义的Generator设置如下: <g ... -
NHibernate中使用generator为assigned的问题
2006-07-04 14:03 1824Hibernate version: 1.0.2.0 Mapp ...
相关推荐
An Overview of Workflow Management:From Process Modeling to Workflow Automation Infrastructure
Verification of workflow nets, pdf format
Verification of Workflow Task Structures A Petri-net-based approach
The Application of Petri Nets to Workflow Management
一下为部分题目 2. Is “Workflow2.xaml” a good name for a reusable workflow? 3. How should an RPA developer address runtime exceptions ...7. Which of the following is a good example of a workflow name?
workflow 普元 数据转历史方案 数据备份
Although there have been several efforts to refine work distribution, especially in workflow management, most literature assumes a static database approach which captures organizational roles, groups...
Beginning WF demonstrates, in an eminently readable and accessible style, how Microsoft's Workflow Foundation (WF) technology can be used in a wide variety of applications. Loaded with lots of simple ...
Research on the Workflow System of Collaborative Process Planning
very easy to understand the idea of workflow
To add a new job login workflow In the Login Setup Folders ...Event Node: Defines a branch of the workflow that will be executed in response to a system-triggered event. Click OK to save your workflow.
Improved : Better performance for saving/loading workflow definitions, instances and tasks when using ADO Fixed : Workfklow blocks not displayed when language different than English was used Fixed : ...
Lesson 2: Overview of Oracle Workflow Objectives 2-2 Workflow Terms 2-3 Oracle Workflow Overview 2-4 Major Components 2-5 Oracle Workflow Builder 2-6 Workflow Engine 2-7 Workflow Process Definition 2-...
Windows Workflow Foundation (WF) is a revolutionary part of the .NET 4 Framework that allows you to orchestrate human and system interactions as a series of workflows that can be easily mapped, ...
为SharePoint 2010 Workflow 开发 Custom Workflow Activity(Develop Custom Workflow Activity for SharePoint 2010 Workflow). SharePoint2010提供了很多有用的开箱即用的Activity(活动action),我们可以在...
A guide for leveraging SketchUp for any project size, type, or style. New construction or renovation. The revised and updated second edition of The SketchUp Workflow for Architecture offers ...
回想自己学习Domino Workflow的经历,也算有些坎坷,因为这方面的资料很少,Domino Workflow的帮助库虽然比较完整,但是缺乏一个主线,而且没有一些实用技巧的介绍。心中一直有一个想法,就是将自己掌握的Domino ...
13. When should you use the Flowchart workflow? 14. How can you trigger another workflow from within your current one? 15. As a best practice, how should workflows use a local desktop application? ...
WorkFlow软件说明文档
workflow Domino workflow Domino workflow Domino workflow Domino