读懂Java代码总结
代码不要忙着细读。要粗,找到大体的脉络。
要改。根据自己的设想,大胆去改,改了之后就运行,看看是否有预想的效果。动手才能有收获。
找简单的任务赶快做起来。上司没有布置任务,就自己给自己布置。
不要偏执,做不出来的事情不要硬撑,要及时放弃,或者求教。
了解全局的时候,关注执行流程、层次、调用之类的,对细节不求甚解,看不懂的,底层的,跳过就是。
读细节的时候,就只读系统内自己关注的某个点,甚至某个具体的方法或者函数,一行一行慢慢啃。
读代码和写代码一样,你得先明确目标。漫无目的的读代码是不会有结果的,就如你自己都不知道写什么功能的情况下,能写什么代码?
既然明确你想了解的具体功能,接下去就简单了,你只要找到这个功能的切入点,按代码顺序读下来就可以了,读代码的速度取决于你对整体代码的熟悉程度,刚上手肯定会慢一点
整个过程中最关键的是找切入点,我看了很多新手程序员根本找不到他想看的功能该如何看起,那就需要一些技巧了,找一些不会变的关键api来作为索引的关键字,比如网络相关的肯定有recv,文件相关的也就是fread这样的一系列函数。
没有做关注点分离的代码就像图像处理软件里面多个图层最后“Merge Visible”的产物,一般来说除了原作者谁也还原不了最初的思路,除非遇到水平远远高出的高手。他能还原是因为他很早以前做过一样的事,知道中手的思维方式
重构的过程真的是这样,你会发现首先要把代码用一种重构手法整理完之后,才能够再用另一种重构手法对解开的代码进行进一步的整理
根据我的经验,把握粒度很重要,每行每行读是不现实的,这样容易造成只见树木不见森林,但是又不能读的太粗糙,否则错过很多精华部分,以c代码为例,我一般是先以文件为单位,看看每个文件大致是干嘛的,然后再以函数为单位,这时不关心函数的具体实现细节,而是将注意力放在函数接口上,大致理解下函数的意图,控制流的流动等,然后觉得哪个函数比较重要,在看看其实现。。。
如果一上来就一行一行的啃就图样图森破了,上述过程完成之后,如果还有余力,最好亲手实现一下,正所谓知者行之始,行者知之成,知行合一,如果能自己写一个,就说明真的掌握了。。。
好像没人说这个。。。应该先打开它的trace或debug日志,跑起来,然后跟踪日志,可以最快的熟悉代码
读代码切勿一开始就钻进一些细节。就像工作中接触一个新项目,新人也是从解bug 开始。带着目标问题去读,效果更好。
要掌握一个整体架构,不妨自己动手画出一张完整的类图,对于理解代码架构非常有帮助。
一些主要的业务逻辑,继续画些流程图顺序图,就一目了然了。
最后才是语法方面的问题。我认为好的代码一定也是阅读起来超爽的......
如果没有技术文档,就阅读所有能找到的材料。项目介绍,wiki,源码包的readme等。明确项目的目标,应用场景,甚至是用到的技术方案。
根据源码包的架构,以及了解到的用到的技术方案,大概猜测一下各个模块的功能。
同样浏览所有的源码文件,通过文件名字猜测其功能。
推荐使用某些代码阅读工具,如source insight,开始通读代码。阅读的顺序就比较灵活了,可以按照模块来阅读,可以先大致浏览核心部分再到外围代码,或者反过来从外围到核心包围。
经过第四步的通读,大概就能明确各个模块的功能以及各模块之间如何结合的了,这时在心里已经对整个代码结构有个大致的印象了。如果做不到,就重做第四步。
细读部分代码。比如你感兴趣的部分是如何实现的,或者核心部分的细节。同样我认为,带有某种目的的阅读更有效,比如想借用某部分的实现思路,想改进某部分,那就针对自己的目标部分进行重点攻破。
经过以上几点,相信整份代码已经都理解的七七八八了。再往下做什么相信都不会是障碍了!
是的,我们这边提到了一个重点,阅读程式码的目的在于了解系统的全貌,而不是在于只是为了地毯式的读遍每一段程式码。
这是一个很重要的关键,当你试着进到最细节处之前,应该先试着找出参与的角色,及他们之间的关系。
不论某个系统所采用的架构是否为大部分人所熟知的,在试着探索一个系统的长相时,我们应该找出来几个答案,了解在它所用的架构下,下列这件事是如何被完成的:一,系统如何初始化,二,与这个系统相接的其他系统(或使用者)有那些,而相接的介面又是什么;三,系统如何反应各种事件,四,系统如何处理各种异常及错误。
读懂Java代码总结的更多相关文章
- 夯实Java基础系列7:一文读懂Java 代码块和执行顺序
目录 Java中的构造方法 构造方法简介 构造方法实例 例 1 例 2 Java中的几种构造方法详解 普通构造方法 默认构造方法 重载构造方法 java子类构造方法调用父类构造方法 Java中的代码块 ...
- 少啰嗦!一分钟带你读懂Java的NIO和经典IO的区别
1.引言 很多初涉网络编程的程序员,在研究Java NIO(即异步IO)和经典IO(也就是常说的阻塞式IO)的API时,很快就会发现一个问题:我什么时候应该使用经典IO,什么时候应该使用NIO? 在本 ...
- 读懂IL代码就这么简单(三)完结篇
一 前言 写了两篇关于IL指令相关的文章,分别把值类型与引用类型在 堆与栈上的操作区别详细的写了一遍 这第三篇也是最后一篇,之所以到第三篇就结束了,是因为以我现在的层次,能理解到的都写完了,而且个人认 ...
- 读懂IL代码就这么简单(二)
一 前言 IL系列 第一篇写完后 得到高人指点,及时更正了文章中的错误,也使得我写这篇文章时更加谨慎,自己在了解相关知识点时,也更为细致.个人觉得既然做为文章写出来,就一定要保证比较高的质量,和正确率 ...
- 读懂IL代码就这么简单 (一)
一前言 感谢 @冰麟轻武 指出文章的错误之处,现已更正 对于IL代码没了解之前总感觉很神奇,初一看完全不知所云,只听高手们说,了解IL代码你能更加清楚的知道你的代码是如何运行相互调用的,此言一出不明觉 ...
- 读懂IL代码就这么简单
原文地址:http://www.cnblogs.com/zery/p/3366175.html 一前言 感谢 @冰麟轻武 指出文章的错误之处,现已更正 对于IL代码没了解之前总感觉很神奇,初一看完全不 ...
- 读懂IL代码就这么简单 ---- IL系列文章
读懂IL代码就这么简单 (一) 读懂IL代码就这么简单(二) 读懂IL代码就这么简单(三)完结篇 出处:http://www.cnblogs.com/zery/tag/IL%20%E7%B3%BB%E ...
- 【转载】读懂IL代码就这么简单(三)完结篇
一 前言 写了两篇关于IL指令相关的文章,分别把值类型与引用类型在 堆与栈上的操作区别详细的写了一遍这第三篇也是最后一篇,之所以到第三篇就结束了,是因为以我现在的层次,能理解到的都写完了,而且个人认为 ...
- 【转载】读懂IL代码就这么简单(二)
一 前言 IL系列 第一篇写完后 得到高人指点,及时更正了文章中的错误,也使得我写这篇文章时更加谨慎,自己在了解相关知识点时,也更为细致.个人觉得既然做为文章写出来,就一定要保证比较高的质量,和正确率 ...
随机推荐
- RAC中常见的高级用法-bind方法
RAC操作思想: Hook(钩子)思想 RAC核心方法:bind bind方法 假设想监听文本框的内容,并且在每次输出结果的时候,都在文本框的内容拼接一段文字" ...
- Linux:ps -ef命令
ps命令将某个进程显示出来 grep命令是查找 中间的|是管道命令 是指ps命令与grep同时执行 PS是LINUX下最常用的也是非常强大的进程查看命令 检查java 进程是否存在:ps -ef |g ...
- YC-Framework版本更新:V1.0.2
分布式微服务框架:YC-Framework版本更新V1.0.2!!! 版本更新,本次版本为V1.0.2 主要更新内容如下所示: 集成ActiveMQ; 集成微信生态(支持微信公众号.微信支付.微信开放 ...
- Table.NestedJoin合并…Join(Power Query 之 M 语言)
数据源: "销量表"和"部门表"两个查找表,每个表中都有"姓名"列 目标: 根据"姓名列"将"部门表" ...
- 新建任务(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 新建任务,这操作简单得就跟在Excel的单元格里输入个数据一样,不过也不是一点讲究都没有. 首先得选对视图. 不是所有的视 ...
- LuoguP7505 「Wdsr-2.5」小小的埴轮兵团 题解
Content 给出一个范围为 \([-k,k]\) 的数轴,数轴上有 \(n\) 个点,第 \(i\) 个点的位置为 \(a_i\).有 \(m\) 次操作,有且仅有以下三种: 1 x:所有点往右移 ...
- 深度解析HashMap
讲讲HashMap? 源码解析 final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { //辅助 ...
- 大小端(内存、寄存器、CPU)
CPU能进行32位操作,关键是寄存器有32位,数据总线也有32位. 为了表示方便,我们可以把32位寄存器从左到右,与内存中一个双字的四个字节地址从低到高对应. 如果CPU把寄存器的左端定义为高位,则带 ...
- SecureCRT中Vim颜色
解决方法:1.确认安装了vim-enhancedrpm -qa | grep vim-enhanced2.optins>session optionsTerminal>emulationx ...
- docker部署验证码项目报错:at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
如果docker部署启动报错 java.lang.NullPointerException: nullat sun.awt.FontConfiguration.getVersion(FontConfi ...