inFusion工具使用

更新时间:2023-05-09 07:54:40 阅读: 评论:0

(1) 重复代码 (Duplicated Code)
      重复代码是指相同的代码结构出现在多个地方。
      发现重复代码可以通过度量一个系统中重复代码行数所占百分比来实现。探测重复代码最大的问题在于存在多种不同的重复类型。完全相同的代码探测起来很容易,已存在不少技术。但是有一些重复代码存在重命名、使用别名等情况,导致探测技术需要对程序代码进行语义分析,例如,重命名局部变量等,这些探测方法需要更多的计算时间去检测各种可能的重命名。还有一些重复代码存在一些细微的修改或者中间混合了少量的其他代码,这导致探测的难度变大,可以引入相似度计算等技术。还有一种更复杂的重复代码,功能相同,结构不同,这种重复代码的检测需要深入分析程序代码的语义,寻找功能相同或相似的结构片段,无疑将导致探测过程更加复杂,探测难度加大,也需要更多的探测时间。
       在工具iPlasmainFusion中,探测重复代码的策略是使用一组关于代码重复的度量指标,考虑到重复片段的长度和两段重复代码之间的距离。Checkstyle的实现非常简单,它简单统计程序源代码中的连续重复行数,设定的阈值为12,也就是说当有12行代码重复时则认为存在重复代码,重复代码的扫描可以跨方法甚至跨类。在PMD中,当一个代码片段重复至
少一次且其中包含至少25个标记(tokens)时,则认为出现了重复代码坏味道。
 
(2) 依恋情节 (Feature Envy)
      依恋情节是指一个方法对另一个类的兴趣比对它所在类的兴趣还大。因为它与其他类之间具有更高的耦合度,故这个方法放在了错误的位置。
      依恋情节代码味道的探测可以通过度量一个方法对属于其他类中的方法(或数据)的耦合程度来实现。
      2006年,LanzaMarinescu提出了如下方法来探测依恋情节:
      (1) 一个类中的方法直接使用了另一个类中的一些属性,可以通过访问外部数据个数(Access to Foreign Data, ATFD)来度量;
      (2) 一个类中的方法使用另一个类中的属性比使用自己本身的属性多得多,可以通过局部属性访问值(Locality of Attribute Access, LAA)来度量;
      (3) 一个类中所使用的“外部”属性属于少数几个其他类,可以通过使用外部数据提供者数(Foreign Data Providers, FDP)来度量。
      他们通过如下条件来探测依恋情节:
FDP FEW  ATFD> FEW LAA < 1/3
      此处,LanzaMarinescu设定FEW的值为5
       iPlasmainFusion采用了上述规则来识别依恋情节。在JDeodorant工具中,该问题转成了一个寻找Move Method(搬移方法)重构时机问题:它试图去寻找那些一旦搬移到另一个类中就很少使用外部(其他类中的)资源的方法。
(3) 万能类/上帝类(God Class)
      万能类通常也认为是一种设计缺陷,它指的在系统中集多种功能于一身的类,它试图成为整个系统的中心。一个万能类承担了太多的职责,而只将很少的功能委托给其他不重要的类,并且万能类还需要从其他类那里获取数据。
      与依恋情节相同,2006年,LanzaMarinescu还提出了一种通过计算三种度量指标来探测万能类的方法,这三种度量指标如下:
      (1) 加权方法计数(Weighted Method Count, WMC) 一个类中所有方法的统计复杂度的和。
      (2) 类内聚的紧密度(Tight Class Cohesion, TCC):通过访问相同的属性而直接发生联系的方法个数。
      (3) 访问外部数据个数(Access to Foreign Data, ATFD):对于一个给定的类,它所访问的外部类的个数,它可以直接访问这些外部类的属性,也可以通过访问器方法(Accessor Method)访问这些属性。
      LanzaMarinescu的方法中,当一个类满足如下条件时它就是一个万能类:
