打造第二代测试框架TestDriven 2.0(四)—— 代码对象化建模技术

------------------ 

前言 Preface

------------------ 

本文是第二代测试框架系列文章,同时也是软件工程革命三部曲中的技术文献。

本文从Visual Studio的重构出发,分析可行的代码对象建模技术,此技术是TestDriven 2.0 的核心技术。

 

 

------------------   

代码对象化建模

------------------  

使用Visual Studio,或者Eclipse的用户,一定非常依赖:查看此方法被引用的列表。


有时候我们写着写着代码,总是中途需要查询,这个时候任何IDE都会进入常常的等待时期,这个过程需要对代码(C#, Java) 进行词法分析,从静态分析代码调用情况(当然会使用部分动态反射获取周边DLL等,这个视IDE如何实现了)。

 

正是一个这么重要的功能,到目前位置,我踏遍了整个互联网,仍没有发现有个人去做代码对象化建模,让代码关系持久化。如果实现了这个功能,我就可以至少实现以下一个目标:

 

对比2个版本的类,查看这个类的代码变动产生影响范围。

 

一旦这个需求被实现了,我就能很快的进入代码半自动化辅助编程了,甚至比大部分公司的软件开发过程领先一个身位。比如

1. 需求变更的时候,针对需要修改的类,评估影响范围。

2. 代码完成后,自动进入回归测试。

3. 自动生成代码文档归档。

。。。。

 

今天我就介绍下我目前的研究进展。先看看截图:

 

主界面设计,我参考了Google的风格,非常简单。 

 

 

 

 

输入查询关键字之后,列举出所有相关的代码片段。 

 

 

点击不同的区域,进入不同的明细,包括了程序集、类、方法。

在这里,可以清楚的看到这个方法的声明;调用了什么方法;被什么方法调用。

 

------------------  

架构设计 

------------------   

上面只是简单的演示了一个基于网站的查询功能。更强大的功能是本地的应用。依据网站的代码对象数据库,本地能够方便的查询各种代码关系,然后进一步处理。

 

要实现这个功能浪费了我差不多10天时间。最大的障碍在性能方面,因此代码模型需要细化到什么程度?本地如何缓存?代码差异比对如何提高性能等问题。这里一一解析。

 

首先是对象设计,.net提供了很漂亮的自描述对象TYPE,但是他实在太冗余了,因此我需要瘦身,得到:

ApiAssembly 程序集对象

- AssemblyName

- AssemblyApid

- Classes //类

- AssemblyReferences //程序集的依赖关系

 

ApiClass 类对象,这里包括了接口、类、枚举、代理等等。

- ClassName

- ClassApid 

- AssemblyName

- AssemblyApid

- Methods //类方法

- Inheritances //类继承关系 

 

ApiMethod 方法对象,包括了Index, Property, Method等

- MethodName

- MethodApid

- AssemblyName

- AssemblyApid

- ClassName

- ClassApid

- Parameters //输入参数

- References //方法引用其他方法列表

 

ApiReference 依赖关系

ReferenceApid

ReferAssemblyApid,

ReferClassApid,

ReferMethodApid 

 

在这个对象设计中,最核心的是xxxApid这个字段,为了提高整个系统的性能,我们不可能查询、比对的时候一个个对名字、参数、是否范型、范型类型等等去枚举比对,因此我通过Apid字段,对每个类进行一个唯一的MD5操作,这样日后比对的时候,只要查询这个APID值就能够迅速获取类之间的关联关系。这个是整个核心设计关键一环。

例如某个类 public class Hello<string>  

我对这个类的 MD5 ( 名字+是否范型+每个范型参数的类型),计算得到了一个字符串。这样只要符合这个字符串,就代表这个类。

 

其次,是本地缓存设计,本地使用XML进行代码关系缓存。这个XML可以直接从网站下载,之后和本地项目代码同步。缓存使用分片设计,不同的项目使用不同的xml文件保存,系统运行的时候延迟加载,这样就能够提高整体性能。

 

最后, 使用了IL,获取这个方法调用了其他方法的声明,这样就能够建立关联关系。

 

------------------  

后记 

------------------   

 

TestDriven 2.0 的核心思想是——代码之间是有关联的。我们应该充分利用这个关联关系,去提高我们的生产力。以往的静态文本比对、SVN代码归档等 1.0 技术已经过时了,在 web2.0 的时代,我们也需要进化了。

 

本文已经建立了一个代码关联数据库,将来任何的 2.0 操作都将基于这个数据库。 个人感觉,是自己划时代的一次进步。 下一篇文章将直至核心,论述 基于 代码关联数据库的 测试驱动。

 

 

 

posted @ 2010-03-13 19:52    阅读(1282)  评论(1编辑  收藏  举报
IT民工