首页/开发/代码质量与评审速查/重复率:口径与误读
技术债与度量63 条

重复率:口径与误读

重复率工具(如 CPD、jscpd、SonarQube duplication)按令牌序列相似度找克隆:高重复率提示同步修改成本,但短小的结构性相似不应算作重复;关注「重复且经常改动」的片段。

重复率衡量什么

重复率工具按令牌序列相似度找克隆片段:PMD 的 CPD 面向 Java 等语言,jscpd 覆盖前端与多语言,SonarQube 的重复率按行判定。它提示的是同步修改成本——同一处逻辑散在多处,改一处忘一处就出缺陷。但相似不等于重复:短小的结构性相似、生成代码、测试样板都会拉高数字。

基本信息

度量对象跨文件、跨函数、跨块的令牌序列相似度
常见工具PMD CPD、jscpd、SonarQube duplication
误读来源结构性相似、生成代码、测试样板、配置与数据
行动原则重复 × 变更频率双高才优先处理
口径先排除生成目录、第三方代码与数据文件

治理顺序

  • 先排除生成目录与第三方代码,否则指标被无关内容拉高
  • 查看重复块是否常被改动:翻版本历史比看百分比更有价值
  • 对高频重复提取函数或模块,同时保留可读性
  • 低变更的重复可以容忍,登记观察即可
  • 区分真重复与巧合相似:结构相同的三段代码未必该合并

治理步骤示例

治理步骤示例
1. 配置排除规则
   jscpd --ignore generated/,dist/ src/
2. 导出重复块清单,标注每块的改动次数
3. 对「重复且高频改动」的片段做提取
4. 对低频重复登记观察,不强制合并
5. 把重复率纳入新代码门禁,只看增量

误读来源与对策

来源表现对策
结构性相似多个简单的转换方法被标为克隆调大最小令牌阈值
生成代码客户端 SDK、协议桩大量重复目录级排除
测试样板每个用例的搭建代码雷同提取测试夹具而非业务代码
数据与配置大段 JSON、SQL 脚本被算入只统计人工维护的源码目录
重复率是把「同步修改的成本」变成可讨论的数字,不是立 KPI 的依据。一旦拿百分比考核,最省力的应对是往更长的函数里塞代码,指标好看了,实际维护成本没变。
同样是重复,方向不同处理也不同:业务规则重复该合并,因为口径必须唯一;测试用例重复往往该保留,因为每个用例独立可读更重要。判断依据是有没有那个「权威版本」。

易错点

  • 单看百分比立 KPI:诱发把重复藏进更长函数,指标下降而成本不变
  • 把配置文件与数据也纳入统计:口径混杂,决策被误导
  • 不排除生成代码:报告里塞满 SDK 与协议桩,真实重复被淹没
  • 强行合并巧合相似:两段将来各自演进的代码被绑在一起,加分支比复制更贵

数据来源与参考

  • PMD CPD、jscpd 等克隆检测工具文档;SonarQube 重复度量说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