阅读和定位源代码的技巧

阅读源代码是一种很重要的能力。新进入 一个公司、参加一个项目、接手一个系统、学习一个框架,都需要我们能够很快地切入已有的代码,找到其中的关键类和关键逻辑,以便我们能够对代码进行调试、修改和扩充。但是那么大一个代码库,要从中找到控制某个页面某个按钮逻辑的代码,乍看起来,真像是大海捞针,全无头绪!那么,有些什么窍门能够帮助我们快 速切入,定位到自己想要的代码呢?我这里就抛砖引玉说几种。

目录

[隐藏]

静态查找 方法 - 无 需运行代码来查找

问人

这个是最简单快捷的方法了,大家一定要用好,找到合适的渠道在合适的 时间做合适的沟通 -- 这个可是关乎沟通能力的哦。不过也别忘了这种方法的缺陷。首先,你要找到合适的人;其次,那个人要有时间来回答你的问题;再次,那个人要记得你所问的问题大致在什么位置。最后,你也丧失了一次锻炼代码阅读能力的机会。所以,这种方法最好是在必要的时候 采用,呵呵!

通过Eclipse的引用功能查找

如果已经知道或者被告知相关的类,要找到有哪些其他的代码使用了这个 类,那么最直接的就是在这个类上点右键,然后点击 Open Call Hierarchy或者Refereces -> Workspace,让Eclipse自动找出使用它的代码。对方 法也可以用同样的操作。与引用查找类似的还有继承关系的查找,就是通过点Open Type Hierarchy来找出这个类的子类。

通过全文 搜索类名/文件名 来查找

有的时候,一个类并不是直接被其他类使用的,而可能是在配置文件中配 置的。这个时候,就只能通过全文搜索来查找了。根据已知的类目来全文搜索,就可以找到引用了这个类的配置文件 - 如Spring的bean配置文件,或者service的配置文件,或者其他自定义 的配置文件等等。

找到了配置文件,但是如果你不知道配置文件究竟是怎么发生作用的(特 别对于一些自定义的配置文件),又该怎么办呢?这个时候,你可以继续全文搜索来查找:

你可以搜 索这个配置文件的解析代码 - 例如,如果配置文件中 有一个比较特别的element叫做xyz,那么你就可以搜索xyz,因为解析代码里面一般应该会根据xyz去读取这个element

你也可以 根据这个配置文件的文件名去搜索 - 既然系统能够解析这个 配置文件,那么它一定要先找到这个文件。无论这个文件名是hardcode在代码里面,还是配置在另外一个配置文件里面,聪明的你一定可以顺藤摸瓜,找到相关的代码的,是吗?

现在虽然已经找到解析配置文件的代码了,但是还是没看出来究竟是怎么回事,又该怎么办呢?别急,通常配置文件解析后会变成一个bean,这个bean里面的配置信息一定会有其他的类去引用它的,顺着这种引用关系,你一定可以找到要点的。

通过全文 搜索界面特征串来查找

你看到了一个页面,怎么找到这个页面的实现逻辑究竟在哪里呢?一般可 以这样来查找:

首先找页 面模板。看看这个页面上有没有比较特别的字符串 - 这个字符串可以是用户 可以看见的文本,也可以是form里面某个字段的name,总之越是特别就越好。然后用这个字符串来全文搜索,自然可以比较精确地找到对应的模板的。

找到页面 模板后,接下来你可以要找是哪些代码生成的这个页面显示的数据,或者要找是哪些代码处理了这个页面提交的数据。这个过程稍微有点复杂,还需要对WebX的映射规则有相当的了解...... ...... 唉,具体的这里就不赘述了, 欢迎高手顶贴完善!

动态查找 方法 - 通 过运行代码来查找

调试

这种是最常用的方法了,有IDE的帮助,直观方便。但是也别忘了,调 试虽然方便,却是极其的低效哦!高手通常在调试上花费的时间是很少的,除非是特别复杂的逻辑或者是比较诡异的问题。还有,调试的方法一般只适合来查找自己有些熟悉的代码,否则就会像掉进了原始森林,很快就会晕头转向!所以,调试的应用范围有限,这里就不赘述了。

看Log

这种方法也非常有效,因为Log会如实地反映执行过程中所发生的一 切,特别当Log打 的比较好的时候,能够很清晰地说明问题。而且Log能够为你提供静态查找的入口,因为你可以通过查找Log中的关键字快速找到究竟是哪个类打出 来的!当然,Log也 有自己的缺点,那就是Log有时候太多,而且很多Log可能看不懂(多数程序员打的Log怕是都只需要也只有自己能看懂吧~~)

打Stack Dump

如果你已经通过某种方法找到一个比较核心的业务类了,那么恭喜你已经 深入腹地了。但是,你可能对于这个类究竟是怎样被调用的、处于一个什么执行流程中还一头雾水。这个时候,你可以修改代码,在合适的地方加入一条 Thread.dumpStack(), 把调用链打出来。用这种方法,你可以轻易地抓出一系列重要的更加底层的类,然后顺藤摸瓜,把整个流程全部打通!

边查边记录

有时候代码和逻辑可能非常复杂,很多个类绕来绕去的,让人眼花缭乱,很快就发晕了。这个时候,你需要一个强大的记忆系统来帮助你整理思路、记录历史。最好的方法是用图来记录,UML就是一种。当然你也可以用自己独创的方法,不过缺点就是只有你自己能看懂。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值