如何在JavaScript中避免功能重复并实现通用逻辑?重构重复代码求助
如何重构重复代码以提升代码覆盖率?
问题描述
将尝试重构以下重复出现多次的代码片段,请问如何将其改造为通用逻辑?由于代码重复,我无法获得完整的代码覆盖率。
代码片段如下:
method_a { let category = []; category.forEach(d => { if(d.includes("prop1","prop2")) { // something... this.otherMethod('string1'); } if(d === "prop3") { this.otherMethod('string2'); } }); } method_b { // api response data[0].category.forEach(d => { if(d.includes("prop1","prop2")) { this.otherMethod('string1'); } if(d === "prop3") { this.otherMethod('string2'); } }); }我的困惑点在于:method_a使用的是本地空数组变量,而method_b使用的是JSON响应中的数据。
解决方案
核心思路就是把数组遍历+元素判断处理的重复逻辑抽离成通用方法,不管数组来自本地变量还是API响应,都调用这个方法就行。这样不仅消除了重复代码,还能更高效地覆盖测试分支。
1. 封装通用处理方法
先把forEach里的判断逻辑单独拎出来写一个方法,同时修复原代码里includes的使用错误(includes只接受第一个搜索值参数,第二个是起始位置,所以要改成判断包含prop1或prop2):
handleCategoryItems(categoryItems) { // 先做数组有效性校验,避免非数组或空数组的异常情况 if (!Array.isArray(categoryItems)) return; categoryItems.forEach(d => { if (d.includes("prop1") || d.includes("prop2")) { // 保留原来的"something..."逻辑 // something... this.otherMethod('string1'); } if (d === "prop3") { this.otherMethod('string2'); } }); }
2. 改造原有两个方法
现在只需要在method_a和method_b里调用这个通用方法,传入对应的数组即可:
- 改造
method_a:
method_a() { let category = []; this.handleCategoryItems(category); }
- 改造
method_b:
method_b() { // api response this.handleCategoryItems(data[0].category); }
对代码覆盖率的提升作用
- 现在只需要针对
handleCategoryItems方法编写测试用例,覆盖所有分支:比如元素包含prop1、包含prop2、等于prop3、都不满足的情况,以及传入空数组、非数组的边界情况,就能把所有逻辑都覆盖到。 - 不用再分别给
method_a和method_b写重复的测试,既节省了测试代码量,又能轻松拿到完整的代码覆盖率。
内容的提问来源于stack exchange,提问作者Mr. Learner
相关产品推荐
相关产品推荐

