Chinaunix首页 | 论坛 | 博客
  • 博客访问: 57397
  • 博文数量: 11
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 102
  • 用 户 组: 普通用户
  • 注册时间: 2014-10-05 16:20
文章分类
文章存档

2017年(4)

2014年(7)

我的朋友

分类: IT业界

2017-02-21 00:25:42

                       剖析源代码的技巧

   前言

    初入公司实习,开始的一段时间基本都是在阅读公司的源代码,这也是个人第一次接触到大规模的商业代码。在阅读代码的过程,也学习和感悟到一些阅读代码的心得,特此小记。

 

一,系统功能。

我们对一份代码要有一个最开始的明确的认识,即我们要大体了解我们正在阅读的代码其是为了完成一个怎样的功能,它的目的是何。通常一个比较复杂的软件其功能自然不是单一的,这就需要我们自己来理清其中的各个功能点,从而梳理出整个系统的主要功能,为后面进入代码阅读和剖析提供明确的目标。

      在此想补充一点,对于我们大部分接触到的代码都是开源代码,开源的好处就在于有很多的资源,包括前辈先人可能在阅读项目时的心得,我们可以先尽可能获取这样的资源,便于我们更快地梳理出更多的细节,如果能有较好的那种说明软件的整体架构的文章就更好不过了。

 

二,程序骨架。

我不是非常喜欢框架这个词,感觉大而空,而且一般能成为框架的,基本都会有广泛的使用,比如经典的MVC三层架构。不论什么系统,都有其相应的层次结构,梳理出这个层次,对阅读代码以及写代码都是很重要的事情。人类的思维注定就无法处理过多的系统要素,而分层和分级则能有效帮助我们缩小要同时思考的量,并帮助我们分析每个层次中各个组成部分,最后将多个模块统筹起来。得益于我们在前面对系统功能所做的努力,在这个过程中,我们可以将系统详细实现的模块和功能对应起来(一般好的开源项目的实现,模块的划分都很明确,不会过多的耦合),再将其分类到各个层次中,由此我们能够建立对整个系统骨干的认识。

 

老生长谈,我们仅以c语言为例,简单谈下编程语言的基本结构。

    基本语言的组成:1、基本数据类型    2、基本逻辑结构    3、基本执行流程(函数)。我们通过组合数据类型来构造我们的数据结构类型,以模拟更高层次的对象,后使用函数来处理对象,这是编程语言实现功能的基本方式,也是典型c程序里面的基本构成。

   

三、梳理数据结构。

c语言曾经历过以过程为中心到以数据为中心的转变,由此本人总结编程的本质就是操纵数据。当然,这有点像废话。我们通过各类数据的组合,并具象化,在此我们可以将其称之为对象,也许这和面向对象中的对象有差异,但是我有理由相信,面向对象的创始人是站在以数据为中心的基础上,进一步发展了面向对象的内涵,即赋予了数据以动态的属性,因此,我们能以更高级的方式来思考程序。在现在c程序中,基于对象的概念可谓表现的非常明显,通过数据的组合,我们产生了一个高级事物,并对每个事物有其对应的处理方式,即操作围绕对象而进行,面向对象中的术语就是事物包含这些操作属性,更具体一点,就是函数本身也被视为基本数据类型的一种,加入到事物的组成部分中。在用过js之类的语言后,这点表现可以说是非常明显。之前我们谈论过层次性的问题,作为编程实现的基本方式,数据结构的层次嵌套映射了系统的整个层次,当然这在面向对象中,对象以及对象之间的关系表现了整个世界。如果在这个阶段我们就能够将整个数据结构都梳理出来,这自然再好不过,一般能将程序最为核心的数一些据结构层次和我们程序骨架对应起来,就基本实现了这个阶段的目标。但是数据结构是纯粹的静态关系,更多的细节,我们必须将其嵌入到相关中动态流程中,我们才能发现其作用

 

四、系统的初始化。

程序的本质都是执行流程,无论多复杂的系统都是这样,即便是并发类应用,对于其中的每条线程,夜都是顺序执行的,而对于整个系统而言,了解系统是如何初始化,有利于我们将系统中的各个功能模块真正的关联起来,同时我们也能更清楚地知道系统在运行的过程做了什么,其如何获取自己所需的资源以及对运行平台的影响。在这个过程中,我们可能比较关注于系统的整个初始化调用流程,而尽可能忽略掉中间调用的函数细节。此外,这里可能还要牵涉到一堆的数据结构,这部分我把它放在了第五部分,其实这里梳理数据结构也是可以同步进行的。

 

五、驱动模式。

在完成系统初始化之后,系统需要执行自己的相关任务,其接受事件,并处理事件,这就牵涉到系统中的一些关键的流程。这个是动态的过程,许多未知的事件类型都需要去处理。我们要做的是了解系统的驱动方式,我们要知道系统是如何接受外部事件,以及当接受了外部事件后,系统应当如何相应,用函数的观点来说,就是事件发生执行了那些函数回调。

完成了这一步,我们基本就应该把握住程序的核心要点了,解析来,我们要做的就是进一步对细节进行剖析。

 

六、实现细节

      在这个阶段中,我们针对系统中的子系统或者子模块,着眼于每个模块的详细实现,在前面我们梳理出的数据结构,我们不可能对其中每个数据的功能都能了解的透彻,这里我们通过函数中实际对数据的使用,我们便能够明确相关数据的作用。

 

结尾

      以上是个人对更有效地剖析源代码的一点感悟,虽然我顺序地写出了六条,但这个过程不是死的。我只是提出了一些在阅读源代码时,我们应该要关注的一些要点,使我们的目标更加明确,避免我们在接触到开源项目时,不知道如何下手。

  

   

   

   

   

   


阅读(1187) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~