您的位置:首页 > 其它

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

2010-02-28 19:46 375 查看
------------------

前言 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

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

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

后续

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

最后,看得懂我说的话的人,必须和我一样这么傻逼、疯狂,否则如果您是教授、学者、严谨之徒、比尔盖茨、准备拿诺贝尔等等的牛人,还是不要看我的理论了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: