首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >消除IF嵌套,利用卫语句提升代码的可维护性与可读性

消除IF嵌套,利用卫语句提升代码的可维护性与可读性

作者头像
watermelo37
发布于 2025-05-30 01:40:29
发布于 2025-05-30 01:40:29
7300
代码可运行
举报
文章被收录于专栏:前端专精前端专精
运行总次数:0
代码可运行

作者:watermelo37 CSDN万粉博主、华为云云享专家、阿里云专家博主、腾讯云、支付宝合作作者,全平台博客昵称watermelo37。 一个假装是giser的coder,做不只专注于业务逻辑的前端工程师,Java、Docker、PythonLLM均有涉猎。 --------------------------------------------------------------------- 温柔地对待温柔的人,包容的三观就是最大的温柔。 ---------------------------------------------------------------------

消除IF嵌套,利用卫语句提升代码的可维护性与可读性

在实际的业务开发中,我们经常需要对数据执行各种校验,尤其是在流程复杂、数据完整性要求高的系统中,合理组织这些校验逻辑尤为关键。本文将以我构建的一个基于 Vue Flow 的可执行工作流模块为例,讲解一种非常实用的编程技巧 —— 卫语句模式(Guard Clauses),并展示其如何帮助我们构建高可维护、高语义的校验体系。

一、什么是卫语句模式?

卫语句(Guard Clauses)是一种常见的代码结构,它通过提前返回错误或异常情况,使代码逻辑更清晰、嵌套层级更浅。相比“嵌套式的if/else结构”,卫语句模式使得主干逻辑一目了然,而异常处理都在前面“阻断”掉了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 嵌套式结构
function submit(data) {
  if (data) {
    if (data.valid) {
      // 主逻辑
    } else {
      throw new Error('Data invalid');
    }
  } else {
    throw new Error('Data not exist');
  }
}

// 卫语句结构
function submit(data) {
  if (!data) throw new Error('Data not exist');
  if (!data.valid) throw new Error('Data invalid');

  // 主逻辑
}

二、结合案例:可执行工作流的复杂校验

1、案例背景

不久前我构建了一个基于 Vue Flow 的可执行工作流编辑器模块,用户可以自由添加、删除、修改流程节点,最后基于服务和在线编程实现节点计算以及完整的流程运算,这带来了如下几项可执行性校验需求:

  1. 必须是有向无环图(DAG)
  2. 所有执行节点必须绑定了服务或在线编程编写代码
  3. 所有起始节点必须传入初始参数或绑定数据
  4. 必须补全模型元信息

而错误校验还需结合 Element UI 提示用户,提升交互友好度。

2、第一阶段实现:统一校验主函数(初级)

我们先来看看初步版本,使用卫语句来检验可计算工作流的完成度:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function validateWorkflow(workflow) {
  if (!isDAG(workflow)) {
    ElMessage.error('工作流存在循环,请检查连线');
    return false;
  }

  if (!allExecutablesValid(workflow)) {
    ElMessage.error('存在未绑定服务的执行节点');
    return false;
  }

  if (!startNodesHaveInputs(workflow)) {
    ElMessage.error('起始节点未设置输入参数或文件');
    return false;
  }

  if (!modelMetaCompleted(workflow)) {
    ElMessage.error('模型元信息不完整');
    return false;
  }

  return true;
}

这其实就是卫语句模式在实际开发中的直接体现 —— 逐项判断,每一项失败就立即返回,流程主干逻辑清晰、无多余嵌套。这种写法逻辑虽清晰但臃肿,要知道这里我是简化了实际检验的过程,实际每一项指标的检验代码和需要检验的目标都会更多。

3、进阶设计:模块化各个校验逻辑(中高级)

当校验项变得越来越多时,最好将每一类逻辑“拆分”出去进行模块化,便于维护:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// validator/isDAG.ts
export function checkDAG(workflow): boolean {
  const isValid = isDAG(workflow);
  if (!isValid) ElMessage.error('工作流存在循环,请检查连线');
  return isValid;
}

// validator/isExecutable.ts
export function checkExecutables(workflow): boolean {
  const valid = allExecutablesValid(workflow);
  if (!valid) ElMessage.error('存在未绑定服务的执行节点');
  return valid;
}

主函数可以进一步简洁化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { checkDAG } from './validator/isDAG';
import { checkExecutables } from './validator/isExecutable';
// ...

function validateWorkflow(workflow) {
  return checkDAG(workflow)
      && checkExecutables(workflow)
      && checkStartNodeInputs(workflow)
      && checkModelMeta(workflow);
}

这样的代码结构不仅更清晰、语义化,还遵循开闭原则(Open-Closed Principle),新增规则只需添加新的模块并拼接进主函数。

4、在Vue组件中的调用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function onSubmitWorkflow() {
  const valid = validateWorkflow(workflow.value);

  if (!valid) return;

  // 合法则提交后端
  postWorkflow(workflow.value);
}

只要校验通过,才会向调度器提交数据。这种通过卫语句“提前阻断非法操作”的模式,在用户交互中非常有效。

三、结语

1、卫语句模式的价值

优点

说明

逻辑清晰

一眼看清主流程,非主流程在前被排除

减少嵌套

没有多层if/else

可读性强

语义明确,每一行都“guard”一项错误

方便拓展

每个判断点都可独立模块化处理

2、总结

在复杂流程系统中,卫语句模式不仅是代码组织技巧,更是一种系统设计哲学。你是否也遇到过多重嵌套、难以阅读的校验代码?试试这套设计,也许就能拨云见日。

只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验