Page 185 - 《软件学报》2026年第5期
P. 185

2064                                                       软件学报  2026  年第  37  卷第  5  期


                 ignoring  the  influence  of  indirect  (non-contact)  coupling  and  the  diversity  of  degree  distribution  among  neighboring  nodes.  To  address
                 these  issues,  a  key  class  identification  approach  is  proposed  that  integrates  dynamic  analysis  with  a  gravitational  formula.  First,  a  class
                 coupling  network  (CCN)  is  constructed  using  static  analysis  to  represent  classes  and  their  coupling  relationships.  Second,  a  gravitational
                 entropy  (GEN)  metric  is  introduced  to  quantify  class  importance  by  jointly  considering  direct  and  indirect  couplings  in  the  CCN  and  the
                 degree-distribution  diversity  of  neighboring  nodes.  Third,  classes  are  ranked  in  descending  order  based  on  their  GEN  values  to  obtain  a
                 preliminary ranking. Finally, dynamic analysis is performed to capture actual runtime interactions between classes, which are used to refine
                 the  preliminary  results.  A  threshold  is  applied  to  filter  out  non-key  classes,  producing  a  final  set  of  candidate  key  classes.  Experimental
                 results on eight open-source Java projects demonstrate that the proposed method significantly outperforms eleven baseline approaches when
                 considering  no  more  than  the  top  15%  (or  top  25)  of  nodes.  The  integration  of  dynamic  analysis  notably  improves  the  performance  of  the
                 proposed  method.  Moreover,  the  choice  of  weighting  schemes  for  coupling  types  has  a  minimal  impact  on  performance,  and  the  overall
                 computational efficiency is acceptable.
                 Key words:  key class identification; software network; gravitational formula; entropy; software measurement

                    软件维护是软件生命周期中不可或缺的环节, 也是确保软件持续高效运行的关键                            [1−3] . 在软件的维护过程中,
                 软件理解至关重要. 只有深入理解软件的架构、代码逻辑及历史变更等方面的内容, 才能有效地开展维护和改进
                 工作  [4] . 然而, 随着软件复杂性的激增, 一个成功的软件通常由数百、数千, 甚至数万个软件元素                     (如方法、类、包、
                 模块等) 通过复杂的交互构成, 这给软件的维护工作带来了巨大的挑战. 尤其当系统文档陈旧或不完整, 且开发人
                 员对系统的了解有限时, 这种维护上的困难会更加突出                 [4,5] .
                    理解软件要解决的首要问题是从软件的何处开始理解, 即软件理解的起点问题                         [6−9] . 关键类在面向对象软件    (如
                 Java 软件) 中扮演着重要角色     [6,7] : 它们实现了软件的核心功能, 又与软件其他部分紧密耦合, 因而对软件的结构和功
                 能具有重要影响. 以关键类为起点理解软件, 已成为理解复杂软件系统的有效途径之一                         [6−10] . 此外, 关键类还可用于软
                 件文档化过程的优化       [5] 以及逆向工程类图的压缩     [11] . 因此, 提供有效的技术来支持关键类的识别具有重要意义             [12,13] .
                    为了识别软件中的关键类, 研究者们提出了很多方法                 [5−10,13−28] , 其中大部分是无监督学习方法   [5−10,13−24] . 这些方
                 法通常将软件的拓扑结构抽象为            (有向/无向或加权/无权) 软件网络——类抽象为网络中的节点, 类之间的耦合关
                 系抽象为网络中的边, 并使用不同的网络指标              (如  a-index [14] 、h-index [14] 、coreness 及其变体  [16,19] 、PageRank  及其
                 变体  [5−10,13,15,17,20,23] 等) 量化类的重要性, 进而将排名靠前  (按重要性降序排序) 的类作为候选的关键类. 现有工作取
                 得了不错的效果: 在仅检查前         15%  的类时, 现有方法在大部分实验系统上的            Recall 值就已经达到了    50%–90%, 部
                 分实验系统上甚至达到了         100%. 但是, 仍存在   3  点不足: 1) 现有方法使用的软件网络通常是通过对代码的静态分
                 析构建的   [5−10,13−28] , 包含了软件元素之间所有可能的耦合关系. 然而, 随着软件的演化, 源代码中不可避免地会存在
                 一些运行时永远不会        (或极少) 被执行到的“死代码”. 静态分析技术通常无法识别出这些“死代码”, 从而影响了基
                 于静态分析技术的关键类识别方法的性能. 2) 目前也有部分工作通过动态分析构建软件网络. 但是动态分析比较
                 依赖测试用例, 测试用例若构建得不够全面, 会导致所构建的软件网络存在遗漏真正关键类的风险. 3) 现有方法使
                 用的度量指标通常只考虑了类之间的直接耦合对类重要性的影响, 忽视了类之间的间接                             (非接触) 耦合的影响; 只
                 考虑了邻居节点的度的影响, 忽视了邻居节点度分布多样性                    (不同邻居节点的度不同) 带来的影响. 这些不足会导
                 致所构建的度量指标无法充分、全面地刻画类的结构特征, 进而影响类重要性的准确量化.
                    为了解决上述问题, 本文提出了一种融合动态分析和引力公式的关键类识别方法                              CDAG (identifying key
                 classes using dynamic analysis and gravitational formula). 首先, CDAG  使用静态分析技术构建面向对象软件的类依
                 赖网络   CCN (class coupling network), 以抽象类以及类之间的耦合关系. 其次, CDAG        综合考虑    CCN  中类之间
                 “直接和间接的耦合”“邻居节点度分布的多样性”等对类重要性的影响, 构建了一个新的度量指标——引力熵
                 (gravitational entropy, GEN), 用以量化类的重要性. 然后, CDAG  按照类的  GEN  值对所有类进行降序排列, 从而得
                 到初步的排序结果. 最后, CDAG       通过动态分析技术收集运行时类之间真实的交互关系, 进而对初步排序的结果进
                 行优化, 并通过设定阈值来过滤非关键类, 从而得到候选的关键类. 本文以                     8  个开源的  Java 软件作为实验对象, 并
                 与文献中的    11  种方法进行对比. 研究结果表明, 本文提出的           CDAG  方法整体上均优于所有对比方法.
                    本文的主要贡献如下.
                    1) 提出了一个度量类重要性的新指标            GEN. 该指标基于引力公式和熵, 综合考虑了类之间的间接                (非接触) 耦
   180   181   182   183   184   185   186   187   188   189   190