转载自: https://blog.csdn.net/zh_geo/article/details/52954145

VS2012 -> Analyze -> Calculate code metrics feature.

代码度量(Code Metrics)是用来测量专业标准的软件特性. 在某些方面,它提供了量化的有用反馈给开发者.

查看代码度量值很简单:在项目或解决方案上按右键,选择"Calculate Code Metrics". 以下是一些类似的结果:

结果窗口中有五个不同的度量特性:圈复杂度(Cyclomatic Complexity), 继承深度(Depth of Inheritance), 类耦合度(Class Coupling), 代码行数(Lines of Code), 和一个总的可维护指数(Maintainability Index). 通过展开左边的树结点,你可以从整个项目深入观察类里面的方法. 但是特征中的那些数字是什么意思呢?

圈复杂度(Cyclomatic Complexity)
圈复杂度是调用方法时取得的线性独立路径的总数,基于if,switch,while和类似的分支语句的数量. 如果一个方法没有这样的语句存在,就表示方法中只有一条可行路线,这样的情况下圈复杂度的值为1.

public int DoSomething(int x) {
if (x == 1) {
// code that is executed when x is 1
} if (x == 2) {
// code that is executed when x is 2
}
// code that is executed even if x is neither 1 or 2
return x;
}

在这个例子中,有三条可行的路线存在,走哪条路线取决于x的值:

  • 1.当x是1
  • 2.当x是2
  • 3.当x不是1也不是2

圈复杂度告诉你两件重要事. 首先,它指出一个方法的综合复杂度. 值越低越好,如果数值较高,就说明方法可能覆盖了过多不同情况的处理(例如,尝试做太多容错处理),说明方法需要分解成更简单的只满足一种情况的单一职责方法(这样会更容易维护).

其次,为了确保每种情况都被完全地测试,你必须为每条路线创建唯一的测试用例. 圈复杂度告诉你需要写多少个测试用例来确保所有可能的情况都已经被覆盖.

如果一个代码段的圈复杂度值多于测试用例的数量,你就会发现有些情况没有被处理,而且可能藏匿着bug.

继承深度(Depth of Inheritance)
继承深度是表示一个类的继承的级数,起始值为1(所有类都是继承自Object). 这个例子有3级继承:

该值是越低越好; 如果继承深度在3或4以上,你的代码可能超出设计标准(over-engineered),说明代码是难以维护的.

数值越高,就越多子类需要修改 -- 消耗时间和金钱,也潜在地引入bug -- 如果你对基类做出重大变更的话.

只要你考虑下每个变更对于子类会引入一些潜在的bug,这些bug会影响到他们引用的所有对象... 你就懂我意思了.

类耦合度(Class Coupling)
类耦合度是计算一个类中引用到的对象类型数,不包括原始的和内置的类型,像int和string. 该值是越低越好; 值越高,就代表类绑定了越多类,也意味着存在越多依赖关系在它的中间环境中.

随着类的耦合度的增加,它就会变得难以分离出来用在另一个项目中. 简单来讲,类的耦合度越高,它的重用性就越低.

我们都看过很多理论案例说类要尽量可重用,但实际编程,大部分类都是高度针对特定项目而编写的,或多或少需要完全重写才能"重用"在另一个项目中.

如果类在它最初被创建的时候设计得更完善,我们就可以在之后省掉很多时间.

代码行数(Lines of Code)
代码行数是通过计算执行的代码行数来量度软件块的大小. 虽然和上面的特征一样,这个值也是越低越好(原因很简单,你以更少的代码完成功能就能减少你思考的负担),但在用这个特征前有几条告诫你需要知道:

  • 1.不是每行代码都相等. 有些行是非常简单,有些却非常复杂,会花费数小时来计算.
  • 2.它不计算已删除或已覆盖的代码
  • 3.有时将一行复杂的代码分割成几行会令它更容易理解; 在这样的情况下,增加了代码行但更容易维护.
  • 4.除非设计完善并彻底测试过,而且已成型的所有代码是出自你本人,否则代码行数不会精确反映投入软件中的努力的量.

要聪明地使用这个度量值. 在以前,代码行数出名地被滥用于测量每日的编程生产力,带来了灾难性的结果. 请记住,比起写代码,软件开发有更多重要的东西.

可维护指数(Maintainability Index)
最后是可维护指数,范围是0到100,用来指示所有类,成员,命名空间或项目的可维护性. 事实上,它是一个之前所有度量值的合计值,但它也同时包含一些额外的度量值,像霍尔斯特德量(Halstead Volume),该值用来量度程序的总长度和词汇数. 与之前的度量值不同,这个值是越高越好.

可维护指数还提供了一个红/黄/绿的交通灯图标,让你一眼看见问题的区域. 交通灯会转黄当数值低于20,当数值低于10时会转红,这时你需要重新检查你的代码以躲避危险.

总结
Visual Studio 2008的代码度量不会量度性能或者安全性,也不会帮助你解决任何bug. 它只会在开发时帮你找出软件中的隐藏问题区域.

