打造第二代测试框架TestDriven 2.0(二)—— 类的依赖性分析

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

前言 Preface

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

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

本文是第二代测试框架中,类依赖性分析的技术文档,不包含任何可执行的代码。


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

类的依赖性分析

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

这个问题足足搞了我48个小时,走了无数的弯路,最后终于完成了。

 

首先,我使用了引用次数分析,根据引用次数排序,得到依赖性结果。结果发现引用次数根本不能说明问题,越是基础的类,反而应用次数越少,难道就越不底层?

 

于是,我改用单项的链接表,如果发现存在A调用了B,则B在A的前面。 结果又发现,由于接口问题的存在、还有对单个类的调整会影响到实际的调用事实,于是进化到下面。

 

使用了Link,自定义的链接,每个link包含了若干个类。同时,这个时候,总结出了一些理论:

依赖性定理一:当A调用了B后,这个调用顺序成为一个事实,日后无论如何调整,都不能修改这个事实顺序。

依赖性定理二:当A调用了B,B又调用了A之后,后者不进行调整,因为形成了循环,则事实默认了双方的地位等同。

可是,实际中又发现,使用了单链表,每个link只有一个后续,调整的时候, 整个link移动,导致了平级调用问题出现。

 

最后,来到了树形结构。已经浪费了24小时了。同时得到了最终的结论:

依赖性定理三:当A调用了B、C、D之后,BCD属于平级关系,之间没有顺序依赖。

 

使用了正确的数据结构和正确的定理后,终于完成了,并且输出了期望值。

 

以下是一些逻辑描述。

 

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

核心理论

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

首先,我使用了树形结构,不代表是某计算机学科的XX树。也许翻开某篇198x年的论文能找到类似的理论,但是也只可惜我晚出生了20年,因为这个理论是我自己开创的。

 

 

这个树的特点如下:

r 表示根节点, = root

1、2、3 表示子节点,同时也表示类,数字是默认的序号,没有实际意义。

 

 

 

r-1-2-3 表示

1调用了2,2调用了3.

 

 

r-1-2

     -3

     -4 

表示了1同时调用了2、3、4,而且2、3、4是平级关系。

 

 

树的排序根据子叶深度排序。例如:

r-1-2-3

  -4-5

排序后,得到

r-4-5

 -1-2-3 

 

 

树的输出采用最深搜索+逆序法。 例如

 r-4-5

  -1-2-3 

输出是:

3,2,1,5,4,r 

 

 

现在在这个树的基础上,分析各种树的变形调整,调整过程使用递归算法。

formernode = 上一个递归的节点,currentnode = 当前的递归节点 

formerclass = 上一个递归处理的类,currentclass = 当前递归处理的类 

 

1. 初始化的情况,formernode = null, currentnode = null, formerclass = null, currentclass = 1 

直接添加到根节点,得到结果

formernode = null, currentnode = 1, formerclass = null, currentclass = 1

r-1

 

2. 重复迭代  formernode = null, currentnode = 1, formerclass = null, currentclass = 1 

直接返回,不处理

r-1-2

 -3-4

 

3.  遇到新的节点, formernode = 1, currentnode = null, formerclass = 1, currentclass = 2

直接在上一个节点添加后续节点 

r-1

=>

r-1-2

 

4.  最复杂的时候到了,这里浪费了我另外的24小时。遇到旧的节点

formernode = 1, currentnode = 2, formerclass = 1, currentclass = 2

1)上个节点的子叶包含了当前节点,则不需要调整,直接返回

r-4-5-6-1-2-7-8==》2  

 

2) 上个节点的根节点和当前节点的根节点不一致,则调整

r-8-2-3-4-5-6

 -7-1==>2

由于上个节点是1,根节点是7,当前节点是2,根节点是8,所以7换入2,2尾随上个节点,调整后:

r-8-7-1-2-3-4-5-6 

 

3) 如果上个节点根节点和当前根节点一致,则在讨论:

3.1)如果上个节点的树干包含了当前节点, 则上个节点置换到当前节点,当前节点尾随上个节点

r-3-2-4-5

        -1-7-9

           ==>2

to 

r-3-1-7-9

       -2-4-5 

3.2) 如果双方的根节点相同,但是存在在不同的分支,则判断深度,如果深度相同,则直接替换

r-3-4-2-5

     -6-1==2

to

r-3-4

    -6-1-2-5 

3.3)如果当前节点深度大于自己,则不修改,因为对方资格老

3.4)如果当前节点深度小于自己,则同样替换 

r-3-4-2-5

     -6-7-1==2

to

r-3-4

    -6-7-1-2-5 

 

理论完毕。整个树的调整过程遵循了三个定理,和搜索方法,所以这种调整是正确的调整。 同时可以在任何时候添加新的节点,提高了扩展性。

 

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

后续

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

最后,看得懂我说的话的人,必须和我一样这么傻逼、疯狂,否则如果您是教授、学者、严谨之徒、比尔盖茨、准备拿诺贝尔等等的牛人,还是不要看我的理论了。


 


posted @ 2010-02-28 19:46    阅读(443)  评论(0编辑  收藏  举报
IT民工