【工具】检测重复代码

使用 jscpd(JavaScript Copy/Paste Detector)工具检测指定路径下的代码文件中的重复代码,并输出重复代码的相关信息。

相关文章

检测重复代码


功能清单

  • 解析目标路径: 使用 Node.js 内置的 path 模块解析指定的文件或目录路径,并将其转换为绝对路径格式。
  • 定义检测选项: 根据解析得到的目标路径,设置 jscpd 检测重复代码的选项,包括检测路径、最小代码块大小、最小行数、最大行数等。
  • 执行重复代码检测: 调用 jscpd 的 detectClones 函数进行重复代码检测,并等待检测结果。
  • 处理检测结果: 对检测得到的重复代码信息进行处理,提取重复代码的相关信息,包括源文件名、起止行号等,并存储到一个数组中。
  • 输出重复代码信息: 将处理后的重复代码信息数组输出到控制台,供开发者查看和分析。

一、jscpd是什么

jscpd 是一个用于检测和分析代码重复的工具。它可以帮助开发者发现代码中的重复部分,从而改善代码质量、减少重复工作、提高代码的可维护性。

通过 jscpd,您可以指定要检测的目标文件或目录,并设置检测的参数,例如最小代码块大小、最小行数、最大行数等。工具会分析这些文件或目录中的代码,找出其中的重复部分,并提供详细的报告,指出重复代码的位置、内容等信息,帮助开发者识别和解决代码重复的问题。

二、使用jscpd检测重复代码

1、定义检测选项

1
2
3
4
5
6
7
8
9
10
function defineDetectionOptions(targetPath) {
const options = {
path: [targetPath], // 可以是单个路径或路径数组
minTokens: 10, // 最小的代码块大小
minLines: 5, // 最小行数
maxLines: 1000, // 最大行数
silent: true, // 是否静默模式,默认为false,不输出信息到控制台
};
return options;
}

2、检测重复代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 解析要检测的文件或目录的路径
function resolveTargetPath() {
const targetPath = path.resolve(__dirname, "./src").replace(/\\/g, '/');
console.error("检测路径:", targetPath);
return targetPath;
}

// 存储重复代码的数组
const duplicateResults = [];

// 异步函数用于检测重复代码
async function detectDuplicateCode() {
try {
const targetPath = resolveTargetPath();
const options = defineDetectionOptions(targetPath);

// 调用 detectClones 函数进行重复代码检测,并等待结果
const clones = await detectClones(options);

// 遍历检测结果,并提取重复代码信息
processClones(clones);

// 输出重复代码信息数组
console.log("重复代码信息:");
console.log(duplicateResults);
} catch (error) {
// 捕获检测过程中的错误并输出
console.error("检测重复代码时发生错误:", error);
}
}

3、提取重复代码信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 处理检测结果,提取重复代码信息
function processClones(clones) {
clones.forEach((clone) => {
const { duplicationA, duplicationB } = clone;

// 将重复代码信息存入数组中
duplicateResults.push({
源文件: duplicationA.sourceId,
源内容: `${duplicationA.start.line} - ${duplicationA.end.line}行`,
目标文件: duplicationB.sourceId,
目标内容: `${duplicationB.start.line} - ${duplicationB.end.line}行`,
});
});
}

三、完整示例

src目录

  • src
    • a.js
    • b.js

a.js

1
2
3
4
5
6
7
8
9
10
11
var a = 1
var b = 1
var c = 1
var d = 1
var e = 1
var f = 1
var g = 1
var h = 1
var i = 1
var j = 1
var k = 1

b.js

1
2
3
4
5
6
7
8
9
10
var a = 1
var b = 1
var c = 1
var d = 1
var e = 1
var g = 1
var h = 1
var i = 1
var j = 1
var k = 1

检测方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
const { detectClones } = require("jscpd");
const path = require("path");

// 解析要检测的文件或目录的路径
function resolveTargetPath() {
const targetPath = path.resolve(__dirname, "./src").replace(/\\/g, '/');
console.error("检测路径:", targetPath);
return targetPath;
}

// 定义检测选项
function defineDetectionOptions(targetPath) {
const options = {
path: [targetPath], // 可以是单个路径或路径数组
minTokens: 10, // 最小的代码块大小
minLines: 5, // 最小行数
maxLines: 1000, // 最大行数
silent: true, // 是否静默模式,默认为false,不输出信息到控制台
};
return options;
}

// 存储重复代码的数组
const duplicateResults = [];

// 异步函数用于检测重复代码
async function detectDuplicateCode() {
try {
const targetPath = resolveTargetPath();
const options = defineDetectionOptions(targetPath);

// 调用 detectClones 函数进行重复代码检测,并等待结果
const clones = await detectClones(options);

// 遍历检测结果,并提取重复代码信息
processClones(clones);

// 输出重复代码信息数组
console.log("重复代码信息:");
console.log(duplicateResults);
} catch (error) {
// 捕获检测过程中的错误并输出
console.error("检测重复代码时发生错误:", error);
}
}

// 处理检测结果,提取重复代码信息
function processClones(clones) {
clones.forEach((clone) => {
const { duplicationA, duplicationB } = clone;

// 将重复代码信息存入数组中
duplicateResults.push({
源文件: duplicationA.sourceId,
源内容: `${duplicationA.start.line} - ${duplicationA.end.line}行`,
目标文件: duplicationB.sourceId,
目标内容: `${duplicationB.start.line} - ${duplicationB.end.line}行`,
});
});
}

// 调用函数进行重复代码检测
detectDuplicateCode();

输出结果


喜欢这篇文章?打赏一下支持一下作者吧!
【工具】检测重复代码
https://www.cccccl.com/20240201/工具/检测重复代码/
作者
Jeffrey
发布于
2024年2月1日
许可协议