《代码大全2》三

第10–13章把"变量"这件事单独拎出来讲了四章,密度不低。读完的感受是:我们平时对变量太随意了——随手声明、随便赋值、想用就用,结果bug大半都出在这儿。McConnell 把这事讲得很详细。

第一,变量要有"身份感"。​ 第10章讲变量声明的原则,核心不是语法问题,而是语义问题:每个变量都应该有一个明确的、单一的职责。一个变量只做一件事——这个原则说起来简单,实际代码里到处都是违反的。最常见的反例是"复用变量":为了省一个声明,把同一个变量在不同逻辑分支里用来存完全不同的东西。作者明确反对这种做法:节省了几行代码,代价是可读性归零,而且一旦后续有人在错误的分支里引用了它,bug极难排查。我的反思是,自己写过不少"临时复用"的变量,当时觉得聪明,现在看是埋雷。以后宁可多声明几个变量,也不让一个变量身兼数职。

第二,变量的初始化不是小事。​ 第11章讲变量初始化,作者给出的建议很实操:声明时就初始化,不要等到后面再赋值。这听起来像常识,但现实里大量bug就是因为"以为前面赋过值了"或者"这个分支里应该不会走到"。作者特别提到"未初始化变量"是C/C++里最隐蔽的bug来源之一,在Java/C#里虽然编译器能拦住一部分,但逻辑上的"默认值"问题依然存在。我的行动项是:养成一个习惯,变量声明和初始化写在同一行,中间不插任何其他语句。如果做不到(比如值需要计算),那就在声明处给一个明确的哨兵值,而不是让它处于"看起来有值其实没意义"的状态。

第三,作用域和存活时间是变量的"保鲜期"。​ 第12章讲作用域,第13章讲存活时间,两章合在一起讲的是同一个道理:变量存在的时间越短、可见的范围越窄,代码的可靠性越高。作者给出了一个很直观的衡量标准——存活时间(live time):从变量第一次被赋值到最后一次被引用之间的代码行数。存活时间越短,你越容易在脑子里"一次性装下"它的完整生命周期,也就越不容易出错。全局变量为什么可怕?因为它的存活时间横跨整个程序运行期,作用域覆盖所有模块,你永远不知道它在某个角落被谁改成了什么。这和第2部分讲的"缩小作用域"是一脉相承的,但这里给出了更具体的度量方式。

回想之前踩过的坑,有一次排查一个偶现的数据错乱,最后定位到一个全局缓存变量被两个线程同时写入,而"当时觉得不可能并发"——典型的存活时间太长、作用域太大导致的问题。如果当时把那个变量限制在函数内部、通过参数传递,根本不会出这个问题。

读完这部分,一个清晰的行动方向是:以后写代码时,每声明一个变量,停下来问自己三个问题——它只做一件事吗?它在声明时就初始化了吗?它的作用域还能再小吗?三个"是"的话,这个变量大概率是安全的。变量是代码里最基础的数据载体,基础不牢,上层再漂亮的架构也白搭。

posted @ 2026-10-29 20:15  东方既白~(-^-)~  阅读(2)  评论(0)    收藏  举报