从本文开始,会对Sonar平台中出现的具体参数进行详细解析,供大家参考,有不对的地方,请提出来!
由于篇幅较大,分为两部分进行描述!本文为第一部分为基础指标部分。涵盖了以下几个大的方面:
API compatibility, Architecture, Complexity, Design, Documentation, Duplication, General, Management, Rules, Size, Tests, SCM, Scale.
另外,预告下第二部分,是附件部分,包括插件,帮助文档中的度量值等内容!
查看第 II 篇内容:Sonar参数指标全解析-II
您还可以参考Sonar指标图解的相关文章,以便对Sonar参数指标有更进一步直观的了解:
查看第 I 篇介绍:[Sonar图解]-Sonar指标介绍-I
查看第 II 篇介绍:[Sonar图解]-Sonar指标介绍-II
查看第 III 篇介绍:[Sonar图解]-Sonar指标介绍-III
正常接口变化数
可能引发错误的接口变化
新增接口数
接口变化总数
注:以上参数需要依赖于Clirr,暂时仍存在问题
架构质量
计算方式:
ARCH = 100 – TI
TI = Tangle Index
架构复杂指标
复杂度
类复杂度
文件复杂度
方法复杂度
复杂度因素
计算方式:
CF = (5 * Complexity>30) * 100 / (Complexity>1 + Complexity>10 + Complexity>20 + Complexity>30)
方法复杂度因素
复杂度质量指标
计算方式:
(Complexity>30 *10 + Complexity>20 * 5 + Complexity>10 * 3 + Complexity>1) / validLines
NOM = (1 - (class_complexity - 12) / (acel * 12)) * 50 + (1 - (method_complexity - 2.5) / (acel * 2.5)) * 50
参见19
CBO = (1 - (efferent_coupling - 5) / (acel * 5)) * 100
参见19
DIT = (1 - (depth_of_inheritance_tree - 5) / (acel * 5)) * 100
参见19
LCOM = (1 - (lack_of_cohesion_of_method - 1) / (acel * 1)) * 100
参见19
RFC = (1 - (response_for_class - 50) / (acel * 50)) * 100
参见19
设计质量
计算方式:
DES = 0.15*NOM + 0.15*LCOM + 0.25*RFC 0.25*CBO + 0.20*DIT
NOM = (1 - (class_complexity - 12) / (acel * 12)) * 50 + (1 - (method_complexity - 2.5) / (acel * 2.5)) * 50
LCOM = (1 - (lack_of_cohesion_of_method - 1) / (acel * 1)) * 100
RFC = (1 - (response_for_class - 50) / (acel * 50)) * 100
CBO = (1 - (efferent_coupling - 5) / (acel * 5)) * 100
DIT = (1 - (depth_of_inheritance_tree - 5) / (acel * 5)) * 100
Acel参数因子的值可以在Sonar setting页面配置。
每一个度量标准的默认阙值也可以进行配置(例如,50是response_for_class的默认阈值)。
用来说明class内部方法和变量之间的关系, 值越大, 说明内聚性越差. 一般情况下 LCOM4=1是内聚性最佳的. 2说明可以拆成两个类, 以此类推.但是这种测量对门面服务类来说不适用. 有时候很小的类也会根据需要合并在一起, 尽管关联不大
包复杂指数
此参数为包的复杂等级,最好的值为0%,意味着包之间没有圈依赖;最差的值为100%,意味着包与包之间的关系特别的复杂。该指数的计算公式:
2 * (package_tangles / package_edges_weight) * 100
通过检查一个方法被调用的情况来反映一个class的复杂程度. 也可以简单的理解为一个类所包含的方法多寡.
LCOM4密度值
Javadoc、多行注释、单行注释的总数。空注释行、头文件中的注释(主要用于定义许可证)以及commented-out行均不会包括在内。
注释掉的代码行数。Javadoc块不会被扫描
注释行数/(注释行数+有效代码行数)
添加注释的公有API占总的公有API的百分比
公有API未添加注释个数
DRYNESS = 100 - Duplicated lines density
重复块数
重复文件数
重复行数
重复行占总行数的百分比
无用的重复行数;当前的Sonar告诉你有50重复的行数,但是不能告诉你是有两块25行的代码重复(这样你可以节省25行代码)还是有5块10行(这样你可以节省40行代码)的代码重复;通过这个插件,你可以获取到额外的信息。
可理解性
请查看37指标后的详细介绍
可扩展性
稳定性
可测试性
可维护性可通过7个质量特性来衡量:
可理解性
可测试性
可修改性
可靠性
可移植性
可使用性
效率
这个插件标示了一个Software Improvement Group(SIG)可维护性模型
这个模型需要两步: 计算基数的指标,然后结合他们计算出更高层面上的数值。
每一个指标被分成5级别排名:从--(很糟糕)到++(非常好)
第一步加上基数的指标。
Volume: 基于代码的行数
Rank | LOC |
-- | > 1310000 |
- | > 655000 |
0 | > 246000 |
+ | > 66000 |
++ | > 0 |
Duplications: 基于代码重复的密度
Rank | Duplication |
-- | > 20% |
- | > 10% |
0 | > 5% |
+ | > 3% |
++ | > 0% |
Unit tests: 基于单元测试覆盖率
Rank | Coverage |
++ | > 95% |
+ | > 80% |
0 | > 60% |
- | > 20% |
-- | > 0% |
Complexity:基于方法的圈复杂度
第一步根据圈复杂度的范围确定在方法代码行中的百分比。
Eval | Complexity |
Very high | > 50 |
High | > 20 |
Medium | > 10 |
Low | > 0 |
然后根据分布,我们使用下面的表格来计算等级:
Rank | Medium | High | Very High |
++ | < 25% | < 0% | < 0% |
+ | < 30% | < 5% | < 0% |
0 | < 40% | < 10% | < 0% |
- | < 50% | < 15% | < 5% |
否则等级是--
Unit size: 基于方法代码的行数
第一步根据行数的范围确定方法代码行数的百分比。
Eval | LOCs |
Very high | > 100 |
High | > 50 |
Medium | > 10 |
Low | > 0 |
然后根据分布,使用下面的表格来计算等级:
Rank | Medium | High | Very High |
++ | < 25% | < 0% | < 0% |
+ | < 30% | < 5% | < 0% |
0 | < 40% | < 10% | < 0% |
- | < 50% | < 15% | < 5% |
否则等级为--
第二步是通过一个简单的平均,将他们结合起来,使用以下映射表来确定最终等级.
Volume | Complexity | Duplications | Unit size | Unit tests | |
analysability | |||||
changeability | |||||
stability | |||||
testability |
因此4个代表软件可维护性四维的先进指标。
可选项,通过将4个指标简单的结合在一块,可以得到可维护性排名。
需要注意的是,图表的颜色代表实际结合后的值,从红色=--到绿色=++.
未知
计算方式:
QI = 10 - 4.5 * coding - 2 * complexity - 2 * coverage -1.5 * style
SIG可维护性模型,参考37
清除所有技术债务需要的花费
需要多少人日去解决技术债务
技术债务占整个项目的比例
总体质量
计算方式:
TQ= 0.25*ARCH + 0.25*DES + 0.25*CODE + 0.25*TS
燃尽预算
商业价值
团队规模
注:以上变量为手动输入变量,另外这里可以添加一些自定义的变量
阻碍性违规
代码质量
计算方式:
Code = 0.15*DOC + 0.45*RULES + 0.40*DRYNESS
DOC = Documented API density
RULES = Rules compliance index
DRYNESS = 100 - Duplicated lines density
严重违规
无作用程序代码
建议级别违规
重要违规
次要违规
当前代码中未使用的protected方法数目;
此参数可通过 PMD : UnusedProtectedMethod 或者 SQUID : UnusedProtectedMethod 获取到。
计算他们行数的和值。
代码违规质量指标(PMD规则指数)
计算方式:
(Blocker * 10 + Critical * 5 + Major * 3 + Minor + Info) / validLines
代码违规权重指标
风格违规质量指标(CheckStyle规则指数)
计算方式:
Style = (Errors*10 + Warnings) / ValidLines * 10
QI = 10 - 4.5 * coding - 2 * complexity - 2 * coverage -1.5 * style
风格违规权重质量指标
遵守规则率
Security规则遵守率
符合Security规则数目
违规总数
Security规则权重值(总数)
Getter及setter方法的数量
记录最终产品大小
类总数
文件数
文件中行数
代码行数
方法数目
包数目
公共类、公共方法(不包括访问器)以及公共属性(不包括public final static类型的)的数目。
Java语言规范中没有块定义的语句数目;此数目在遇到含有if, else, while, do, for, switch, break, continue, return, throw, synchronized, catch, finally等关键字的语句时增加。例如:
语句数目不会随着以下情况增加,类、方法、字段、注释定义、包以及import定义。
可以删除的代码行数
覆盖率
行覆盖率
测试覆盖率质量指标
忽略的单元测试数
测试质量
计算方式:
Test = 0.80*COV + 0.20*SUC
COV = Code coverage
SUC = Unit Tests success density
未覆盖行数
单元测试出错数
单元测试失败数
单元测试成功率
单元测试个数
单元测试需要的时间
SVN库总的提交数
最近的一次提交时间
SQALE(Software Quality Assessment based on Lifecycle Expectations)评级;
基于生命周期期望的软件质量模型
SQALE整治成本
联系客服