对于大部分系统中流程的变更,是十分正常的事情,小到一个状态的切换,大到整个系统都是围绕业务流再走,复杂点的有工作流引擎,简单点的几个if/else收工,但是往往有那种,心有余而力不足的,比简单复杂,比复杂简单,最近,对业务流程的变更这一块一直再琢磨,没有找到一些让我豁然开朗的资料,本次只能是讲讲我的设计过程,作为反面教材去对比的,同时借鉴staleless去简化一下日常中的设计。
一、常用的流程变更
采用状态控制数据操作,通过操作变更状态,通过switch、if/else去区分状态,然后依据状态做出不同的指示,从一个大家十分熟悉,但又及其简单的例子着手,思路更加清晰。
对于订单的状态,一开始用几种描述的方式固定下来,代码实现中,有人喜欢枚举,有人喜欢字符串,这都无所谓了,罗马路条条。只是这个流程是相对固定的,与一些业务系统中,十几个转折或是几十个流程节点那样,那种貌似大多使用的都是工作流吧,存在变更,还要容易变更。
先定义个简单的订单类及用到的枚举值,这些信息应该是很熟悉且常见的。
public class Order { public Order(long orderId, string orderName, string orderNo, double price) { OrderId = orderId; OrderName = orderName; OrderNo = orderNo; Price = price; CreateDate = DateTime.Now; InitOrderState(); } /// <summary> /// 订单Id /// </summary> public long OrderId { get; set; } /// <summary> /// 订单名称 /// </summary> public string OrderName { get; set; } /// <summary> /// 订单编号 /// </summary> public string OrderNo { get; set; } /// <summary> /// 创建日期 /// </summary> public DateTime CreateDate { get; set; } /// <summary> /// 订单价格 /// </summary> public double Price { get; set; } /// <summary> /// 订单状态 /// </summary> public OrderState OrderState { get; private set; } /// <summary> /// 初始订单状态 /// </summary> public void InitOrderState() { OrderState = OrderState.OrderCreated; } /// <summary> /// 设置订单状态 /// </summary> /// <param></param> public void SetOrderState(OrderState orderState) { OrderState = orderState; } }