谈谈源码分析

研究优秀的开源代码,结合类库API文档和代码中的注释,多思考、多总结提炼、多动手练习,可在最短时间内大幅提高编程技术及开发效率。那么,应该如何分析?有没有一定的规律和原则需要遵守?本文尝试谈谈这些问题。

    · 准备工作
    · 第一阶段:画出类图,拿出框架
    · 第二阶段:逐行注释,由内而外
    · 第三阶段:重点归纳,总结提炼

研究开源项目并不轻松,不能有一蹴而就的想法,思想上要重视,要抱着学以致用、取长补短的态度,日积月累、不急不躁、反复琢磨、不断总结。如是者三,必将事半功倍,获益良多。

准备工作

第一阶段:画出类图,拿出框架

以编译单元为单位,按IDE目录树中头文件的顺序,或者从“启动类”开始入手,把项目中的类一个一个找出来,画到UML类图中(只需给出类名和大概的作用描述)。这一阶段以头文件中的类声明为主,粗略浏览该类有哪些数据成员和成员函数,大概是什么作用。根据该类所继承、依赖、组合、聚合、关联的其它类(6处位置可找到这些类:类头声明、构造参数、函数返回值、函数参数、数据成员、全局数据),将有关系的类陆续画到UML类图中。而后打开IDE目录树中的下一个头文件,依次类推,直至画出项目中所有已看到的类。调整并观察类图,分析项目的整体架构和轻重主次,从宏观上有个清晰而直观的认识。如有必要,将某些类的重要成员画到类图中(手工输入而不要复制粘贴,以加深印象)。

这一阶段的主要目的是找出项目中所有的类,大概给出每个类的作用,理清头绪并确定研究重点。

第二阶段:逐行注释,由内而外

一个类一个类的过,先研究项目中所用到的类库中的类,而后针对项目中的类,由朴素到复杂,由底层到高层,由小类到大类,由辅助类到功能类,由基类到派生类,由模型类到UI类,依次研究每个类的数据结构及成员函数的内部实现,力争做到逐行注释(先注释函数定义中的语句,而后在类声明中总结并准确描述该成员函数的作用,最后描述该类的功能与用法)。特别要注意A类中创建或销毁B类对象的语句(可注释一句:此处因何事或在何条件下创建XXX类的栈/堆对象,这种注释格式便于研究对象的生死时在IDE中进行搜索)。复杂的函数调用可画出时序图或流程图。在此期间,可随时修改完善类图、编译运行并下断点,以准确理解代码的作用和流程。

要及时提炼基于问题域的解决思路、代码流程和具体算法,可动手编码以加深理解。有些函数会用到第一阶段中未看到的类,根据情况,可在UML类图中补画这些类,同一模块或编译单元中,优先研究这些类,而后再研究使用它的类。每研究完一个类,停下来仔细思考该类是如何设计和实现的,为什么这么设计和实现,它是如何调用别的类,别的类又是如何调用它的。要从模块化、全局性的角度分析该类的作用、地位以及与其他类的关系。重复以上步骤,查缺补漏,修正理解。力争弄懂所有重点、难点和疑点,实在看不懂的地方,文字备注后跳过去,稍后回头再看。

这一阶段最为耗时和繁杂,务必要心平气和,稳扎稳打。

第三阶段:重点归纳,总结提炼

基于具体功能或感觉比较陌生的问题域,重点研究相关类的生死及其与其它类的关系,模块的设计策略与编译单元、文件等组织方式。总结提炼其解决思路、所用到的设计模式、数据结构、算法和技巧,画出实现该功能的详细类图,设计练习题,动手编码以加深体会,思考可否将其提取为可复用的类或全局函数。

这一阶段的目的:融汇贯通,消化吸收,能够将所学到的技术和技巧熟练运用到实际开发中。

本文作者:SwingCoder

如果本文对您有所启发或助益,请微信打赏

创作时间: 2013.07.22 19:17
最后修改: 2017.05.10 15:27

本文版权:UnderwaySoft   共享协议:署名-非商业使用-禁止演绎


上一篇: RAII技术的C++常规实现
下一篇: 数字音频、MIDI与DSP编程基础

 随机推荐:
Email: underwaySoft@126.com 微信公众号: UnderwaySoft