最近在一点一点地读《代码大全(第二版)》,真是一本绝好的书,难怪十几年来会被誉为“程序员的圣经”!虽然曾经不止一次在其他优秀的书籍封底看过出版社对这本书的极力推荐,终于因为期末考的复习太过于枯燥,于是从图书馆找来看看,没想到一看就被前面吸引住了,但直到这个暑假才网购了一本,一点一点的看了起来,很有味道。

买这本书真的很值,里面好多知识点是课堂上肯定不会教的,就连个人在敲代码的过程中也很难靠自己总结出来的,这也印证了作者在前言中对本书的定位与期望——“希望缩小本行业中一般商业实践与大师级人物及专家们之间的知识差距”。

进入正题,譬如“变量”这一章,就如文章标题所示,看了“变量”这一章中关于作用域(Score)这一小节才初识了两个名词——变量跨度、变量存活时间。作用域是我们都熟悉的名词,而后面这两个是我从书上看到的,觉得很有必要记在脑里。下面大概整理出作者对这几个名词的描述:

作用域(score):可以看作一种衡量变量知名度的方法(作者诙谐的比喻),也称可见性(visibility),指变量在程序内可见和可引用的范围;

跨度(span):衡量一个变量的不同引用点的靠近程度,即两个引用点之间相隔的语句数;

存活时间(live time):指一个变量存在期间(即从变量声明到最后引用该变量的那条语句,跟作用域有点出入)所跨越的语句总数;

***窗口(window of vulnerability):指介于同一变量多个引用点之间的代码。

 

光是描述不够直观,给出截图:

4A0SFU[BLV3C[3G[DHVQ4]Q

很明显我们从三个不同的图中看到了不同的描述,即长、短两个修饰词。很明显是第三个图的代码质量是最高的,可能需要说明一下作者区分出这几个名词的意图才能说明情况。

1、从第二个图来看,当变量跨度过大时,***窗口也就越大。此时如果我们在变量的两个引用点之间的代码进行了某个操作,而这个操作可能会不小心或者不适当地修改了该变量的值,那么在下一个引用点中所用到的变量值将会是错误的。这也就是为什么这一范围内的代码被称为***窗口的原因。

为了减少这一类 bug 的发生,写代码时应该尽量局部化变量引用,将对某个变量的使用集中在一起,以缩小***窗口范围,也就是缩小变量的跨度。此外,在一个相对较集中的代码范围内使用某个变量,使得我们在阅读、复查代码时所关注的范围更小。任何人(包括写代码时)都不喜欢在读代码时目光不得不跳来跳去的搜索某个变量最近被赋值为什么了吧?

2、变量跨度这一概念一定是存在于变量存活时间的范围内的,那么同样的道理,缩短了存活时间也能够减小***窗口带来的威胁。短的变量存活时间除了使代码更具可读性,还可以使得我们在修改代码时的关注范围更小,有利于重构的进行。

譬如有时需要把原来顺序执行的代码改为循环结构时,存活时间短的变量就可以使得我们不容易忽略掉那些离循环结构太远的初始化代码,循环次数控制变量经常出错很多就是源于这一问题。

再如重构,在《重构》中作者说“Moving methods is the bread and butter of refactoring(转移方法是重构的根本)”,而 Move Mothod 这个重构手法又必须建立在 Extract Mothod (提取方法)之上,毕竟当我们恰当地提取方法之后才能够转移这个方法到合适的地方去。但是如果某个变量的存活时间很长,代码中间隔着使用到了该变量,那我们还怎么提取方法呢?更谈不上转移方法了。

 

小结:

1、看了《代码大全》,才知道以前自己写代码是多么糟糕;

2、写这篇文章的原因,是想要记住这几个关于衡量变量使用情况的名词,而想要记住这几个名词的原因,是想要促使自己以后在写代码时会自然而然地想到这几个名词,接着又会联想到关于变量使用时应该遵守的原则;

3、最后想说的是,这些内容真的是课堂上、其他书都不怎么能够学习到的,即使别人的代码已经遵守了这些原则,我也未必能够很快地注意到原来还有这么一个注意点呢。总之一句话,《代码大全》绝对值得看!O(∩_∩)O