其他
审查 Rust 代码反模式时,识别并替换常见坏味道与新手错误
在代码审查中判断某段 Rust 代码是否为反模式,并给出更地道的替代写法。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 48/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 52/100 ×0.15
适用场景
审查 Rust 代码反模式时,识别并替换通用
解决思路
- 审查时先问核心问题:这个模式是在掩盖设计问题吗?它是在解决症状还是根因?有没有更地道的写法?它是在与 Rust 对抗还是顺应 Rust?
- 用反模式→更优模式对照表替换:到处 `.clone()` → 用合适的引用或所有权;生产环境 `.unwrap()` → 用 `?`、`expect` 或显式处理;单所有者却用 `Rc` → 用简单所有权;为方便而用 `unsafe` → 找安全模式;用 `Deref` 模拟 OOP → 用组合与 trait;巨型 match 分支 → 抽取为方法;到处用 `String` → 用 `&str`、`Cow<str>`;忽略 `#[must_use]` → 处理或 `let _ =`。
- 看到可疑代码时按三步思考:1) 这是症状还是根因(为避免借用而 clone → 所有权设计问题;因“不会失败”而 unwrap → 未处理的分支);2) 地道代码应长什么样(用引用代替 clone、用迭代器代替索引循环、用模式匹配代替标志位);3) 是否在与 Rust 对抗(与借用检查器对抗 → 重构;过度 unsafe → 找安全模式)。
- 向上追溯设计理解:问“为什么我的代码有这么多 clone?”→ 检查所有权模型是否正确 → 查 m09-domain(数据流设计)与 m01-ownership(引用模式)。对照表:到处 clone → m01-ownership,问谁应拥有这份数据;到处 unwrap → m06-error-handling,问错误策略是什么;到处 Rc → m09-domain,问所有权是否清晰;与生命周期对抗 → m09-domain,问数据结构是否该改。
- 向下追溯到实现(Layer 1):把 clone 换成正确所有权 → m01-ownership 引用模式、m02-resource 必要时用智能指针;把 unwrap 换成正确处理 → m06-error-handling 的 `?` 运算符、带消息的 `expect`。
- 修复五大新手错误:1) 为逃避借用检查器而 clone → 用引用;2) 生产环境 unwrap → 用 `?` 传播;3) 所有文本都用 String → 用 `&str`;4) 索引循环 → 用迭代器;5) 与生命周期对抗 → 重构为拥有数据。
- 按代码异味做重构:大量 `.clone()` 表示所有权不清 → 理清数据流;大量 `.unwrap()` 表示缺少错误处理 → 补上正确处理;大量 `pub` 字段表示封装被破坏 → 改私有 + 访问器;深层嵌套表示逻辑复杂 → 抽取方法;长函数表示职责过多 → 拆分;巨型枚举表示缺少抽象 → 用 trait + 类型。
- 按常见错误定位反模式成因并修复:E0382 use after move → 用正确引用而非 clone;生产环境 panic → 用 `?` 与匹配代替到处 unwrap;性能慢 → 用 `&str`、`Cow` 代替全 String;与借用检查器对抗 → 重构结构;内存膨胀 → 用简单所有权代替到处 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。