案例-怎样用 UML 设计一个简单的工作流引擎(含递归算法)?

谢邀!题主 UML 掌握得不错,已经入门了!先说几个小问题。序列图* 这张图是序列图而不是时序图(Timing Diagram)。好多人把 Sequence Diagram 翻译成“时序图”是不对的,因为 UML 2.x 的时序图是 Timing Diagram。案例-怎样用 UML 设计一个简单的工作流引擎(含递归算法)?

* 第 8 步创建 FlowBuilder,如果画成由 Flows 指向 FlowBuilder 发出一个《create》消息会更好。第 11 步创建 Flow 的画法 ok。* Flows 不是一个合适的类名,应该取一个更恰当的名字,如 FlowSet 或 FlowCollection 等。让 Flows 来创建 FlowBuilder 对象似乎也不合适,也许有更简明的设计。可能 Flows 应该改名叫 FlowEngine 或 FlowFactory。FlowBuilder.build() 活动图案例-怎样用 UML 设计一个简单的工作流引擎(含递归算法)?

存在问题:* 有些动作节点名称不是动词组而是名词组,例如:“Checker与Flow构成的映射”;* build 与 build0 是否重复?这两个泳道似乎是多余的;如果确实需要这两个独立的方法,那么 build0 最好改名,换一个更贴切的名称;* 是否存在、用到两个或更多的 Map?* 为什么会两次出现“获取队首元素”?* “构造nextStepsWithRouter” 与“构造StepsWithRouter”有何区别?* 最后一个“创建Flow”是什么内容?是否必要?重要的建议1)建议题主同时把设计类图也画出来,以便澄清几个关键概念(如 Flow、SubFlow、Step、Router、Checker 等等)之间的关系。类图的设计也会影响到你的算法和活动图的设计。2)题主最好用具体、简单的实例和数据(concrete examples)来把程序试着走一遍,初看了下你的算法活动图,感觉存在一些逻辑错误,可能得不到正确的结果。关于表示递归1、活动节点“Value构造子流程”之后的判断节点,这里想表示的是构造子流程和构造主流程使用相同的方式。落实到代码上其实就是调用FlowBuilder的build()方法,感觉上应该不需要判断节点,但又不知道该怎么表示故加了一个判断节点,是的情况表示执行完build方法,否表示执行build方法。 其实不需要画多余的判断节点,因为 UML 活动图本身就是可以嵌套和递归的,活动图中的一个动作(Action)节点通常可以调用其他的活动(Activity)或操作(Operation),这类节点在 UML 规范中叫作 Call Behavior Action 以及 Call Operation Action 节点。假设我们让操作 A 的活动图中的某一个动作节点继续调用操作 A,这样就形成了递归(自循环)。所以,这里我们直接画一个调用 FlowBuilder.build() 的节点就可以了。局部可以这样画:案例-怎样用 UML 设计一个简单的工作流引擎(含递归算法)?

第 2 版FlowBuilder.doBuild() 活动图案例-怎样用 UML 设计一个简单的工作流引擎(含递归算法)?

存在问题:* 悬浮节点“构造后续步骤流程:doBuild(steps)”无出线* 冗余节点两个创建 simpleRouter 的\u0026lt;\u0026lt;create\u0026gt;\u0026gt;节点可以合并* 执行逻辑错误1)假设有 3 个步骤 s1 (string), s2 和 s3。从 s1 开始执行,由于存在两个“获取并移除steps中首个step”节点,通过递归连续执行了两次移除首元素,很可能将导致对 s2 的处理被跳过。移除操作可能是错误的。2)最后一个节点生成了一个 stepsWithRouter,感觉名称错误,应该不是 steps 而是 stepWithRouter(单数)吧,因为右边的 InputPin 是 step or checkerForkFlowMapping。而且,活动图中的输出是 stepWithRouter,两者前后不一致。


推荐阅读