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 

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

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

    后续

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

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



  • 相关阅读:
    MySQL "show users"
    MySQL
    A MySQL 'create table' syntax example
    MySQL backup
    MySQL show status
    Tomcat, pathinfo, and servlets
    Servlet forward example
    Servlet redirect example
    Java servlet example
    How to forward from one JSP to another JSP
  • 原文地址:https://www.cnblogs.com/zc22/p/1675225.html
Copyright © 2011-2022 走看看