2026/1/2 19:42:27
网站建设
项目流程
做网站推广的 什么是开户,百度制作公司网页,做网络营销策划的目的是,建设公司网站新闻素材管理在写业务代码时#xff0c;可能出现多层 if / else#xff0c;通常意味着以下问题之一或并存#xff1a;
1.分支条件复杂、可读性差
2.业务规则易变、修改成本高
3.单一方法承担过多职责
卫语句、策略模式、状态模式正是针对不同“分支复杂性来源”而采用的三种典型重构手段…在写业务代码时可能出现多层 if / else通常意味着以下问题之一或并存1.分支条件复杂、可读性差2.业务规则易变、修改成本高3.单一方法承担过多职责卫语句、策略模式、状态模式正是针对不同“分支复杂性来源”而采用的三种典型重构手段。一.卫语句1.适用场景“不满足条件就立即返回 / 抛异常”适合用于参数校验前置条件校验明显的异常路径早退出逻辑典型特征if 之间没有状态变化只是为了过滤非法情况分支不代表不同业务策略2.原始代码publicdecimalCalculatePrice(Orderorder){if(order!null){if(order.Items!nullorder.Items.Count0){if(!order.IsCanceled){returnorder.Items.Sum(xx.Price);}}}return0;}3.卫语句重构publicdecimalCalculatePrice(Orderorder){if(ordernull)return0;if(order.Itemsnull||order.Items.Count0)return0;if(order.IsCanceled)return0;returnorder.Items.Sum(xx.Price);}4.优缺点极低改造成本可读性显著提升非常适合方法开头不能解决真正的业务分支爆炸不适合“不同规则 / 不同行为”的分支二、策略模式Strategy Pattern适用场景“同一件事不同算法 / 不同规则”判断标准if / else 中每个分支都是在“做同一件事”但实现逻辑不同业务规则未来可能扩展典型示例价格计算折扣规则运费计算权限校验规则原始 if / else 示例publicdecimalCalculateDiscount(Orderorder){if(order.CustomerTypeCustomerType.Vip)returnorder.Total*0.8m;elseif(order.CustomerTypeCustomerType.Normal)returnorder.Total*0.9m;elseif(order.CustomerTypeCustomerType.New)returnorder.Total;elsereturnorder.Total;}使用策略模式//① 抽象策略接口publicinterfaceIDiscountStrategy{decimalCalculate(Orderorder);}//② 具体策略实现publicclassVipDiscountStrategy:IDiscountStrategy{publicdecimalCalculate(Orderorder)order.Total*0.8m;}publicclassNormalDiscountStrategy:IDiscountStrategy{publicdecimalCalculate(Orderorder)order.Total*0.9m;}publicclassNewCustomerDiscountStrategy:IDiscountStrategy{publicdecimalCalculate(Orderorder)order.Total;}//③ 策略选择替代 if / elsepublicclassDiscountStrategyFactory{privatestaticreadonlyDictionaryCustomerType,IDiscountStrategy_strategiesnew(){{CustomerType.Vip,newVipDiscountStrategy()},{CustomerType.Normal,newNormalDiscountStrategy()},{CustomerType.New,newNewCustomerDiscountStrategy()}};publicstaticIDiscountStrategyGet(CustomerTypetype)_strategies[type];}//④ 调用varstrategyDiscountStrategyFactory.Get(order.CustomerType);vardiscountstrategy.Calculate(order);优缺点可扩展性极强每个策略逻辑清晰易测试、易维护类数量增加初期显得“设计偏重”需要额外的策略选择机制三、状态模式State Pattern适用场景“对象行为随状态变化而变化”判断标准if / else 依据的是 当前状态,同一方法在不同状态下行为不同,状态之间存在流转关系典型示例订单状态新建 / 已支付 / 已发货 / 已取消,工作流,审批流程,设备状态开机 / 关机 / 待机原始 if / else 示例publicvoidPay(Orderorder){if(order.StatusOrderStatus.Created){order.StatusOrderStatus.Paid;}elseif(order.StatusOrderStatus.Paid){thrownewException(订单已支付);}elseif(order.StatusOrderStatus.Canceled){thrownewException(订单已取消);}}使用状态模式//① 状态接口publicinterfaceIOrderState{voidPay(OrderContextcontext);}//② 状态上下文publicclassOrderContext{publicIOrderStateState{get;set;}publicvoidPay(){State.Pay(this);}}//③ 具体状态publicclassCreatedState:IOrderState{publicvoidPay(OrderContextcontext){context.StatenewPaidState();}}publicclassPaidState:IOrderState{publicvoidPay(OrderContextcontext){thrownewInvalidOperationException(订单已支付);}}publicclassCanceledState:IOrderState{publicvoidPay(OrderContextcontext){thrownewInvalidOperationException(订单已取消);}}优缺点彻底消除状态判断状态逻辑高度内聚对复杂流程极友好类数量显著增加不适合简单状态初学者理解成本高四、三者核心对比总结维度卫语句策略模式状态模式解决什么问题前置校验、异常路径不同算法/规则状态驱动行为是否消除 if❌✅✅是否面向对象否是是类数量不变增加大量增加是否有状态流转无无有扩展性低高高使用成本极低中高完结撒花~