你越早看到本文,就越节省你的时间和金钱(用于重构不可维护的代码). 你也会自我感觉良好,因为你知道你能够第一时间处理好程序.

英文原文: http://www.geekzone.co.nz/vs2008/4773

百度百科: http://baike.baidu.com/view/2830155.htm

[代码质量] 推荐一个vs自带工具分析代码的复杂度的更多相关文章

  1. 推荐一个web字体转换工具TTF转SVG

    推荐一个web字体转换工具:https://www.fontsquirrel.com/tools/webfont-generator

  2. 推荐一个实用的css工具

    后台程序员整天在和数据打交道,天天的活就是抱着mysql抠数据,如果让他去写网站的样式,就让人感觉力不从心,所以推荐一个twitter的团队开发的东西,几乎囊括了网站所需的样式,http://www. ...

  3. 在win下开发c++代码, 推荐一个工具dev c++

    官方地址:http://bloodshed-dev-c.en.softonic.com/

  4. 推荐一个 Java 实体映射工具 MapStruct

    声明: 1.DO(业务实体对象),DTO(数据传输对象). 2.我的代码中用到了 Lombok ,不了解的可以自行了解一下,了解的忽略这条就好. 在一个成熟的工程中,尤其是现在的分布式系统中,应用与应 ...

  5. 推荐一个大文件查找工具---WizTree

    DB备份.dump.电影等文件多了以后,经常遇到磁盘空间不够用的情况,日积月累本来清晰的目录结构找起来也很费劲,尤其是要查找删除无用的大文件.windows本身那差劲的搜索功能就不提了,从搜索引擎上查 ...

  6. 推荐一个静态页面生成工具-mkdocs

    最近需要找一个生成api文档的工具,找来找去发现mkdocs特别符合需求. 部署只需python和pip 直接生成静态html 用markdown编写 不需要再markdown里指明日期.标题等信息 ...

  7. 推荐一个好的数据库工具Embarcadero DBArtisan

    最近的项目中用到了DB2数据库,由于DB2数据库客户端在操作操作和控制方面不是很方便,如存储过程的编写.后来我们在数据库的操作都转在DBArtisan上了,最新版好像是8.12.        下面介 ...

  8. 推荐一个zookeeper信息查看工具

    zookeeper信息查看工具 下载地址:https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip 解压,打 ...

  9. 推荐一个利用 python 生成 pptx 分析报告的工具包:reportgen

    reportgen v0.1.8 更新介绍 这段时间,我对 reportgen 进行了大工程量的修改和更新.将之前在各个文章中出现的函数进行了封装,同时也对现有工具包的一些逻辑进行了调整. 1.rep ...

随机推荐

  1. Android-----Intent通过startActivityForResult(Intent intent , int 标志符)启动新的Activity

    我们都了解使用 startActivity(intent) 新的activity只能传递数据,却无法返回数据,返回新activity返回的数据我们可以替换startActivityForResult( ...

  2. 在Spring中使用AspectJ实现AOP

    在Spring中,最常用的AOP框架是AspectJ,使用AspectJ实现AOP有2种方式: 基于XML的声明式AspectJ 基于注解的声明式AspectJ 基于XML的声明式AspectJ 1. ...

  3. 使用Prometheus监控Linux系统各项指标

    首先在Linux系统上安装一个探测器node explorer, 下载地址https://prometheus.io/docs/guides/node-exporter/ 这个探测器会定期将linux ...

  4. linux修改当前用户环境变量永久生效

    在linux环境中,修改当前用户环境变量,且永久生效的方法如下. 1,编辑~/.bash_profile文件 1 2 3 # Get the aliases and functions 4 if [ ...

  5. idea之将Maven的jar包安装到本地仓库

    1.问题概要 很多时候,我们需要应用第三方的jar包,但是这个jar包,在maven远程仓库里面没有, 比如我们要使用京东的sdk,但这个sdk在maven的远程仓库中没有,于是我们需要将这个jar包 ...

  6. k8s之Configmap与Secret

    ConfigMap:k8s标准资源,将配置文件做成k8s资源,使其它资源可加载其中配置 Secret:实现加密功能的安全配置文件.由多个key:val中组成 创建configmap资源,可直接使用ku ...

  7. influxDB应用及TICK stack

    InfluxData平台用于处理度量和事件的时间序列平台,常被称为TICK stack,包含4个组件:Telegraf,influxDB,Chronograf和Kapacitor,分别负责时间序列数据 ...

  8. Pthon魔术方法(Magic Methods)-实例化

    Pthon魔术方法(Magic Methods)-实例化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.实例化一个对象 __new__: 该方法需要返回一个值,如果该值不是cl ...

  9. Java数据库操作的一些注意

    练习一:插入一个学生的四六级成绩: //课后练习 public class task3 { //添加一条数据 @Test public void testInsert() { int id=1; Sc ...

  10. IntelliJ IDEA自身以及maven项目打包方式

    1. Idea自身打包方式 1.1 创建Artifacts 快捷键(Ctrl+Alt+Shift+S)打开项目的Project Structure.在Artifacts创建 接着,指定main cla ...