WMC VERY_HIGHATFD > FEW TCC < 1/3
      在此,LanzaMarinescu设定VERY_HIGH的值为47FEW的值为5,在他们的Object-Oriented Metrics in Practice一书中详细描述了这两个值是怎么获得的。
      iPlasmainFusion采用了上述规则来识别万能类。JDeodorant通过其他类来判断一个类是否是万能类,并提出了Extract Class(提取类)的重构时机识别方法,这种探测方法与一个类本身的规模没有直接关系。
 
 (4) 过大类(Large Class)
      过大类是指一个类试图去做太多事情,这些类通常包含大量的成员变量和方法。
      类规模的度量方法有很多种,最传统的方式是度量源代码行数,如NLOC(Number of Lines Of Code)或者度量一个类中的属性数和方法数。像NLOC这种简单的度量指标可以表示一个类的规模,但是并不能判断一个类是否承担了多项职责,例如有些GUI类,对于一些复杂的界面,GUI类确实会比较大,但是这些代码基本上都是自动生成的,我们不应该认为它们存在过大类这一坏味道。
       PMDCheckstyle等工具使用简单的NLOC作为过大类的探测策略。前者设定的源代码行数的阈值为1000,后者的阈值为2000
 
(5) 过长方法 (Long Method)
       过长方法是指那些很长的方法。由于太长,导致难于理解、改变和扩展。也可以指一个方法承担了太多职责,使之成为一个类,甚至一个子系统的中心方法。
      度量过长方法看起来是一件很容易的事情,但是事实并非如此,依赖于一些简单的度量方式(例如源代码行数NLOC)可能会带来一些错误的结果,例如:有一些类的初始化方法(如构造函数)可能会比较长,由于它们的圈复杂度一般比较低,理解和修改较为容易,因此通常没有必要去重构那些长的初始化方法。Mäntylä建议使用圈复杂度(Cyclomatic Complexity)Halstead度量(Halstead Measures)去识别过长方法,因为它们可以度量操作数和操作符的个数,并且提供了一些重要的有关方法复杂性的信息。根据Mäntylä的建议,最好的度量过长方法的度量指标应该是由源代码行数(NLOC)、圈复杂度和Halstead度量组合而成的一个多项式度量指标。
       CheckstylePMD等工具探测过长方法用的是最简单的源代码行数(NLOC),但是使用
了不同的阈值,例如PMD的阈值为100Checkstyle的阈值是150JDeodorant使用了切片技术来判断一个类是否满足Extract Method(提取方法)重构时机。
 
(6) 过长参数列表 (Long Parameter List)
      过长参数列表是指一个方法的参数列表太长以致难以理解。
      过长参数列表的探测可以通过统计每个方法中参数的个数来实现。 探测过长参数列表的要点在于参数个数阈值的设定。例如,PMD中默认的阈值数量为10,而在Checkstyle中为7
InFusion错误类型分析
1      God Class
1.1    特征
上帝类通常过多的操纵其他类的数据,从而破坏了类的封装性。上帝类从其他类中获得功能,同时增加了自身的耦合性,通常会导致自己具有规模过大和较高的复杂度。
判断一个上帝类的标准有:
 
1. CPFD (Capsules Providing Foreign Data) 从多个不相关类(模块)中引用数据
2. WOC (Weighted Operation Count) 类的所有函数的圈复杂度之和超过65
3. TCC (Tight Capsule Cohesion) TCC < 1/3 类需要具有低内聚的特性(类中直接相关
的方法与全部方法之比小于1/3),也就是较少的private方法
4. 需要同时满足以上条件才可以被认定为上帝类
1.2    修改
破坏CPFD, WOC, TCC 中的一个。
2      Message Chains
2.1    特征
过度耦合的消息链
如果你看到用户向一个对象索求(request)另一个对象,然后再向后者索求另一个对象,然后再索求另一个对象……这就是Message Chains。实际代码中你看到的可 能是一长串getThis()或一长串临时变量。采取这种方式,意味客户将与查找过程中的航行结构(structure of the navigation)紧密耦合。一旦对象间的关系发生任何变化,客户端就不得不做出相应修改。

本文发布于:2023-05-09 07:54:40,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/873487.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:方法   代码   探测
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图