如何学习别人的程序代码
2010-11-09 15:31
302 查看
只要是个程序员就会看代码,但是很多人,包括我在内,在看一些开源代码的时候往往一头雾水,不知从何看起。
越是结构好的代码,如果不理解它的思想越是难得看懂,例如Qt、Agg、CryptPP等。这里我将我的一些经验写在这里,留个记录吧。
完善的开源工程都会有文档,即使没有文档也应当有api-guid,那么我们先找到它们,这时我们不要管它是怎么设计的,先编译一个,照着例子写个程序运行一下吧,再试试一些高级功能。这时我们在心中先猜猜它应当是怎样设计的(大多数情况是没有想法)。好吧,我们再来看文档,文档中一般有静态结构的说明,如模块划分、类列表、每个类的成员列表。嗯,还是一头雾水啊,没办法,我们打开源码所在的文件夹,看看源码的组织方式。嗯,有点头绪了,大多数情况下,目录结构与工程结构是一致的,而我们编写例子程序的时候使用的接口一般在源码的include目录下。那好吧,我们根据头文件名和目录结构去找相应的实现文件吧,但这往往相当困难,因为你会发现它根本就不是你所想的那样。一个类或一个外部变量,你想找到它往往会动用Windows的搜索。看了几个小时还没有太大的进展,仍然不知道它的头(高层的入口)在哪,尾(底层的具体实现)在哪,不过你至少对那些地方有哪些文件都熟悉了,那些零星的注释也被你看了一遍。这时该把你写的例子程序拿出来了,我们单步跟进去,跟的同时我们也注意一下所跟到的文件的物理位置、它附近都有哪些文件、哪些类或结构。一直跟下去,这样我们往往会顺藤摸瓜找到最底层的实现,并发现一条执行路径(太变态的或用了一堆模板的除外)。由于你已经对工程的结构有了一定了解,这时你可以从头和尾一起开始看代码(前提是你已经找到了一个头和一个尾),将一条线弄清楚,那么这个工程的其他线也应该是差不多的设计思路。
有些开源工程里面的宏特别多,那你要当心,首先搞清楚这些宏吧。
用C写的工程往往比用C++写的容易懂,因为它最多有很多函数指针和extern变量,而后者则令人头疼得多,如果你实在没有办法,那么上网搜吧,很多著名的开源工程一般会有一些人将其研究心得放到blog上,看一看,说不定一下豁然开朗。
好吧,就写这么多,真是乱七八糟。
越是结构好的代码,如果不理解它的思想越是难得看懂,例如Qt、Agg、CryptPP等。这里我将我的一些经验写在这里,留个记录吧。
完善的开源工程都会有文档,即使没有文档也应当有api-guid,那么我们先找到它们,这时我们不要管它是怎么设计的,先编译一个,照着例子写个程序运行一下吧,再试试一些高级功能。这时我们在心中先猜猜它应当是怎样设计的(大多数情况是没有想法)。好吧,我们再来看文档,文档中一般有静态结构的说明,如模块划分、类列表、每个类的成员列表。嗯,还是一头雾水啊,没办法,我们打开源码所在的文件夹,看看源码的组织方式。嗯,有点头绪了,大多数情况下,目录结构与工程结构是一致的,而我们编写例子程序的时候使用的接口一般在源码的include目录下。那好吧,我们根据头文件名和目录结构去找相应的实现文件吧,但这往往相当困难,因为你会发现它根本就不是你所想的那样。一个类或一个外部变量,你想找到它往往会动用Windows的搜索。看了几个小时还没有太大的进展,仍然不知道它的头(高层的入口)在哪,尾(底层的具体实现)在哪,不过你至少对那些地方有哪些文件都熟悉了,那些零星的注释也被你看了一遍。这时该把你写的例子程序拿出来了,我们单步跟进去,跟的同时我们也注意一下所跟到的文件的物理位置、它附近都有哪些文件、哪些类或结构。一直跟下去,这样我们往往会顺藤摸瓜找到最底层的实现,并发现一条执行路径(太变态的或用了一堆模板的除外)。由于你已经对工程的结构有了一定了解,这时你可以从头和尾一起开始看代码(前提是你已经找到了一个头和一个尾),将一条线弄清楚,那么这个工程的其他线也应该是差不多的设计思路。
有些开源工程里面的宏特别多,那你要当心,首先搞清楚这些宏吧。
用C写的工程往往比用C++写的容易懂,因为它最多有很多函数指针和extern变量,而后者则令人头疼得多,如果你实在没有办法,那么上网搜吧,很多著名的开源工程一般会有一些人将其研究心得放到blog上,看一看,说不定一下豁然开朗。
好吧,就写这么多,真是乱七八糟。
相关文章推荐
- 程序学习--如何阅读别人的代码
- 如何阅读别人的代码---c、c++程序学习
- Cocos2d-x的学习 程序是如何进入到自己的代码的 Application有趣的地方
- SAP ABAP/4学习---如何给写好的一个程序分配事务代码,用户可以直接通过事务码来访问程序.或者加入收藏夹(9)
- 如何阅读别人的代码---c、c++程序学习
- 如何学习别人的代码
- 通过学习学生信息管理系统软件,C程序中,如何设计和编写一个应用系统?
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
- 从nsq中学习如何优雅的退出go 网络程序
- 想靠写程序赚更多钱,写到两眼通红,写得比别人都又快又好好几倍,结果又能如何?
- 引用 如何学习c#(如何学习程序语言)
- 如何在程序异常或正常退出JVM时执行特定代码
- 【Solr4.7.0学习笔记】系列之一:如何让solr和java程序整合
- 【Solr4.7.0学习笔记】系列之一:java程序里面,如何用ajax访问solr程序?
- 如何“隐藏”运行程序的“命令提示符”界面(C代码)
- SAP ABAP如何隐藏你写的程序代码(危险,请小心谨慎)
- 【Java学习之旅】——Java如何实现像c#的#region实现代码折叠
- cadence学习2—cadence 如何拷贝别人图纸中的原件封装
- 思考——如何高效的学习程序
- 如何更有效地学习开源项目的代码?