打造第二代测试框架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
理论完毕。整个树的调整过程遵循了三个定理,和搜索方法,所以这种调整是正确的调整。 同时可以在任何时候添加新的节点,提高了扩展性。
------------------
后续
------------------
最后,看得懂我说的话的人,必须和我一样这么傻逼、疯狂,否则如果您是教授、学者、严谨之徒、比尔盖茨、准备拿诺贝尔等等的牛人,还是不要看我的理论了。