SKILL.md
readonly只读
name
m15-anti-pattern
description
用于审查代码中的反模式。关键词:反模式、常见错误、陷阱、代码异味、不良实践、代码审查、这是反模式吗、更好的做法、应避免的常见错误、为什么这不好、地道写法、初学者错误、与借用检查器斗争、到处clone、在生产中使用unwrap、应该重构吗、反模式、常见错误、代码异味、最佳实践、地道写法
反模式
第2层:设计选择
核心问题
这种模式是否隐藏了设计问题?
审查代码时:
- 这是解决症状还是原因?
- 是否有更地道的做法?
- 这是与Rust对抗还是顺应?
反模式 → 更好的模式
| 反模式 | 为什么不好 | 更好的做法 |
|---|---|---|
到处使用 .clone() |
隐藏所有权问题 | 正确的引用或所有权 |
在生产中使用 .unwrap() |
运行时恐慌 | ?、expect 或处理 |
单所有者时使用 Rc |
不必要的开销 | 简单的所有权 |
为方便使用 unsafe |
未定义行为风险 | 寻找安全模式 |
通过 Deref 实现面向对象 |
误导性API | 组合、trait |
| 巨大的match分支 | 难以维护 | 提取为方法 |
到处使用 String |
分配浪费 | &str、Cow<str> |
忽略 #[must_use] |
丢失错误 | 处理或 let _ = |
思考提示
当看到可疑代码时:
-
这是症状还是原因?
- 克隆以避免借用?→ 所有权设计问题
- 因为“不会失败”而unwrap?→ 未处理的情况
-
地道的代码应该是什么样子?
- 引用代替克隆
- 迭代器代替索引循环
- 模式匹配代替标志位
-
这是在与Rust对抗吗?
- 与借用检查器斗争 → 重构
- 过多的unsafe → 寻找安全模式
向上追溯 ↑
到设计理解:
"为什么我的代码有这么多克隆?"
↑ 问:所有权模型是否正确?
↑ 查看:m09-domain(数据流设计)
↑ 查看:m01-ownership(引用模式)
| 反模式 | 追溯至 | 问题 |
|---|---|---|
| 到处clone | m01-ownership | 谁应该拥有这些数据? |
| 到处unwrap | m06-error-handling | 错误策略是什么? |
| 到处Rc | m09-domain | 所有权是否清晰? |
| 与生命周期斗争 | m09-domain | 数据结构是否应该改变? |
向下追溯 ↓
到实现(第1层):
"用正确的所有权替换clone"
↓ m01-ownership: 引用模式
↓ m02-resource: 如果需要,智能指针
"用正确的处理替换unwrap"
↓ m06-error-handling: ? 运算符
↓ m06-error-handling: 带消息的expect
初学者常犯的5个错误
| 排名 | 错误 | 修复 |
|---|---|---|
| 1 | 克隆以逃避借用检查器 | 使用引用 |
| 2 | 在生产中使用unwrap | 用 ? 传播 |
| 3 | 所有东西都用String | 使用 &str |
| 4 | 索引循环 | 使用迭代器 |
| 5 | 与生命周期斗争 | 重构以拥有数据 |
代码异味 → 重构
| 异味 | 指示 | 重构 |
|---|---|---|
许多 .clone() |
所有权不清晰 | 明确数据流 |
许多 .unwrap() |
缺少错误处理 | 添加正确处理 |
许多 pub 字段 |
封装被破坏 | 私有 + 访问器 |
| 深层嵌套 | 复杂逻辑 | 提取方法 |
| 长函数 | 多个职责 | 拆分 |
| 巨大的枚举 | 缺少抽象 | trait + 类型 |
常见错误模式
| 错误 | 反模式原因 | 修复 |
|---|---|---|
| E0382 移动后使用 | 克隆 vs 所有权 | 正确的引用 |
| 生产环境恐慌 | 到处unwrap | ?、匹配 |
| 性能缓慢 | 所有文本都用String | &str、Cow |
| 与借用检查器斗争 | 错误的结构 | 重构 |
| 内存膨胀 | 到处Rc/Arc | 简单的所有权 |
已弃用 → 更好的做法
| 已弃用 | 更好的做法 |
|---|---|
| 基于索引的循环 | .iter()、.enumerate() |
先 collect::<Vec<_>>() 再迭代 |
链式迭代器 |
| 手动unsafe cell | Cell、RefCell |
用 mem::transmute 进行类型转换 |
as 或 TryFrom |
| 自定义链表 | Vec、VecDeque |
lazy_static! |
std::sync::OnceLock |
快速审查清单
- [ ] 没有无理由的
.clone() - [ ] 库代码中没有
.unwrap() - [ ] 没有带有不变量的
pub字段 - [ ] 没有能用迭代器却用索引循环的情况
- [ ] 没有
&str足够却用String的情况 - [ ] 没有忽略
#[must_use]警告 - [ ] 没有不带SAFETY注释的
unsafe - [ ] 没有巨型函数(超过50行)
相关技能
| 当...时 | 查看 |
|---|---|
| 所有权模式 | m01-ownership |
| 错误处理 | m06-error-handling |
| 心智模型 | m14-mental-model |
| 性能 | m10-performance |






