首页 > 代码库 > 读书笔记

读书笔记

  出于对“代码大全”这个名字的好奇,我选择了先读一读《代码大全》这本书。

  正如在译序中所提到,这本书不是“源代码”大全之类的书籍,而是一本讲如何达到“code complete”,即“代码完成”的书籍,它详细地介绍了软件构建的必需技术,告诉读者如何提高代码的质量。

  在阅读建议中,我看到了对“低年级学生”的建议是阅读“变量名的力量”这一章节,于是我先跳到这一章节进行阅读。阅读过程中没有什么难以理解的地方,但遇到许多在之前编程过程中没有考虑到的内容,我做了一下总结:

  1、我们编写的代码的主要阅读者不是机器,而是人,因此一个好的程序必须具有很好的阅读性,可读性强的变量名是保证程序整体良好地阅读性的强力武器。

  2、一个好的变量名必须完整准确的表达变量所代表的含义。人们会知道 studentName 代表的含义,但很少人会反应过来 sn 是什么意思,更不用说 a,b,c,x,y 之类的命名了。

  3、在为特定变量命名时,变量名要准确表达其含义。比如对于bool类型的变量,我的(甚至是许多人的)编程习惯便是把所有这些变量命名为各种flag,而这种做法在书中是被全盘否定的。因为像 if(isFull),if(found) 这样的变量远比 if(flag) 这样的代码更易阅读。

  4、通过添加前缀,可以更好的区分代码的不同的成分,比如类中成员变量添加 m_ 来表示,在全局变量前面加上 g_ ,等等。  

  5、书中还有一种有趣的说法:假如当你和其他人在电话中讨论代码时,如果你无法读出自己的代码,那么你的代码就是糟糕的。这种说法虽然有些夸张,但无非是向告诉我们,一个好的变量名(还有子程序名等等)是多么重要。

  此外,这一章节中还提到,程序员在开发过程中会把更多时间用在阅读代码而不是编写代码上。这点我本不是很明白,但想想这次的结对编程作业,只有先看懂了代码的框架,各个类的结果和功能,每个接口的作用,才能着手代码的修改。如今的项目大多是由团队完成,这意味着将有大量的代码不是你所提交,但是你又不得不要与其工作、修改和扩展它。因此我们必须同时具备阅读他人代码和写出方便他人阅读的代码这两项能力。

 

  随后我开始阅读书中建议“高年级学生”(书中对高年级学生的解释:正在从学术环境转向专业开发环境的学生)阅读的章节:“防御式编程”。    

  在阅读“防御式编程”的过程中遇到了第一块不太理解的内容:断言和错误处理。书中有一句话:“用错误处理代码处理预期会发生的状况,用断言处理绝不应该发生的状况”,这句话让我很是困扰。由于没有怎么用过断言和错误处理,继续往下看也是看得模模糊糊,始终没搞明白断言和错误处理到底应该分别用在何处。于是上网查阅了一些软件开发人员对于这两项技术的经验,又看了两遍书,搞清楚了一些,自己稍微总结了一下对这句话的理解:
  断言主要是用于程序开发阶段,用于检查自己所编写的程序是否有误。比如如果我们希望自己写的一个函数的某个参数在函数执行后不应该改变,那么就可以这个函数后面使用一个断言,判断参数是否改变。如果断言失败,说明肯定是我们所写的函数出现了错误,必须对这个函数进行修改,以实现函数的正确功能。所以,一般来说断言只会的在编译的时候执行,而不会再产品代码中生成。所以断言主要用于给程序开发者检查程序内部的错误,即处理“绝不应该发生的状况”。

  错误处理主要是处理来自外部的输入数据中的错误输入。比如有一个计算器程序,里面有sqrt()函数用来求平方根,要求输入的为非负数。如果遇到了一些爱“捣乱”的用户想要试试输入-1的结果,那么一个好的程序绝不应该是在用户输入-1之后就崩掉了,而是应该由程序员根据一些预期会发生的错误设计相应的错误处理,比如弹出一条错误信息,等等。这应该就是这句话所指的“处理预期会发生的状况”。

  这一章节暂时还在阅读中,这次的读数笔记就先写到这里。

读书笔记