duplicate-code-semantic¶
类别: 重复代码
严重程度: Warning
触发方式: pyscn analyze, pyscn check --select clones
检测内容¶
标记语法不同但计算结果相同的代码块(Type-4 克隆,相似度 >= 0.65)。使用数据流分析比较行为而非结构。
为什么这是一个问题¶
语义克隆是在代码审查中不会被注意到的重复。一个函数使用循环,另一个使用推导式;一个通过 update 构建字典,另一个使用合并语法。代码看起来不同,因此通过了视觉检查,但两种实现做的是同一件事。
风险与任何重复一样 — 修改必须在多处进行 — 但还有额外的成本。读者无法一眼判断两种实现在边界情况上是否一致。循环版本是否也会跳过 None?推导式版本在输入为空时是否会抛出异常?每次都必须进行这样的心理审计。
统一为单一实现可以消除审计和偏离的问题。
示例¶
def unique_emails(users):
seen = set()
result = []
for u in users:
if u.email not in seen:
seen.add(u.email)
result.append(u.email)
return result
def distinct_emails(users):
return list({u.email: None for u in users}.keys())
修正示例¶
选择一种实现并在所有地方使用。优先选择更清晰的版本;如果两者各有优点,保留一个并记录原因。
def unique_emails(users):
"""按首次出现顺序返回用户邮箱,不含重复项。"""
return list(dict.fromkeys(u.email for u in users))
选项¶
| 选项 | 默认值 | 说明 |
|---|---|---|
clones.type4_threshold |
0.65 |
一对代码被报告为语义克隆所需的最低相似度。 |
clones.enable_dfa |
true |
启用驱动 Type-4 检测的数据流分析。 |
clones.similarity_threshold |
0.65 |
在按类型阈值之前应用的全局下限。 |
clones.enabled_clone_types |
["type1","type2","type4"] |
包含 "type4" 以保持此规则生效。 |
clones.min_lines |
5 |
最小片段大小(行数)。 |