尽信书则不如无书
尽信书则不如无书--忘了这句话的出处了,但是本猫觉得它特正确.特别是现在市面上什么书都有,良莠不齐,这句话就更显的正确.而且,就算是很多被称为经典的书籍,里面也有很多值得商榷的地方--很简单,再经典的书也是人写的,观点总是有不够全面的地方.如果对书的内容不加分析的全盘接受,不能具体情况具体分析,那就更是还不如不看这本书了.
最近市面上出了不少国外计算机经典书籍,C++编程方面的就有Effective C++, C++ Premier,C++ Programming language等等等等.这些书的作者功力深厚,内容安排与以前国内常见的书籍颇有不同,相当多的人都在研读.但是如果把他们当成圣旨,认为其中的全是金科玉律,就有点过了.
前一段项目组里新来了一个程序员.在项目进行过程中,偶然间发现他改了旧代码中的
不少内容,仔细看了一下,大概有这么几类:
1.函数声明中的int, long之类的参数都改成了constant int&,或者constant long&.
2.把相当多的int变量改成了unsigned int
3.把循环变量for(int i = 1; i < 10; i ++)这样的循环声明改成了
for(int i = 1; i < 10; == i)
本猫发现就找他谈,他引经据典的跟本猫解释:
对于第一类修改,在Effective C++中作者专门说过,要尽量用常量引用(constant ..&)来替代一般的参数声明,这样程序不容易出错.
对于第二类修改,也就是说把int变量改成unsigned int,是因为该变量是用来表示长度或者别的只有正数的状态,某本书里面这样说过,能用unsigned int的地方就坚决不用int.
至于第三类修改,在某本经典书籍里说过,i++会产生一个临时变量,这个临时变量在此处完全是浪费,用++i就不会有这种浪费,等等等等.
本猫听了一笑,按说这个程序员还是很努力,还真看了不少书,可惜有的东西并没有吃透.于是本猫跟他解释:
首先,最重要的,一个工程里面应该有纪律,不应该你修改的地方就绝对不能修改,因为旧的代码已经经过了严格的测试,已经相当稳定,如果不是发现功能上的问题,就不应该动,因为这样的修改只意味着可能带入新的bug.
其次,尽信书则不如无书,并不是书上写的就一定正确.
拿第一类修改来说,首先,在效率上,int型参数与constant int&型参数是一样的,因为
此时传值(int型)和传地址(constant int&)都是4个byte--这与大对象的传递是完全不同的;其次,按书上说,constant int&型参数声明最大的好处是,当程序员在该参数位置上错误的使用了其他类型的变量,比如说short或者long以后,编译器可以报错--但是这对我们来说并非一定是好处,很多情况下我们需要在这个参数的位置上用short型的变量,因为这样简单方便.具体的说,比如我有一个变量
short a;
如果函数声明是:
void func(int)
我可以直接使用func(a);
但是如果函数声明是:
void func(const int&) 的话,
我就要先声明一个int型的临时变量,把它设成a,然后才能调用func--显然很不方便.
至于第二类修改,说能用unsigned int的地方一定要用unsigned int, 这句话本身没有毛病,但关键是什么地方能用?经常有这样的情况:一个变量正常的时候是正数,但是需要用负值来标志特殊状态.比如说一个变量是用来表示长度的,但是当长度不确定时,就应该把它设成负值.所以,只要能保证值域正确,用int来代替unsigned int对我们只有好处.
再说第三类修改,用++i代替i++可以节省一个临时变量,这个说法当然没错,能省一点内存当然好.但是这样一条经验真的很重要?现在一台PC的标准配置是128M内存,那4个byte就那么珍贵?而且现在编译器绝对可以把那个多余的变量优化掉.你觉得这4个byte跟你付出的时间那个更珍贵些呢?
那个程序员听了后表示认同.本猫则想起了其他的例子.
比如说goto语句.几乎所有的书都说应该避免goto语句,说goto如何丑陋.但是看看一些高手写的程序,linux,或者是微软的库代码,还是可以发现goto的踪迹.实际上,在一个函数内使用goto语句进行跳转,是处理错误的常用方法,非常简便实用.有什么理由就因为那些学院派的人说它破坏"美感"就要弃之不用呢?
再比如说,有的书上说应该用C++新标准中的新的类型转换语句来替换以前的静态类型转化.但是真的有必要吗?其他的我不知道,至少本猫曾在C++ Programming Language中读到过,该书的作者并不喜欢用新的类型转换,所以他还是用老的静态类型转换来写例子.
说了这么多,还是那句话:尽信书则不如无书.对书里面的内容还是要有选择的接受.记得以前见过这样一句有趣的名言:"死书读活人,能把活人读死;活人读死书,则能把死书读活"...