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

举报
watermelo37 发表于 2025/06/30 22:05:51 2025/06/30
【摘要】         作者:watermelo37        CSDN万粉博主、华为云云享专家、阿里云专家博主、腾讯云、支付宝合作作者,全平台博客昵称watermelo37。        一个假装是giser的coder,做不只专注于业务逻辑的前端工程师,Java、Docker、Python、LLM均有涉猎。------------------------------------------...

        作者:watermelo37

        CSDN万粉博主、华为云云享专家、阿里云专家博主、腾讯云、支付宝合作作者,全平台博客昵称watermelo37。

        一个假装是giser的coder,做不只专注于业务逻辑的前端工程师,Java、Docker、Python、LLM均有涉猎。


---------------------------------------------------------------------

温柔地对待温柔的人,包容的三观就是最大的温柔。

---------------------------------------------------------------------



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


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


一、什么是卫语句模式?


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

// 嵌套式结构
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、第一阶段实现:统一校验主函数(初级)

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

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、进阶设计:模块化各个校验逻辑(中高级)

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

// 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;
}

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

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组件中的调用

function onSubmitWorkflow() {
  const valid = validateWorkflow(workflow.value);

  if (!valid) return;

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

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


三、结语


1、卫语句模式的价值

优点 说明
逻辑清晰 一眼看清主流程,非主流程在前被排除
减少嵌套 没有多层if/else
可读性强 语义明确,每一行都“guard”一项错误
方便拓展 每个判断点都可独立模块化处理

2、总结

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

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

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。