五、注释写得烂,不如不写

57 阅读3分钟

注释写得烂,不如不写

第五章聊"注释",这章看得我手心冒汗——那些年写过的"此处省略100字"注释,简直是公开处刑。

注释是无奈的妥协,不是加分项

作者一句话戳破真相:"注释最多是一种必须的恶"。确实,好代码本身就会说话,需要注释来解释的代码,往往已经烂了一半。

想起之前维护的代码里有个注释:// 这个循环很复杂,别改。现在才反应过来,这不是提醒,是投降——承认自己写得烂,还不让别人改。真正的整洁代码,应该让注释显得多余

哪些注释值得写?救命的那种

不是所有注释都该删,这几种情况确实需要:

  • 法律信息:版权声明这种躲不掉,总不能让律师去读代码逻辑
  • 警示信息// 这里改了会影响订单支付,小心! 这种能救命
  • TODO注释// 等支付接口升级后,这里要换加密方式 相当于贴便利贴
  • 公共API文档:Javadoc这种给别人用的,还是得写清楚参数和返回值

但要注意,这些注释也会过期。之前见过一段注释说"这个值最大100",结果代码里早改成1000了,新人照着注释改出一堆bug。注释和代码必须同步更新,否则不如没有

那些年踩过的注释坑,你中了几个?

作者列的"坏注释"清单,我几乎全中过:

  • 喃喃自语型// 循环开始了 // 这里加1 纯属废话,不如代码本身清楚
  • 多余解释型:给变量userName加注释// 用户名,纯属画蛇添足
  • 误导型:注释说"这是用户ID",实际代码里存的是手机号,坑死后人
  • 注释掉的代码:最可怕的是一大段注释掉的代码,没人敢删,越积越多

最离谱的是见过有人用HTML写注释,<b>重要</b>这种,在IDE里看像乱码。注释的目的是解释代码,不是秀操作

用代码代替注释,才是真本事

作者说"最好的注释是你想办法不去写的注释"。深以为然。比如这段代码:

// 反例:用注释解释逻辑
if ((employee.flags & HOURLY_FLAG) && (employee.age > 65)) {
  // 检查员工是否符合全额福利条件
}

// 正例:用代码说明意图
if (employee.isEligibleForFullBenefits()) {
}

后者根本不需要注释,函数名就是最好的解释。能通过重命名、拆函数解决的问题,别用注释

想起自己之前写过的一段复杂计算,加了三行注释才说明白。后来重构时拆成了calculateBasePrice()addTax()applyDiscount()三个函数,注释全删了,反而更清楚。

最后清理了一波注释

翻了翻自己最近的代码,删掉了这些注释:

  • 所有解释"这段代码在干嘛"的(改成函数名说明)
  • 所有和代码重复的(比如// 用户名注释userName变量)
  • 所有注释掉的代码(直接删,Git里能找到历史)

结果代码清爽了不少,读起来反而更快。突然明白:写注释的最高境界,是让读者意识不到有注释

(下一章讲代码格式,想起自己时而缩进2格时而4格的代码,感觉又要被教育了...)