m15-anti-pattern

m15-anti-pattern

热门

用于审查代码中的反模式。关键词:反模式、常见错误、陷阱、代码异味、不良实践、代码审查、这是反模式吗、更好的做法、应避免的常见错误、为什么这不好、地道写法、初学者错误、与借用检查器斗争、到处clone、在生产中使用unwrap、应该重构吗、反模式、常见错误、代码异味、最佳实践、地道写法

1310Star
110Fork
更新于 2026/5/24
SKILL.md
readonly只读
name
m15-anti-pattern
description

用于审查代码中的反模式。关键词:反模式、常见错误、陷阱、代码异味、不良实践、代码审查、这是反模式吗、更好的做法、应避免的常见错误、为什么这不好、地道写法、初学者错误、与借用检查器斗争、到处clone、在生产中使用unwrap、应该重构吗、反模式、常见错误、代码异味、最佳实践、地道写法

反模式

第2层:设计选择

核心问题

这种模式是否隐藏了设计问题?

审查代码时:

  • 这是解决症状还是原因?
  • 是否有更地道的做法?
  • 这是与Rust对抗还是顺应?

反模式 → 更好的模式

反模式 为什么不好 更好的做法
到处使用 .clone() 隐藏所有权问题 正确的引用或所有权
在生产中使用 .unwrap() 运行时恐慌 ?expect 或处理
单所有者时使用 Rc 不必要的开销 简单的所有权
为方便使用 unsafe 未定义行为风险 寻找安全模式
通过 Deref 实现面向对象 误导性API 组合、trait
巨大的match分支 难以维护 提取为方法
到处使用 String 分配浪费 &strCow<str>
忽略 #[must_use] 丢失错误 处理或 let _ =

思考提示

当看到可疑代码时:

  1. 这是症状还是原因?

    • 克隆以避免借用?→ 所有权设计问题
    • 因为“不会失败”而unwrap?→ 未处理的情况
  2. 地道的代码应该是什么样子?

    • 引用代替克隆
    • 迭代器代替索引循环
    • 模式匹配代替标志位
  3. 这是在与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 CellRefCell
mem::transmute 进行类型转换 asTryFrom
自定义链表 VecVecDeque
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