开放源码和商业产品的源代码有本质上的不同。这种不同体现在以下几个方面:
- 开放源码项目的作者在开发时就意识到自己编写的代码要被别人阅读,故而在规范的遵守,算法的优化方面都格外用心。
- 开放源码没有严格的时间限制,无需时间与质量的权衡,产生的代码质量更高。
- 开发源码能够做到优胜劣汰,拥有更快的更新速度(评判优劣的唯一标准是代码的质量)。
- 开放源码没有权威崇拜。
计算机科学是一门实践性很强的科学,很多内容往往在书本上根本学不到。而代码中往往凝聚着许多实践性的知识,通过阅读代码才能真正掌握软件开发的真谛。
为什么以及如何阅读代码?
有时,阅读代码是一件不得去做的事,比如:为了修复,检查或改进现存的代码,都必须去阅读相关的代码,有时候,阅读代码也许是为了了解程序是如何工作的,对于任何能够“打开盖子”的事物,或者仅仅出去个人兴趣。
要养成一个习惯,经常花时间阅读别人编写的高品质代码。就像阅读高品质的散文能够丰富词汇、激发想象力、扩展思维一样,分析良好的软件系统的内部结构可以学到新的架构模式、数据结构、编码方法、算法、风格和文档规范、应用程序编程接口(API),甚至新的计算机语言。阅读高品质的代码还可以提高您编写代码的水准。
代码阅读过程中可以使用的武器之一就是:用编译器对代码进行编译,检查产生的警告消息。
标准C,C++和Java程序从函数(Java中为“方法”)main开始执行。第一次分析一个程序时,main是一个好的起始点。要注意,一些操作环境,如Microsoft Windows、java applet(小应用程序)和servlet(小服务程序)的宿主、掌上电脑和嵌入式系统可能使用其他函数作为程序的入口点,例如WinMain或init。
在分析重要的程序时,最好首先识别出重要的组成部分.
要了解函数(或方法)的功用,可以使用下面的策略:
- 猜,基于函数名;
- 阅读位于函数开始部分的注释;
- 分析如何使用该函数;
- 阅读函数体的代码;
- 查阅外部的程序文档。
在阅读代码时,常常会采用渐进式理解的方式;理解了这一部分代码可能会使得其他部分变得十分明晰。基于这种渐进式理解的方式,可以使用类似组合拼图游戏是采用的策略,来理解困难的代码,从容易的部分开始。
While语句的循环体既可以是单个语句,也可以是一个代码块——括在或括号中的一个或多个语句。所有控制程序流程的语句,也就是if,do,for和switch,都是如此,程序中一般会将组成控制语句的相关语句(即组成if,do,for或switch代码体的语句)缩进。但是,缩进只是对人类程序阅读者的一种直观提示:如果没有花括号,控制结构将只影响控制语句之后的单个语句,不管缩进如何。
Switch语句用于处理若干离散的整形或字符类型的值。处理每个值得代码之前是一个case标记。当switch语句中表达式的值与case标记中的某个值匹配时,程序将从该点向前执行语句。如果没有标记值与表达式的值匹配,并且存在default标记,则控制将转移到该处;否侧,switch块中没有代码会执行。请注意:执行控制权转移到一个标记后,遇到其他标记不会结束switch块中语句的执行;要停止处理switch块中的代码,跳转到switch语句之外继续进行,必须执行一个break语句。这项特性经常用来将多个case标记归到一起,合并公共的代码元素。
给定case或default标记的代码,在结束时如果没有语句(比如break,return,或continue)将控制权转移到switch外部,程序将继续执行下一个标记后的代码。分析代码时,要留心这种错误。
大多数情况下,无限循环用来表达在循环开始或结束时退出条件无法指定的循环。这些循环一般不是通过return语句退出函数,就是通过break语句退出循环体,或者调用exit或类似的函数退出整个程序。C++,C#和java程序还可以通过异常跳出这类循环。
大多数情况下,break用于提前退出循环。Continue语句则跳过该语句到循环末尾之间的语句,继续最内层循环的迭代。Continue语句会再次计算while表达式的值,并执行循环。
要确定break语句的作用,请从break开始向上阅读程序的代码,直到遇到包含break语句的第一个while,for,do,switch块为止。找到循环后的第一个语句;break执行后,控制权就会转移到这个地点。类似的,在分析包括continue语句的代码时,请从continue语句开始向上阅读程序,直到遇到包含continue语句的第一个while,for,或do循环为止。找到循环的最后一个语句;紧随其后(但不是循环的外部)就是continue执行后控制权将转移到的地点。请注意,continue忽略switch语句,break和continue都不会影响到if语句的操作。
有时,循环的执行只是为了得到控制表达式的副作用。这种情况下,continue往往用作占位符,代替空语句(用一个单独的分号表示)。