关于 “注释”,我过去有两个极端:要么觉得 “代码自己能说明白,不用写注释”,要么觉得 “多写注释总没错,哪怕是‘int a=0; // 定义 a 为 0’这种废话”。而《代码大全 2》对注释的观点,彻底改变了我的认知:注释不是 “代码的补充”,而是 “代码与未来维护者(包括未来的自己)的对话”,关键是 “解释为什么,而非是什么”。
书中举了一个例子:如果代码是 “if (userRole == 3)”,注释写 “// 判断用户角色是否为 3” 就毫无意义 —— 因为代码本身已经说明白了 “是什么”;但如果注释写 “// 用户角色 3 代表管理员,只有管理员能执行此操作”,就非常有价值,因为它解释了 “为什么要这么判断”,未来维护者不用去查 “角色 3 是什么含义”,能快速理解逻辑。我突然想起自己之前写的一段代码:“// 延迟 1000 毫秒”,对应的代码是 “Thread.sleep (1000)”。后来我自己看这段代码时,疑惑了半天:“为什么要延迟 1 秒?是等接口返回,还是避免频繁请求?” 如果当初注释写 “// 延迟 1 秒是为了等待上游接口数据同步,避免获取到空值”,就不会有这种困惑了。
书中还强调,要避免 “冗余注释” 和 “过时注释”。冗余注释会增加阅读负担 —— 比如每一行代码都写注释,反而让核心逻辑被淹没;而过时注释比没有注释更可怕,比如代码改了,但注释没改,会误导维护者。我曾遇到过这种情况:代码里判断条件是 “if (age > 18)”,但注释写的是 “// 未成年人不能操作”,显然代码改了(从 <=18 改成了 > 18),注释没改,我当时差点按注释的逻辑去修改代码,幸好发现得早。后来我养成了习惯:改代码的同时一定要更注释,并且定期检查注释是否和逻辑一致。
现在我写注释时,会先问自己:“这段代码的逻辑,过半年我还能看懂吗?别人看的时候会有疑问吗?” 只在 “为什么这么做”“特殊情况是什么”“关键逻辑的背景” 这些地方写注释。比如复杂的算法逻辑、临时的兼容处理、需要注意的边界条件,这些注释能帮未来的自己和同事节省大量时间。《代码大全 2》让我明白,注释不是 “任务”,而是 “责任”—— 对代码负责,也对后续维护者负责。