如何阅读别人的代码
拿到一个开源项目后:至少要阅读两遍:第一遍获得程序的整体框架、运行流程、各个类的功能、接口;第二遍获得自己关心的部分的具体实现,增加积累。
具体步骤:
0、了解项目,阅读features。以此来搞清楚该项目有哪些特性;
1、下载源代码之后,首先要跑起来(注意每一个控件的作用)。
2、找到项目的入口点。
3、从入口点所在的那个源文件开始阅读,逐步把握整个项目是如何启动起来的。 尝试理解一个系统的内部结构,多少组成部分,主线模块是哪些?辅助模块是哪些? 尝试使用UML类图画出项目的结构。
4、从实际需要出发,修改这个项目,满足自己的某一个小的需求。
在此之前,尽量不要在网络上找答案。
5、看看相关的讨论与心得,看看是否与自己的理解相一致。
6、提交bug fix或者某个新的功能代码。
在学习开源的过程中,有几个方面,会获得大量的收获:
1、架构与模式
2、开源社区常见的一些惯用法
3、相关领域的结构与算法
Tips:
学习开源,就尽可能在代码里找答案,而不是在代码之外找答案,那些都是二手的,而且很可能是不准确的。
从简单做起。刚开始的时候学习一些领域内基础理论,然后找一些简单的东西去实现,不用一开始就去找开源项目。经常动手写一些小程序,如改进宿舍网络登录客户端等。积小成多,就能显著提高自己的编程能力。
首先构想一个你想做的东西,比如论坛、博客、微博什么的。
然后自己思考需要什么功能,应该怎么去实现,尽可能包括细节,有必要时记录下来。
最后去找个类似的开源应用,看看它是怎么实现的,和你的想法有什么差异,有什么可以学习或需要改进的地方。
不懂的问题可以google,此外stackoverflow是一个很不错的问答网站。
一本好书:《代码的阅读与实践》
网上一个高手的建议:
开源项目学习步骤:
1)阅读features。以此来搞清楚该项目有哪些特性;
2)思考。想想如果自己来做有这些features的项目该如何构架;
3)下载并安装demo或sample。通过demo或sample直观地感受这个项目;
4)搜集能得到的doc,尽快地掌握如何使用这个项目;
5)如果有介绍项目架构的文档,通过它了解项目的总体架构,如果没有,通过api-doc了解源码包的结构;
6)分两遍来阅读源码。第一遍以应用为线索,以总体结构为基础,阅读在应用中使用到的类和方法,但不用过深挖掘细节,对于嵌套调用,只用通过函数名了解最上层函数的意义,这一遍的目的在于把大致结构了然于心。第二遍就是阅读类和方法的实现细节,以第一遍的阅读为基础,带着疑问去阅读那些自己难以实现的模块。
7)总结。回味这个项目设计上的精妙,用到了哪些设计模式,能在哪些领域可以借鉴等等。
代码阅读方法:
1、一边阅读代码一边写注释。这是我用过的最好的方法,对代码理解得更深入,看一些重要代码或者特别难懂的代码时挺有用。更何况,注释也是一种文档嘛。
2、一边阅读代码一边绘制UML。这个方法适用于类之间的关系较复杂和调用层次较深的情况,我一般都是先绘制顺序图,然后为顺序图中的类绘制关系图。
3、通过Debug来跟踪程序的主要执行过程,这样就可以分清主次了,阅读的时候更有针对性。
4、类的快速阅读。先弄清楚它在继承链中的位置,看看它的内部状态,也就是成员变量,一般来说,类的对外接口都是对成员变量的访问、加工、代理等,然后看看它的对外接口,也就是公有成员函数,识别核心的一个或多个函数,这时候你应该可以大概了解这个类的职责或作用了。可能这个类是某个设计模式中的一个组成部分,所以,设计模式的掌握对代码的快速阅读也是很有帮助的。
5、带着问题去阅读。比如想了解android中的消息机制,那么看看Looper、Handler、MessegeQueue这几个类就可以了,其他的不要去看,要不然就跑题了。
下面列几个阅读源码时所处的情景,在特定场景下用哪些方法:
不太熟悉业务逻辑,还不是很清楚它是干啥的,可以用3、5。
代码量很大,有几十万行,甚至百万行,可以用2、3、5。
你无法看见程序的运行过程,比如没有用户界面,也有可能是无法运行的,可以用3、5。
设计复杂,用了大量的设计模式,调用链很深,可以用1、2、3、4、5。
时间有限,没有那么多时间让你看源码,可以用3、5。
附:
一个合适的UML工具:
UML建模工具有Visio 、Rational Rose、PowerDesign(http://developer.51cto.com/art/201006/207993.htm);visio不支持java的,后两者都是庞然大物。其实简单用用UML,其实不需要Rose,Together这样的大家伙
Jude, EclipseUML都不错,而且都是免费的。如今Jude已经并入astah,其社区版是免费的,可以支持UML1.4和部分UML2.0。
因此,对于初学者,推荐使用visio+astah。