代码质量概述
怎样辨别一个项目代码写得好还是坏?优秀的代码和腐化的代码区别在哪里?怎么让自己写的代码既漂亮又有生命力?接下来将对代码质量的问题进行一些粗略的介绍。也请有代码质量管理经验的朋友提出宝贵的意见。 代码质量所涉及的5个方面:编码标准、代码重复、代码覆盖率、依赖项分析、复杂度分析。这5个方面很大程序上决定了一份代码的质量高低。我们分别来看一下这5方面:
上面解释了代码质量相关的5个方面,在实际开发环境中,已经有很多工具为我们解决以上5个方面的问题,下列5个eclipse插件分别对这5个问题有很好的支持:
注:某些插件需要访问外国网站才能更新 1. 编码标准(CheckStyle的使用) 在Eclipse上安装好了CheckStyle插件后,我们来建一个类用它跑一下。这个类很简单,一个常见的用户实体,包含了ID,用户名、密码、邮件等属性,并包含get set方法,一个标准的POJO。运行CheckStyle检查一下:
一个我们平时再普通不过的一个类,被CheckStyle弄出这么多问题,情何以堪,我们来看看究竟是什么情况? 看一下这些警告信息: line 1、
,说缺少package-info.java文件。 line 2
,说第一句注释要以“.”结尾。 line 30
,缺少java doc注释。 line 35
,getId不是继承的方法,必须指定abstract,final或空。另外也缺少java doc注释。 这个类基本就这四类毛病,缺少package-info.java文件,这个文件是做什么的呢?他是用来描述包注释的类,有一定的特殊性,要想详细了解请百度。如果对你的项目没有太大的影响,可以忽略它。配置CheckStyle的方法我们等会再说。第一句注释要以“.”结尾,这看你的习惯,你确定需要这个,你就保留,不需要就忽略。缺少Java doc,对于Java类的属性来说,注释是必要的,所以这个要保留。不是继承的方法,需要加上final关键字,如果你有这个习惯,就保留,反之忽略。 我们这里只是建立了一个最简单的类用CheckStyle来检查,随着你的类代码越来越多,逻辑越来越复杂,CheckStyle能检查出来的毛病也越来越多。 常见的CheckStyle错误有这些:
引用
1.Type is missing a javadoc commentClass 缺少类型说明 2.“{” should be on the previous line “{” 应该位于前一行 3.Methods is missing a javadoc comment 方法前面缺少javadoc注释 4.Expected @throws tag for “Exception” 在注释中希望有@throws的说明 5.“.” Is preceeded with whitespace “.” 前面不能有空格 6.“.” Is followed by whitespace“.” 后面不能有空格 7.“=” is not preceeded with whitespace “=” 前面缺少空格 8.“=” is not followed with whitespace “=” 后面缺少空格 9.“}” should be on the same line “}” 应该与下条语句位于同一行 10.Unused @param tag for “unused” 没有参数“unused”,不需注释 11.Variable “CA” missing javadoc 变量“CA”缺少javadoc注释 12.Line longer than 80characters 行长度超过80 13.Line contains a tab character 行含有”tab” 字符 14.Redundant “Public” modifier 冗余的“public” modifier 15.Final modifier out of order with the JSL suggestionFinal modifier的顺序错误 16.Avoid using the “.*” form of import Import格式避免使用“.*” 17.Redundant import from the same package 从同一个包中Import内容 18.Unused import-java.util.list Import进来的java.util.list没有被使用 19.Duplicate import to line 13 重复Import同一个内容 20.Import from illegal package 从非法包中 Import内容 21.“while” construct must use “{}” “while” 语句缺少“{}” 22.Variable “sTest1” must be private and have accessor method 变量“sTest1”应该是private的,并且有调用它的方法 23.Variable “ABC” must match pattern “^[a-z][a-zA-Z0-9]*$” 变量“ABC”不符合命名规则“^[a-z][a-zA-Z0-9]*$” 24.“(” is followed by whitespace “(” 后面不能有空格 25.“)” is proceeded by whitespace “)” 前面不能有空格
可以看出CheckStyle检查出来的问题,大多是编码规则以及风格上的问题,这是编写高质量代码最基本的。值得注意的是,我们将一些优秀的开源代码用CheckStyle来检查也会检查出不少问题,这不能不说这些开源不优秀,而是每个公司组织有自己的编写规范度,这个度既可以减少程序员的工作量又可以让代码的可读性合格,但这个度不一样符合CheckStyle的完整标准。所以我们一般使用CheckStyle都不会用他的默认标准,而是通过配置,制定适合自己的编码规则。 自定义CheckStyle规则:
打开CheckStyle配置,新建一个配置,选择外部配置文件。在这之前最好导出一个Eclipse自带的CheckStyle配置文件(sun_checks.xml),然后重命名作为一个外部的配置导进去,这么做的目的是导入之后可以修改相应的配置,达到自定义配置的目的(因为Eclipse自带的配置是加锁的,不能修改)。导入之后,点击右边的“Configure”进行编辑。 先去掉缺少package-info.java文件的提示:
再将第一句注释要以“.”结尾这个规则去掉,双击“Style javadoc”,将窗口内“checkFirstSentence”勾选去掉。
对于实体类,属性有了注释,get set方法也不需要注释了,双击“Method javadoc”将allowMissingPropertyJavadoc勾选中。
“getId不是继承的方法,必须指定abstract,final或空”,如果你懒得在方法上加“final”,这条规则也可以去掉。
如果你不想每一个参数都加“final”,还需要把参数的final规则去掉:
另外还有一个错误“'id' hides a field.”,原因是方法的参数和类里面定义的域重名了,但使用eclipse生成的get set方法都会这样,所以可以忽略此项。
至此我们再使用checkstyle检查一篇,发现仅剩下属性缺少注释这个警告。
对每个属性加上java doc注释,所有问题都清除了。以此类推,解决checkstyle问题的方法就是:1、按规则解决代码问题;2、如果觉得这个问题对你的项目质量影响不大,则可以忽略它。 2. 代码重复(PMD的CPD的使用) 对于多人开发的项目,难以避免出现重复代码的问题,尽管我们尽量对共用的代码进行了封装,但随着需求的增加、人员技术水平差异、沟通不足等原因,重复代码会越来越多。这不仅严重影响代码质量,也无形中增加了代码量。 注:精简的程序和高复用度的代码是我们一直追求的目标。 PMD的CPD工具就是为检查重复代码而生的。右键项目--->PMD---->Find Suspect Cut and Paste,执行重复代码检查:
检查出来的重复代码,可以双击查看。然后根据业务逻辑以及代码特征,决定要不要做封装、怎么封装。 3. 代码覆盖率(Eclemma的使用) 一份质量合格的代码,不仅包含功能程序本身也包含了对应的测试代码,Eclemma插件可以用来统计测试代码覆盖整体代码中的比率,以此来评估代码的功能性和稳定性。 使用Junit编写好测试用例之后,右键Coverage As--->Junit Test,运行测试用例,Eclemma会统计出相关的代码覆盖率:
根据这个结果,你可以看出自己编写的测试用例覆盖到了那些代码,而没有覆盖到的代码,则有可能成为代码质量的盲区。 4. 依赖项分析(JDepend的使用) 随着程序业务逻辑的增加,代码的依赖关系也变的越来越复杂,JDepend插件可以统计包和类的依赖关系,分析出程序的稳定性、抽象性和是否存在循环依赖的问题。右键包--->Run JDepend Analysis:
看一下这几项指标:
有个这个报告我们就可以有针对性的对代码进行设计和重构。 5. 复杂度分析(Metrics的使用) 对于阅读代码的人来说,越简单的代码越好理解和维护,如果你的代码阅读起来很费劲或者你自己过段时间后再来看都看不懂,你就得想办法解决下代码的复杂度问题了。Metrics插件可以帮你做到这点。 首先在Java透视图下右键一个项目---->Properties,选择Metrics,勾选Enble Metrics。
然后Window--->Show View---->Other---->Metrics View
打开Metrics视图,点击右上角运行图标,即可得到复杂度分析的结果:
可以根据复杂度指标,对自己的程序进行优化。 小结 本文介绍了和java代码质量相关的5个方面问题,并介绍对应eclipse插件的用法和作用。在我们实际开发中,尽量根据自己公司和团队的情况来制定一些检查规则,来提高代码质量。并且在大多数情况下,会有两个检查环节,即本地检查和持续集成环境的检查,我们常用的Hudson就可以集成很多插件。