zoukankan      html  css  js  c++  java
  • 打造第二代测试框架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 

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

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

    后续

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

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



  • 相关阅读:
    react native 添加mobx
    js-(19,999,999.00)
    html移动端 -- meta-模板 + rem
    HTML5 移动端头部标签
    js
    html --- rem
    es6--async--await
    nrm+nvm
    js-call-apply
    SQL映射文件
  • 原文地址:https://www.cnblogs.com/zc22/p/1675225.html
Copyright © 2011-2022 走看看