重复率衡量什么
重复率工具按令牌序列相似度找克隆片段:PMD 的 CPD 面向 Java 等语言,jscpd 覆盖前端与多语言,SonarQube 的重复率按行判定。它提示的是同步修改成本——同一处逻辑散在多处,改一处忘一处就出缺陷。但相似不等于重复:短小的结构性相似、生成代码、测试样板都会拉高数字。
基本信息
| 度量对象 | 跨文件、跨函数、跨块的令牌序列相似度 |
|---|---|
| 常见工具 | PMD CPD、jscpd、SonarQube duplication |
| 误读来源 | 结构性相似、生成代码、测试样板、配置与数据 |
| 行动原则 | 重复 × 变更频率双高才优先处理 |
| 口径 | 先排除生成目录、第三方代码与数据文件 |
治理顺序
- 先排除生成目录与第三方代码,否则指标被无关内容拉高
- 查看重复块是否常被改动:翻版本历史比看百分比更有价值
- 对高频重复提取函数或模块,同时保留可读性
- 低变更的重复可以容忍,登记观察即可
- 区分真重复与巧合相似:结构相同的三段代码未必该合并
治理步骤示例
治理步骤示例
1. 配置排除规则
jscpd --ignore generated/,dist/ src/
2. 导出重复块清单,标注每块的改动次数
3. 对「重复且高频改动」的片段做提取
4. 对低频重复登记观察,不强制合并
5. 把重复率纳入新代码门禁,只看增量误读来源与对策
| 来源 | 表现 | 对策 |
|---|---|---|
| 结构性相似 | 多个简单的转换方法被标为克隆 | 调大最小令牌阈值 |
| 生成代码 | 客户端 SDK、协议桩大量重复 | 目录级排除 |
| 测试样板 | 每个用例的搭建代码雷同 | 提取测试夹具而非业务代码 |
| 数据与配置 | 大段 JSON、SQL 脚本被算入 | 只统计人工维护的源码目录 |
重复率是把「同步修改的成本」变成可讨论的数字,不是立 KPI 的依据。一旦拿百分比考核,最省力的应对是往更长的函数里塞代码,指标好看了,实际维护成本没变。
同样是重复,方向不同处理也不同:业务规则重复该合并,因为口径必须唯一;测试用例重复往往该保留,因为每个用例独立可读更重要。判断依据是有没有那个「权威版本」。