审批流程有多种实现方式,如果采用工作流技术,可以将审批流程按照工作流的方式建模,需要审批的数据作为附属在流程上的表单数据。这种方式对于审批过程简单但流程数量较多的情况比较合适,但对于审批数据比较复杂,审批过程与数据关联比较紧密的情况,就不太适合。这种情况下,采用领域驱动设计更为合适,将需要审批的数据对象作为聚合根,使用状态机实现审批过程,在聚合根中引用状态机实现审批的状态转移。
采用聚合根+状态机的好处是可以由粗到细进行连续开发。一个聚合根可以根据不同的数据条件,在实例化时关联不同的状态机,这样就可以适应多种审批情况。以设备维修为例,将“维修单”作为聚合根处理,维修过程使用状态机完成。当项目初始开发时,可以粗线条实现维修过程,不区分设备种类,忽略设备种类带来的不同。这样可以很快完成第一次迭代。当需要对某种设备的维修管理进行精细化时,可以针对这种设备创建新的状态机,在“维修单”实例化时进行判断,对于新增加的类型使用新的状态机,对于其他设备的维修单仍然采用粗线条的状态机。如此迭代下去,状态机的种类越来越多,直到覆盖所有设备类型,粗线条的状态机就会被自然淘汰。想象一下如果使用单一流程完成同样的工作,就会导致流程定义过于复杂,流程中会充满各种判断,变得越来越难以理解和维护。