inFusion能够探测超过20中代码味道和代码缺陷,包括重复代码,破坏封装的类(如数据类或者万能类),高耦合的方法和类,以及一些设计不合理的类继承结构。当我们使用inFusion工具分析代码时,在分析界面左上侧出现一个代码数据度量窗口,下面将对度量金字段数据作详细的解释,从而对代码从整体上有一个宏观的认识,同时也能够预测代码中可能出现的问题,诸如类功能是否单一,成员方法复杂度是否过高,继承深度是否合理等等。
度量金字数据具体示例如下:
鉴于上述图片中数据模糊,手工将上图黑色框中数据列出如下:
NDD 0.61
HIT 1.58
20.0 NOP 30
8.81 NOC 600
9.22 NOM 5287 NOM 1.56
0.14 LOC 48791 8298 CALL 0.37
CYCLO 7007 3076 FOUT
顶部
NDD,HIT分别指类的平均继承宽度和平均继承深度
平均继承宽度:类继承树上,子类占所有类的比例,合理范围0.2~0.6
平均继承深度:类继承树上,继承的层次,多棵继承树取平均值,合理范围0.1~0.3
左侧 右侧
CYCLO 圈复杂度 FOUT 方法扇出次数
LOC 代码行数 CALL 方法调用(扇入)次数
NOM 方法数量 NOM 方法数量
NOC 类数量
NOP package数量,C/C++中指目录数量
左边斜坡上
平均每个包中类个数 600/30 = 20.0
平均每个类中方法个数 5287/600 = 8.81
平均每个方法的代码行数 48791/5287 = 9.22
平均圈复杂度(CYCLO/LOC) 7007/48791 = 0.14
右边斜坡上
平均每个方法call的次数 8298/5287 = 1.56
扇出扇入比 3076/8298 = 0.37
扇入扇出
在软件设计中,扇入和扇出的概念是指应用程序模块之间的层次调用情况。
按照结构化设计方法,一个应用程序是由多个功能相对独立的模块所组成。
扇入:是指直接调用该模块的上级模块的个数。扇入大表示模块的复用程度高。
扇出:是指该模块直接调用的下级模块的个数。扇出大表示模块的复杂度高,需要控制和协调过多的下级模块;但扇出过小(例如总是1)也不好。扇出过大一般是因为缺乏中间层次,应该适当增加中间层次的模块。扇出太小时可以把下级模块进一步分解成若干个子功能模块,或者合并到它的上级模块中去。
设计良好的软件结构,通常顶层扇出比较大,中间扇出小,底层模块则有大扇入。
参考资料