You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优雅复用双函数的公共参数校验逻辑(最小重构)

问题描述

现有两个JavaScript函数funcA与funcB,二者均先执行参数校验,不满足条件则提前返回,再执行业务逻辑,代码示例如下:

function funcA (inputParam) {
  if(!inputParam.valueA) {
     // 错误处理逻辑
     return;
  }
  // 业务逻辑
}

function funcB (inputParam) {
  if(!inputParam.valueB) {
     // 错误处理逻辑
     return;
  }
  // 业务逻辑
}

如今需要为两个函数新增同一参数校验条件,希望复用该校验逻辑而非复制粘贴。但直接将校验逻辑封装为checkC函数无法实现校验不通过时终止原函数执行的效果:

function checkC (inputParam) {
  if(!inputParam.valueC) {
     // 错误处理逻辑
     return;
  }
}

调用checkC后,无论校验结果如何都会执行后续业务逻辑;若直接return checkC,则永远无法执行业务逻辑。

本人提出两种方案,但均存在不足:

  • 构建统一入口函数,需大量重构;
  • 将校验与错误处理拆分,仍不够优雅。

注:无法使用throw new Error方案,求更优雅且重构量最小的解决办法。

解决方案

方案1:校验函数返回布尔值,原函数判断返回

把checkC改成返回校验结果,原函数仅需新增一行判断逻辑,改动量极小:

function checkC (inputParam) {
  if(!inputParam.valueC) {
     // 错误处理逻辑
     return false;
  }
  return true;
}

// 修改后的funcA
function funcA (inputParam) {
  if(!inputParam.valueA) {
     // 错误处理逻辑
     return;
  }
  if(!checkC(inputParam)) return; // 新增校验
  // 业务逻辑
}

// 修改后的funcB
function funcB (inputParam) {
  if(!inputParam.valueB) {
     // 错误处理逻辑
     return;
  }
  if(!checkC(inputParam)) return; // 新增校验
  // 业务逻辑
}

这种方式仅需给每个目标函数添加一行校验判断,既实现了逻辑复用,又几乎没有重构成本,逻辑直观易懂。

方案2:高阶函数包装目标函数

如果后续可能新增更多统一校验规则,高阶函数的方式扩展性更强,且无需修改原函数内部代码:

// 封装统一校验的高阶函数
function withCheckC(fn) {
  return function(inputParam) {
    if(!inputParam.valueC) {
      // 错误处理逻辑
      return;
    }
    // 校验通过,执行原函数逻辑
    return fn(inputParam);
  };
}

// 用高阶函数包装原函数,原函数代码无需改动
const funcA = withCheckC(function(inputParam) {
  if(!inputParam.valueA) {
     // 错误处理逻辑
     return;
  }
  // 业务逻辑
});

const funcB = withCheckC(function(inputParam) {
  if(!inputParam.valueB) {
     // 错误处理逻辑
     return;
  }
  // 业务逻辑
});

这种方式完全保留原函数的内部逻辑,仅通过包装实现统一校验,后续新增其他校验时,只需添加新的高阶函数或扩展现有包装函数,扩展性极佳。

内容的提问来源于stack exchange,提问作者cis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 18:54:50