《代码大全》读书笔记一

来源:互联网 发布:什么职业最赚钱知乎 编辑:程序博客网 时间:2024/04/29 16:11

 

    最近在看《代码大全》,它确实是一本难得的好书,很多困惑都在里面找到了答案。现在天天上班&加班,只能晚上熬夜读书了。好久没有这么勤奋过了,高中毕业以后就开始变懒了,到了今天再也懒不下去了,生活的压力好大------

     不过深夜看书还真有中久违的感觉,只不过高中时是打着手电看小说(注:可不是武侠或者琼瑶大妈之类写的书,偶是只看名著滴)。900多页的书经过一个星期的熬夜总算看了三分之一了,感悟颇多。直到今天才想起来要做个读书笔记,把最经典的部分记下来。如果你是一个程序员或者有志于做个优秀的程序员,推荐你好好读一下这本书,如果你已经读过了,那就有空的时候再读一读。

   经典片段:

  

1、一般而言,绑定时间越早灵活性就会越差,但复杂度也会越低。就前两种方案而言,使用具名常量要在很多方面好于使用神秘数值(magic number0),只要养成了这样的编程习惯,你就可以享受具名常量所带来的灵活性。除此之外,希望获得灵活性越强,那么支持这种灵活性的代码就会越复杂,出错几率也会越高。由于成功的软件开发需要依赖于将代码的复杂程度降低到最小,因此一个熟练的程序员会按照需要引入足够的灵活性来满足软件需求,但是却不会增加需求范围之外的任何灵活性以及相应的复杂度。――《代码大全(第二版)》10.6绑定时间.Steve McConnell

 读书感悟:在刚开始学习编程的时候根本就没有绑定时间的概念,程序里到处都是“神秘数值”。当然了,那个时候写程序只是为了验证学习编程语言。后来有一次写了一个小程序,自认为写得还不错,就在基本功能实现以后想要给它加个配置菜单,就像我们使用的大多数软件一样可以在程序运行的时候改变程序状态和一些初始化变量。这个时候问题就出来了,要在原来的基础上改,那是很难很乱很烦的事情。经过后来的反思学习,才意识到这就是数据绑定时间的问题。根据程序在灵活性上不同的要求,我们可以选择不同的绑定时间。如果只是希望在编写代码事便于程序的修改,程序运行期初始化数据是不需要改变的,比如常量PI的数值(当然了,PI的精确度我们或许在程序运行期需要做设定)、CPU的类型等等---我们可以定义宏或者使用具名常量,千万不要使用magic number!当你的程序写到3000行以上的时候,如果代码里到处都是立即数(常量),接下来的修改完善工作会让你疯掉的。如果对代码的灵活性(而非运行期的程序)有更高一层的要求的话,就可以把宏、具名常量的定义放在#ifndef ---#endif 里面。如果只是在程序初始化时需要灵活的配置数据,就可以在初始化程序时加载相应数据。如果在程序运行期对某些数据有动态需求,就需要对相应数据的访问放使用函数,以提供简洁的访问接口,把负责的数据处理逻辑隐藏在函数里面,增加了灵活性的同时保证数据处理逻辑发生变更时程序复杂度不会增加。

2、通过使用一些巧妙的方法,可以给一个变量赋予多种职责。不过你最好还是远离这种奇技淫巧。――《代码大全(第二版)》10.7为变量指定单一用途.Steve McConnell

读书感悟:如果你过多使用这种“奇技淫巧”,读你代码的人肯定会“诅咒”你的,即使你有详尽的说明。 

3、避免让代码用于隐含含义。把同一变量用于多个用途的另外一种方式是当变量代表不同事物时让其具有不同的取值集合。例如:

变量pageCount 的取值可能表示已打印纸张的数量,除非它等于-1,在这种情况下表明有错误发生;

变量customerId可能代表某个客户的账号,除非它的取值大于500 000,在这种情况下,你通过减去500 000来得到过期账户的号码;

变量bytesWritten 可能表示写入输出文件的字节数,除非它的取值为负,在这种情况下它表示的是用于输出的磁盘驱动器的号码。

应该避免使用具有这种隐含含义的变量。这种滥用在技术领域里被称为“混合偶合(hybrid coupling)”(Page-Jones 1988)。这样的变量庸医两种以上的用途,也就意味着其类型对于其中的任何一项任务而言都是错误的。在pageCount一例中,pageCount在正常情况下表示纸张的数目;在这种情况下它是一个整数。然而当pageCount等一-1时,它表明有错误发生了;整数类型客串了布尔类型!

即使你对这种双重用途很清楚,别人也会感到模糊。使用两个变量保存两种信息,能带来更多的清晰度。同时,没有人吝惜你多用的那一点存储空间。――《代码大全(第二版)》10.7为变量指定单一用途.Steve McConnell