欢迎来到天天文库
浏览记录
ID:38580627
大小:934.50 KB
页数:10页
时间:2019-06-15
《inFusion工具使用》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、(1)重复代码(DuplicatedCode) 重复代码是指相同的代码结构出现在多个地方。 发现重复代码可以通过度量一个系统中重复代码行数所占百分比来实现。探测重复代码最大的问题在于存在多种不同的重复类型。完全相同的代码探测起来很容易,已存在不少技术。但是有一些重复代码存在重命名、使用别名等情况,导致探测技术需要对程序代码进行语义分析,例如,重命名局部变量等,这些探测方法需要更多的计算时间去检测各种可能的重命名。还有一些重复代码存在一些细微的修改或者中间混合了少量的其他代码,这导致探测的难度变大,可以
2、引入相似度计算等技术。还有一种更复杂的重复代码,功能相同,结构不同,这种重复代码的检测需要深入分析程序代码的语义,寻找功能相同或相似的结构片段,无疑将导致探测过程更加复杂,探测难度加大,也需要更多的探测时间。 在工具iPlasma和inFusion中,探测重复代码的策略是使用一组关于代码重复的度量指标,考虑到重复片段的长度和两段重复代码之间的距离。Checkstyle的实现非常简单,它简单统计程序源代码中的连续重复行数,设定的阈值为12,也就是说当有12行代码重复时则认为存在重复代码,重复代码的扫描可以跨方法
3、甚至跨类。在PMD中,当一个代码片段重复至少一次且其中包含至少25个标记(tokens)时,则认为出现了重复代码坏味道。 (2)依恋情节(FeatureEnvy) 依恋情节是指一个方法对另一个类的兴趣比对它所在类的兴趣还大。因为它与其他类之间具有更高的耦合度,故这个方法放在了错误的位置。 依恋情节代码味道的探测可以通过度量一个方法对属于其他类中的方法(或数据)的耦合程度来实现。 2006年,Lanza和Marinescu提出了如下方法来探测依恋情节: (1)一个类中的方法直接使用了
4、另一个类中的一些属性,可以通过访问外部数据个数(AccesstoForeignData,ATFD)来度量; (2)一个类中的方法使用另一个类中的属性比使用自己本身的属性多得多,可以通过局部属性访问值(LocalityofAttributeAccesses,LAA)来度量; (3)一个类中所使用的“外部”属性属于少数几个其他类,可以通过使用外部数据提供者数(ForeignDataProviders,FDP)来度量。 他们通过如下条件来探测依恋情节:FDP≤FEW ∧ ATFD>FEW ∧LAA
5、<1/3 此处,Lanza和Marinescu设定FEW的值为5。 iPlasma和inFusion采用了上述规则来识别依恋情节。在JDeodorant工具中,该问题转成了一个寻找MoveMethod(搬移方法)重构时机问题:它试图去寻找那些一旦搬移到另一个类中就很少使用外部(其他类中的)资源的方法。(3)万能类/上帝类(GodClass) 万能类通常也认为是一种设计缺陷,它指的在系统中集多种功能于一身的类,它试图成为整个系统的中心。一个万能类承担了太多的职责,而只将很少的功能委托给其他不
6、重要的类,并且万能类还需要从其他类那里获取数据。 与依恋情节相同,2006年,Lanza和Marinescu还提出了一种通过计算三种度量指标来探测万能类的方法,这三种度量指标如下: (1)加权方法计数(WeightedMethodCount,WMC):一个类中所有方法的统计复杂度的和。 (2)类内聚的紧密度(TightClassCohesion,TCC):通过访问相同的属性而直接发生联系的方法个数。 (3)访问外部数据个数(AccesstoForeignData,ATFD):对于一
7、个给定的类,它所访问的外部类的个数,它可以直接访问这些外部类的属性,也可以通过访问器方法(AccessorMethod)访问这些属性。 在Lanza和Marinescu的方法中,当一个类满足如下条件时它就是一个万能类:WMC≥VERY_HIGH∧ATFD>FEW ∧TCC<1/3 在此,Lanza和Marinescu设定VERY_HIGH的值为47,FEW的值为5,在他们的Object-OrientedMetricsinPractice一书中详细描述了这两个值是怎么获得的。 iPlasma和
8、inFusion采用了上述规则来识别万能类。JDeodorant通过其他类来判断一个类是否是万能类,并提出了ExtractClass(提取类)的重构时机识别方法,这种探测方法与一个类本身的规模没有直接关系。 (4)过大类(LargeClass) 过大类是指一个类试图去做太多事情,这些类通常包含大量的成员变
此文档下载收益归作者所有