如何优雅重构嵌套条件流程实现失败后重入可继续执行?
可重入流程重构方案
方案1:步骤编排模式(兼容性最高,无业务侵入)
把每个步骤的「前置状态校验」和「执行逻辑」内聚为独立的Step单元,按顺序编排后统一遍历执行,无需重复编写嵌套条件,天然支持重入。
首先定义统一的步骤抽象接口(以Java为例,其他语言可对应替换为函数式定义):
interface Step { // 返回true表示当前步骤未完成,需要执行 boolean needRun(); // 执行步骤逻辑,返回true表示执行成功 boolean run(); }
按业务顺序编排所有步骤,不同DoStep方法的参数差异直接在各自Step实现中处理即可,不影响外层逻辑:
List<Step> processSteps = List.of( new Step() { @Override public boolean needRun() { return XisNotY(); } @Override public boolean run() { return DoStep1AndChangeXtoY(); } }, new Step() { @Override public boolean needRun() { return !XisNotY() && AisNotB(); } @Override public boolean run() { return DoStep2AndChangeAtoB(); } }, new Step() { @Override public boolean needRun() { return !XisNotY() && !AisNotB() && IisNotJ(); } @Override public boolean run() { return DoStep3AndChangeItoJ(); } }, new Step() { @Override public boolean needRun() { return !XisNotY() && !AisNotB() && !IisNotJ() && PIsNotQ(); } @Override public boolean run() { return DoStep4AndChangePtoQ(); } } );
核心执行逻辑无需随步骤数量变化调整:
for (Step step : processSteps) { if (step.needRun()) { boolean executeSuccess = step.run(); if (!executeSuccess) { // 抛出异常终止流程,下次重入自动跳过已完成步骤 throw new ServiceProcessException("流程执行失败"); } } }
方案优势
- 无重复条件判断,所有步骤逻辑内聚,可读性、可维护性更高
- 新增/调整/删除步骤仅需修改processSteps列表,核心执行逻辑无需变动
- 天然支持重入:每次接口调用都会从第一个未完成的步骤开始执行,已完成步骤自动跳过
方案2:进度映射模式(适合状态可量化场景)
如果业务状态可映射为统一的进度数值,可进一步简化逻辑,提前计算当前进度后直接从对应位置执行:
// 提前计算当前已完成的进度值 int currentProgress = 0; if (!XisNotY()) currentProgress = 1; if (!XisNotY() && !AisNotB()) currentProgress = 2; if (!XisNotY() && !AisNotB() && !IisNotJ()) currentProgress = 3; if (!XisNotY() && !AisNotB() && !IisNotJ() && !PIsNotQ()) currentProgress = 4; // 按顺序封装所有步骤的执行逻辑 List<Supplier<Boolean>> stepRunners = List.of( this::DoStep1AndChangeXtoY, this::DoStep2AndChangeAtoB, this::DoStep3AndChangeItoJ, this::DoStep4AndChangePtoQ ); // 从当前进度的下一个步骤开始执行 for (int i = currentProgress; i < stepRunners.size(); i++) { boolean success = stepRunners.get(i).get(); if (!success) { throw new ServiceProcessException("流程执行失败"); } }
方案优势
代码更简洁,执行效率更高,适合状态判断逻辑简单、进度可量化的业务场景。
内容的提问来源于stack exchange,提问作者Noel
相关产品推荐
相关产品推荐

