首页/开发/代码质量与评审速查/一个改动只做一件事
代码评审64 条

一个改动只做一件事

单一职责同样适用于变更:一个 PR 只解决一个问题;混合多个主题的改动难评审、难回滚、难二分定位。

一个改动只做一件事

单一职责同样适用于变更本身:一个 PR 只解决一个问题。混合多个主题的改动很难评审(评审者要同时对多件事建模)、很难回滚(想撤一个却要连带别的)、也很难二分定位(出问题不知道是哪个主题引入的)。判断标准很直接:能否用一句话说清这个 PR 做什么。

基本信息

判断标准能否用一句话说清这个 PR 做什么
拆分信号描述里出现「顺便」「同时」这类连接词
典型反例全库格式化 + 修缺陷 + 升级依赖混在一个提交
目标状态每个改动独立可合入、独立可回滚

常见混装组合

  • 格式化或改名 + 真实逻辑改动:噪声淹没重点,评审者放弃细看。
  • 重构 + 新功能:行为变化与结构调整交织,出问题无法归因。
  • 依赖升级 + 业务改动:依赖引发的问题被业务改动掩盖。
  • 缺陷修复 + 顺手的小优化:回滚时无法只退其中一项。
  • 文档补充 + 代码改动:文档改动本可单独快速合入。

混装改动的代价

维度单一目的多主题混装
评审只需建立一次心智模型多件事交织,容易看漏
回滚干净退回一项退回会波及无关改动
二分定位提交边界即问题边界问题归属无法确定
沟通描述可以很简单描述写长也说不清取舍

自查问句

自查问句
# 1. 这个改动能用一句话说清吗?不能就拆
# 2. 如果只回滚其中一半,代码还能工作吗?不能说明耦合了
# 3. 描述里出现了「顺便」「同时」吗?出现就考虑拆
# 4. 每一部分能否独立通过 CI?不能就调整拆分顺序
单一目的的 PR 让回滚成为干净操作,而不是连坐:这一点在线上出问题时尤其值钱。
拆分方式按可独立合并的小步提交:先机械改动,再结构调整,最后行为变化,每一步都保持可构建。

易错点

  • 顺手全库格式化:真实改动被淹没,评审者直接放弃细看。
  • 多主题混合后回滚:想撤一个改动却波及全部,热修时间被拉长。
  • 把多个小修复堆在一起:其中一个需要返工时,其他几个也被扣住。
  • 拆分但不保证每步可合入:中间态编译不过,主干长时间不可用。

数据来源与参考

  • Google Engineering Practices · Small CLs(单一日标改动)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