php if else if else if else if else堆成山?流程编排才是程序员最后的遮羞布
身为一名出色的程序员, 需坚守职业的底线, 对于能够以简单且快速的方式完成的某一件事情, 定然要用简易的方案迅速达成, 不可进行过度的设计, 始终维持系统的简洁许久之前, 我对流程编排这事, 是极为不屑的, 那为啥会这样? 因为我觉得流程编排属于典型的过度设计。以我的观点来看, 代码越是可以直接明白其含义就越是能够信赖, 我不乐意在面对代码之际出现内容跳转的情况。然而将流程进行依次排列组合完毕之后, 需要把各个不同的方法放置到可以进行扩充功能的类别之中, 借助将各个能够进行扩充功能的门类联结起来从而构造出一个全新的流程, 以此达成业务所具备的功能, 这样做究竟能够带来什么样的益处呢?直到我来到一个中台团队才意识到流程编排能力是保命的能力。业务中台需接入众多业务方, 并非所有业务方都一模一样。多数情况下难以完全复用, 得改造系统以适配新业务。添加新的业务代码之际, 务必要确保原本的业务不会受到干扰, 要是缺乏流程编排的能力, 那么就会充满许多If Else ,句号。if (biz BizA || biz BizB) { //do some thing //这部分逻辑相同 if (biz BizA) { //差异化处理 } if(biz BizB) { //差异化逻辑 } }就比如说上面所呈现的代码, 要是不同的业务线存在着差异化逻辑, 那就得新增分支来进行单独处理。不妨想象一下, 一旦有 10 多个业务接入到了您的系统, 那肯定会让人感到抓狂……任何一个人都没办法保证自己能对 10 多种业务进行完全熟悉, 每个人或许仅仅负责 1 个业务, 可是要是没有代码逻辑的隔离, 维护者就只能在诸多有着千丝万缕关系的情况里, 才能够找到目标代码逻辑。更为可怕的是, 每当新增一个业务时, 都得在原有的繁杂代码里继续, 持续不断地新增 if else。一直到有那么一天, 有一个运气不好的人改错了代码, 致使其他重要业务受到影响, 进而引发线上故障。试着去想象在你改动了好几行数目的代码之后, 对那些负责测试的同学提出要求, 让他们去回归十多条业务线的全部逻辑, 这明显是毫无现实可能性的。可将上述的那些问题以及痛点归结于, 代码隔离性方面的问题, 还有业务扩展点方面的问题。解决这两类问题存在如下这些手段使用流程引擎为不同的业务配置不同的流程执行链使用插件扩展引擎不同的业务实现差异化部分。大量运用流程引擎, 同时对插件扩展引擎进行大量使用, 以此来解决业务隔离性问题, 并且解决扩展性问题。配置流程执行链鉴于各异的会员产品, 其交易提单流程存在差异, 故而不同的产品, 理应配备不一样的流程。实现了购买扩展点并且定义了三个流程执行链的配置方式。定义流程节点流程节点中的方法包括 、、和 方法。流程执行流程执行时 需提供流程上下文对象。调用 . 方法即可在实际执行阶段, 各个流程节点由流程引擎串联起来, 逐个依次执行, 呈现类似责任链的那种设计模式, 且具体的执行顺序就如图所展示的那样。会逐个依次去执行每个流程节点的方法, 要是该方法出现了异常情况, 那么就会去执行另外的方法。倘若所有的那些方法都执行成功了, 那就会按照倒序的方式逐个依次执行其他方法。流程引擎执行原理以下是 .方法执行原理。publicvoidexecute(FlowChain chain, T context){ Exception exception ; int index -1; for (FlowNode node : chain.getNodes) { try { node.process(context); index; } catch (Exception e) { if (e instanceof SkipException) { CommonLog.warn(当前流程:{} 发出 Skip请求,后续流程不再执行, node.getClass.getSimpleName); break; } exception e; break; } } if (exception ! ) { for (int i index; i 0; i--) { FlowNode node chain.getNodes.get(i); try { node.rollback(context, exception); } catch (Exception e) { CommonLog.error(rollback执行异常,忽略 name:{}, node.getClass.getSimpleName, e); } } } else { for (int i index; i 0; i--) { FlowNode node chain.getNodes.get(i); try { node.success(context); } catch (Exception e) { CommonLog.error(success 执行异常,忽略 name:{}, node.getClass.getSimpleName, e); } } } for (int i index; i 0; i--) { FlowNode node chain.getNodes.get(i); try { node.callback(context, exception); } catch (Exception e) { CommonLog.error(callback执行异常,忽略 name:{}, node.getClass.getSimpleName, e); } } if (exception ! ) { throw exception; } }