前言:这一段时间接触了新的项目,要在此基础上进行功能的修改。不可避免的需要梳理代码,过程比较痛苦,于是在浏览了几篇优秀文章的基础上加上自己的理解总结出几个阅读代码的技巧。
预先对程序实现进行分析
这是一个在真正读代码之前的技巧,就是先对程序的实现进行假设分析。微软官方现在有了必应每日壁纸,功能就是每天更换最新的图片作为壁纸。我们以此为例对功能进行分析:更换壁纸是操作系统级别的操作,需要win api的支持。每日图片可以在浏览器里找到添加定时任务下载。读之前想象一下自己要写的话该怎么写,再读源代码的时候就有据可依了。
整体与细节
如果手里一份完整的代码,最有效的了解方式一定是打开代码观察目录结构。首先从整体开始,摸清项目的架构而不要过分地关注细节。可以将某些具体的方法或者类看作黑盒,只关心输入输出,不仔细追究具体实现。在这个过程中可以大胆地假设,对某些点有了猜想之后就坚持它直到出现明显的反例。
情景分析
当涉及到某个具体的功能点时,可以构造出一个场景,以此为线索进行梳理。比如一个点击按钮跳转页面的功能:首先找到场景的入口,就是对按钮的点击,然后到代码中寻找点击事件的相关代码,在函数的入口打上断点进行逐步分析。在你认为关键的地方再打下断点,观察运行停止时的堆栈情况、代码值等的状态。编写调试语句(log)观察反应,验证是否与猜想的功能,运行结果、流程相符合。
程序的关键—数据结构
我在一篇文章中看到了一句话,我的大学老师也讲过,程序=算法+数据结构。这句话出自尼古拉斯·沃斯(获图灵奖),我也觉得说的很有道理。但是在此强调的不是算法,而是数据结构。对核心的数据结构进行分析,理清数据结构之间的关系同样对阅读源码有很大帮助。比如经典的HashMap,实现原理分为两块,数组和链表。搞清楚链表结构是对数组结构的补充就方便对其他细节进行理解了。
做好阅读笔记
在读源码的过程中最好准备好纸笔(除非你是jeff)随时进行写写画画。有的代码一环套一环,顺着看下去可能没一会就忘了自己从哪来的,这时候随看随记就显得弥足重要。读的时候在代码上添加注释,避免自己看过了又忘了的情况发生。
工欲善其事必先利其器
使用一款自己趁手的工具同样是十分重要的。我现在主要使用的IDE是idea,常用的技巧比如按住ctrl点击方法名会跳转的实现,双击shift搜索相关文件等等的技巧,这个可以搜索一下相关的文章会有详细的介绍。
前置条件
在阅读代码时有的时侯也需要先了解相关的算法、技术、结构等原理。比如你从来没有使用过python却要看一个爬虫框架,那么我建议你还是先了解基本的python语法,web相关知识为好。另外了解常见的设计模式也是一个不错的方法。
模仿与学习
在阅读源码的过充中学习优秀的方法与模式,理解后以后可以直接拿来使用。Map->AbstractMap->HashMap,这一套看下来多少会有些收获,在自己的代码中可以直接应用里面的经典思想。
最后
总之,阅读源码就是要多问,多思考,多总结。既又输入也有输出。