来自:[译]Visual Studio 2008 Code Metrics

http://www.cnblogs.com/live41/archive/2010/02/08/1665627.html

代码度量(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也不是

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

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

如果一个代码段的圈复杂度值多于测试用例的数量,你就会发现有些情况没有被处理,而且可能藏匿着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. Android代码分析工具lint学习

    1 lint简介 1.1 概述 lint是随Android SDK自带的一个静态代码分析工具.它用来对Android工程的源文件进行检查,找出在正确性.安全.性能.可使用性.可访问性及国际化等方面可能 ...

  2. 常用 Java 静态代码分析工具的分析与比较

    常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...

  3. C++静态代码分析工具推荐——PVS-Studio

    长假归来,最近一直没更新,节前本来就想写这篇了,一直到今天才有时间. 关于静态代码分析在维基百科上可以查到很详细的介绍:https://en.wikipedia.org/wiki/List_of_to ...

  4. 来试试这个来自静态代码分析工具PVS Studio提供C++的小测验吧

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:来试试这个来自静态代码分析工具PVS Studio提供C++的小测验吧.

  5. Cppcheck 1.54 C/C++静态代码分析工具

    Cppcheck是一个C/C++代码分析工具,只检测那些编译器通常无法检测到的bug类型.   官方上建议让编译器提供尽量多的警告提示:1.使用Visual C++的话,应使用警告等级4 2.使用GC ...

  6. 阅读代码分析工具Understand 2.0试用

    Understand 2.0是一款源码阅读分析软件,功能强大.试用过一段时间后,感觉相当不错,确实能够大大提高代码阅读效率. 因为Understand功能十分强大,本文不可能详尽地介绍它的全部功能,所 ...

  7. [转载] 常用 Java 静态代码分析工具的分析与比较

    转载自http://www.oschina.net/question/129540_23043 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代 ...

  8. 【转载】常用 Java 静态代码分析工具的分析与比较

    摘自:http://www.oschina.net/question/129540_23043常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后 ...

  9. VSS源代码管理器运行代码分析工具的命令

    当你发现代码库总是报需要联系管理员运行代码分析工具时,你可以使用命令分析代码库代码解决: To fix the database problems, you can restart the analy ...

  10. java静态代码分析工具infer

    infer是一个静态代码分析工具,探测bugs. 主要支持Java.C/C++ 安装:brew install infer 在线展示:https://codeboard.io/projects/115 ...

随机推荐

  1. SAP ST05数据跟踪使用

    有时我们想知道SAP操作,对数据库中的那些表进行的增删查改. 可以使用ST05跟踪SQL语句. ST05功能界面如下: 1---激活跟踪 2---结束跟踪 3---显示跟踪结果. 如果想跟踪SQL语句 ...

  2. 强大的UML建模工具——StarUML

    用例图: usecase          生成时序图,协作图,活动图等            生成的时序图:           反向工程以及生成代码:          类图:           ...

  3. Interoperability between Java and SharePoint 2013 on Premises

    http://ctp-ms.blogspot.com/2012/12/interoperability-between-java-and.html   Introduction One of the ...

  4. Android 带清除功能的输入框控件EditText

    1.效果图      2.源码下载 http://download.csdn.net/detail/yanzi2015/8864603 3.相关博客 http://www.cnblogs.com/to ...

  5. 第一个JSP程序

    本文介绍如何写出第一个JSP程序 1.配置服务器 (1)在eclipse中选择Server视图,(ps:很多童鞋说找不到Server,那是因为eclipse的版本问题,请下载JEE版本的eclipse ...

  6. iOS开发 UIWebView+JavaScript 交互总结

    算是个人项目经验的,印象比较深的Web+JS交互的使用 iOS原生应用与Web页面元素交互方式有很多,JavaScriptCore.拦截协议.第三方框架WebViewJavaScriptBridge. ...

  7. CSS 类选择器(四)

    一.类选择器 类选择用使用"."(英文点号)进行标识,后面紧跟类名 如: .red{color:red;} 类样式可以应用于文档中的多个元素,这体现了CSS代码的可重用性,帮助用户 ...

  8. IOS 计步器

    这篇博客介绍的是当前比较流行的“计步器”-只是简单的知识点 计步器的实现在IOS8开始进行了改变. 但是我会对之前之后的都进行简单介绍. IOS 8 - // // ViewController.m ...

  9. .net串口通信

    背景: 前一段时间需要写一个向蓝牙模块发消息的功能. 对蓝牙的机制不太了解,所以一直在查资料, 但始终没找到我需要的东西,还误以为需要配套的一套开发模板和开发包, 偶然间发现只需要简单的串口通信,并且 ...

  10. mysql,sql server,oracle 唯一索引字段是否允许出现多个 null 值?

    最近一个项目,涉及到sql server 2008,因为业务需求,希望建立一个唯一索引,但是发现在sql server中,唯一索引字段不能出现多个null值,下面是报错信息: CREATE UNIQU ...