代码优化咨询:简化NWindow.init重复校验逻辑的优雅实现
优化冗余校验代码的思路与实现
我完全懂你这种看着一堆重复校验代码头大的感觉——明明功能正常,但代码臃肿、可读性差,改起来还容易漏。针对你NWindow.init里的校验冗余问题,咱们可以通过配置化规则+通用校验函数的方式来彻底解决,既减少重复代码,还能让逻辑更清晰。
核心思路:把校验规则从代码里抽离成配置
首先,我们可以把每个属性的校验要求(是否必填、要执行哪些校验、失败后是警告还是致命错误)整理成一个配置数组,然后用一个通用函数循环处理这些规则,替代原来一堆重复的if判断。
具体实现步骤
1. 先定义校验规则配置
把每个需要校验的属性、校验项、错误级别都写进配置里,一目了然:
// 定义NWindow的校验规则,可单独放在NWindow内部或外部 const nWindowValidationRules = [ { propName: "network_bg", isCritical: true, // 是否是致命错误(失败则终止流程) checks: [ { type: "hasOwnProp", errorKey: "function_failed" }, { type: "isjQuery", errorKey: "null_value" }, { type: "elementExist", errorKey: "missing_html" } ] }, { propName: "network_title", isCritical: false, // 非致命,仅警告 checks: [ { type: "hasOwnProp", errorKey: "null_value" }, { type: "elementExist", errorKey: "missing_html" } ] }, { propName: "network_close", isCritical: true, checks: [ { type: "hasOwnProp", errorKey: "null_value" }, { type: "elementExist", errorKey: "missing_html" } ] } ];
2. 封装通用校验函数
在NWindow里新增一个通用校验方法,负责遍历规则、执行校验、输出错误信息:
var NWindow = { network_bg: null, network_title: null, network_close: null, // 新增:通用属性校验函数 validateProperties(rules) { const context = "NWindow.init"; // 当前校验的上下文(用于错误日志) for (const rule of rules) { const propValue = this[rule.propName]; let hasFatalError = false; for (const check of rule.checks) { let isValid = false; // 根据校验类型执行对应的检查逻辑 switch(check.type) { case "hasOwnProp": isValid = this.hasOwnProperty(rule.propName); break; case "isjQuery": isValid = Errors.check.isjQuery(propValue); break; case "elementExist": isValid = Errors.check.elementExist(propValue); break; } if (!isValid) { // 格式化错误信息(可以给Errors加个工具方法简化) const errorMsg = Errors.console[check.errorKey] .replace("%s", context) .replace("{%s}", `Nwindow.${rule.propName}`); if (rule.isCritical) { // 致命错误:弹出alert+打印error,终止校验 alert(Errors.alert.window_error); console.error(errorMsg); hasFatalError = true; break; // 跳出当前属性的校验循环 } else { // 非致命:仅打印警告 console.warn(errorMsg); } } } if (hasFatalError) return false; } return true; }, init: function() { // 原有的窗口存在性检查 if (!this.insert()) { const errorMsg = Errors.console.function_failed .replace("%s", "NWindow.init") .replace("{%s}", "Nwindow.network_bg"); alert(Errors.alert.window_error); console.error(errorMsg); return false; } // 获取DOM元素 this.getIds(0); // 用通用校验替代原来的一堆if判断 if (!this.validateProperties(nWindowValidationRules)) { return false; } return true; }, // ... 其他方法 }
3. 可选:优化错误信息格式化
为了避免每次手动replace字符串,可以给Errors对象加一个工具方法:
var Errors = { check: { isjQuery: function(obj) { return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)); }, elementExist: function($query) { return ($query && ($query.length > 0)); } }, alert: { window_error: "Erreur: Impossible d'ouvrir la fenêtre. Consultez la console pour plus d'informations." }, console: { function_failed: "[%s] La fonction {%s} a renvoyée une erreur.", null_value: "[%s] La valeur de {%s} est nulle.", missing_html: "[%s] L'élément HTML {%s} n'existe pas." }, // 新增:格式化控制台错误信息 formatConsoleMsg(template, context, target) { return template.replace("%s", context).replace("{%s}", target); } }
然后在validateProperties里替换成:
const errorMsg = Errors.formatConsoleMsg( Errors.console[check.errorKey], context, `Nwindow.${rule.propName}` );
优化后的好处
- 可读性提升:校验规则集中在配置数组里,一眼就能看清每个属性的校验要求,不用在一堆if里找逻辑;
- 可维护性增强:要新增/修改校验规则,只需要改配置数组,不用动核心校验逻辑;
- 复用性高:如果后面其他模块也有类似的校验需求,这个validateProperties函数稍作修改就能复用;
- 代码量锐减:原来init里的十几行校验逻辑,现在只用一行调用就能搞定。
内容的提问来源于stack exchange,提问作者user11771570
相关产品推荐
相关产品推荐

