相关阅读:

优秀架构师必须掌握的架构思维

阿里巴巴的员工工资待遇:工程师25万,专家80万,研究员百万

互联网技术(java框架、分布式、集群)干货视频大全,不看后悔!(免费下载)

代码质量概述

怎样辨别一个项目代码写得好还是坏?优秀的代码和腐化的代码区别在哪里?怎么让自己写的代码既漂亮又有生命力?接下来将对代码质量的问题进行一些粗略的介绍。也请有过代码质量相关经验的朋友提出宝贵的意见。

代码质量所涉及的5个方面,编码标准、代码重复、代码覆盖率、依赖项分析、复杂度分析。这5方面很大程序上决定了一份代码的质量高低。我们分别来看一下这5方面:

  • 编码标准:这个想必都很清楚,每个公司几乎都有一份编码规范,类命名、包命名、代码风格之类的东西都属于其中。

  • 代码重复:顾名思义就是重复的代码,如果你的代码中有大量的重复代码,你就要考虑是否将重复的代码提取出来,封装成一个公共的方法或者组件。

  • 代码覆盖率:测试代码能运行到的代码比率,你的代码经过了单元测试了吗?是不是每个方法都进行了测试,代码覆盖率是多少?这关系到你的代码的功能性和稳定性。

  • 依赖项分析:你的代码依赖关系怎么样?耦合关系怎么样?是否有循环依赖?是否符合高内聚低耦合的原则?通过依赖项分析可以辨别一二。

  • 复杂度分析:以前有人写的程序嵌套了10层 if else你信吗?圈复杂度之高,让人难以阅读。通过复杂度分析可以揪出这些代码,要相信越优秀的代码,越容易读懂。

上面解释了代码质量相关的5个方面,在实际开发环境中,已经有很多工具为我们解决以上5个方面的问题,下列5个eclipse插件分别对这5个问题有很好的支持:

  • 编码标准:CheckStyle  插件URL:http://eclipse-cs.sourceforge.net/update/

  • 代码重复:PMD的CPD  插件URL:http://pmd.sourceforge.net/eclipse/

  • 代码覆盖率:Eclemma 插件URL:http://update.eclemma.org

  • 依赖项分析:JDepend 插件URL:http://andrei.gmxhome.de/eclipse/

  • 复杂度分析:Eclipse Metric  插件URL:http://metrics.sourceforge.net/update

注:某些插件需要科学上网才能更新


编码标准(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关键字,如果你有这个习惯,就保留,反之忽略,作为Java技术栈公众号小编,建议你加上。

我们这里只是建立了一个最简单的类用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、如果觉得这个问题对你的项目质量影响不大,则可以忽略它。

代码重复(PMD的CPD的使用)

对于多人开发的项目,难以避免出现重复代码的问题,尽管我们尽量对共用的代码进行了封装,但随着需求的增加、人员技术水平差异、沟通不足等原因,重复代码会越来越多。这不仅严重影响代码质量,也无形中增加了代码量。

注:精简的程序和高复用度的代码是我们一直追求的目标。

PMD的CPD工具就是为检查重复代码而生的。右键项目--->PMD---->Find Suspect Cut and Paste,执行重复代码检查:

检查出来的重复代码,可以双击查看。然后根据业务逻辑以及代码特征,决定要不要做封装、怎么封装。

代码覆盖率(Eclemma的使用)

一份质量合格的代码,不仅包含功能程序本身也包含了对应的测试代码,Eclemma插件可以用来统计测试代码覆盖整体代码中的比率,以此来评估代码的功能性和稳定性。

使用Junit编写好测试用例之后,右键Coverage As--->Junit Test,运行测试用例,Eclemma会统计出相关的代码覆盖率:

根据这个结果,你可以看出自己编写的测试用例覆盖到了那些代码,而没有覆盖到的代码,则有可能成为代码质量的盲区。

依赖项分析(JDepend的使用)

随着程序业务逻辑的增加,代码的依赖关系也变的越来越复杂,JDepend插件可以统计包和类的依赖关系,分析出程序的稳定性、抽象性和是否存在循环依赖的问题。右键包--->Run JDepend Analysis:

看一下这几项指标:

CC(Number of Classes)

被分析package的具体和抽象类(和接口)的数量,用于衡量package的可扩展性。如果一个类中实现了其他类,如实现了监听类,则监听类的数目也记录在此。


AC(Abstract classes)

抽象类和接口的数量。

Ca(Afferent Couplings)

依赖于被分析package的其他package的数量,用于衡量pacakge的职责。即有多少包调用了它。

Ce(Efferent Couplings)

被分析package的类所依赖的其他package的数量,用于衡量package的独立性。即它调用了多少其他包。

A(Abstractness)

被分析package中的抽象类和接口与所在package所有类数量的比例,取值范围为0-1。

I(Instability)

I=Ce/(Ce+Ca),用于衡量package的不稳定性,取值范围为0-1。I=0表示最稳定,I=1表示最不稳定。即如果这个类不调用任何其他包,则它是最稳定的。

D(Distance)

被分析package和理想曲线A+I=1的垂直距离,用于衡量package在稳定性和抽象性之间的平衡。理想的package要么完全是抽象类和稳定(x=0,y=1),要么完全是具体类和不稳定(x=1,y=0)。取值范围为0-1,D=0表示完全符合理想标准,D=1表示package最大程度地偏离了理想标准。即你的包要么全是接口,不调用任何其他包(完全是抽象类和稳定),要么是具体类,不被任何其他包调用。

Cycle

循环依赖的数量。

有个这个报告我们就可以有针对性的对代码进行设计和重构。

复杂度分析(Metrics的使用)

对于阅读代码的人来说,越简单的代码越好理解和维护,如果你的代码阅读起来很费劲或者你自己过段时间后再来看都看不懂,你就得想办法解决下代码的复杂度问题了。Metrics插件可以帮你做到这点。

首先在Java透视图下右键一个项目---->Properties,选择Metrics,勾选Enble Metrics。

然后Window--->Show View---->Other---->Metrics View

打开Metrics视图,点击右上角运行图标,即可得到复杂度分析的结果:

可以根据复杂度指标,对自己的程序进行优化。

小结

本文介绍了和java代码质量相关的5个方面问题,并介绍对应eclipse插件的用法和作用。在我们实际开发中,尽量根据自己公司和团队的情况来制定一些检查规则,来提高代码质量。并且在大多数情况下,会有两个检查环节,即本地检查和持续集成环境的检查,我们常用的Hudson就可以集成很多插件。

出处:http://www.cnblogs.com/leefreeman/p/3585032.html

参考资料:

  • 追求代码质量:软件架构的代码质量(http://www.ibm.com/developerworks/cn/java/j-cq04256/)

  • JDepend:http://www.clarkware.com/software/JDepend.html

  • PMD:http://pmd.sourceforge.net/

  • CheckStyle:http://sourceforge.net/projects/eclipse-cs/?source=directory

  • Eclemma:http://www.eclemma.org/

  • Metrics:http://metrics.codahale.com/

看完本文有收获?请转发分享给更多人


欢迎关注“互联网架构师”,我们分享最有价值的互联网技术干货文章,助力您成为有思想的全栈架构师,我们只聊互联网、只聊架构,不聊其他!打造最有价值的架构师圈子和社区。

本公众号覆盖中国主要首席架构师、高级架构师、CTO、技术总监、技术负责人等人 群。分享最有价值的架构思想和内容。打造中国互联网圈最有价值的架构师圈子。

  • 长按下方的二维码可以快速关注我们

  • 如想加群讨论学习,请点击右下角的“加群学习”菜单入群

教你编写高质量的 Java 代码!相关推荐

  1. 怎样编写高质量的Java代码

    代码质量概述 怎样辨别一个项目代码写得好还是坏?优秀的代码和腐化的代码区别在哪里?怎么让自己写的代码既漂亮又有生命力?接下来将对代码质量的问题进行一些粗略的介绍.也请有过代码质量相关经验的朋友提出宝贵 ...

  2. 如何编写高质量的Java代码

    Java代码安全规范 本文目的 故障分析 资源分析 安全条目 QPS CPU Memory 磁盘I/O Network 代码工程 Web安全 附录 Redis网卡打满参照表 参考 本文目的 向Nasa ...

  3. HTML Inspector – 帮助你编写高质量的 HTML 代码

    HTML Inspector 是一款代码质量检测工具,帮助你编写更优秀的 HTML 代码.HTML Inspector 使用 JavaScript 编写,运行在浏览器中,是最好的 HTML 代码检测工 ...

  4. ​如何编写高质量的C#代码(一)

    如何编写高质量的C#代码(一) 从"整洁代码"谈起 一千个读者,就有一千个哈姆雷特,代码质量也同样如此. 想必每一个对于代码有追求的开发者,对于"高质量"这个词 ...

  5. 老司机写的java代码_老司机告诉你高质量的Java代码是怎么练成的?

    一提起程序员,首先想到的一定是"码农",对,我们是高产量的优质"码农",我们拥有超跃常人的逻辑思维以及不走寻常路的分析.判别能力,当然,我们也有良好的编码规范, ...

  6. 如何编写高质量的C#代码(一)

    从"整洁代码"谈起 一千个读者,就有一千个哈姆雷特,代码质量也同样如此. 想必每一个对于代码有追求的开发者,对于"高质量"这个词,或多或少都有自己的一丝理解.当 ...

  7. 编写高质量的Objective-C代码

    点标记语法 属性和幂等方法(多次调用和一次调用返回的结果相同)使用点标记语法访问,其他的情况使用方括号标记语法. 良好的风格: view.backgroundColor = [UIColor oran ...

  8. [精华]如何编写高质量的VB代码

    2003-01-01· ·冯睿··yesky简介: 本文描述了如何通过一些技术手段来提高VB代码的执行效率.这些手段可以分为两个大的部分:编码技术和编译优化技术.在编码技术中介绍了如何通过使用高效的数 ...

  9. 编写高质量的VB代码

    简介: 本文描述了如何通过一些技术手段来提高VB代码的执行效率.这些手段可以分为两个大的部分:编码技术和编译优化技术.在编码技术中介绍了如何通过使用高效的数据类型.减少外部引用等编程手段来提高代码执行 ...

  10. 如何编写python函数_编写高质量的Python代码系列(二)之函数

    Python中的函数具备多种特性,这可以简化编程工作.Python函数的某些性质与其他编程语言中的函数相似,但也有性质是Python独有的.本节将介绍如何用函数来表达亿图.提升可复用程度,并减少Bug ...

最新文章

  1. KMeans中的K怎么选择?Elbow method怎么实施?
  2. 列表(list)、元组(tuple)、字典(dictionary)、array(数组)-numpy、DataFrame-pandas 、集合(set)...
  3. PowerShell在Exchange2010下快速开启邮箱
  4. 华为路由器 android,华为智能路由器app
  5. Elasticsearch】 es Match Query
  6. openerp one2many 字段排序
  7. 【Vijos1180】选课
  8. py2exe使用方法 (含一些调试技巧,如压缩email 类)(转)
  9. Rust: HashMap的用法及其它
  10. Java构造方法解析
  11. 日期插件-jeDate
  12. python knn模型_kNN模型(Python3.x环境)
  13. IDEA 打包jar
  14. 2012工行软开中心-广州面试
  15. Python练习题答案: IRR计算 - 盈利能力的评价【难度:2级】--景越Python编程实例训练营,1000道上机题等你来挑战
  16. Ryujinx - 基于 C# 开发的任天堂 Switch 模拟器
  17. 轮询查找连接电脑设备IP地址
  18. 使用 ES6 编写更好的 JavaScript Part II:深入探究 [类]
  19. X-pack 为 Elasticsearch 安全保驾护航
  20. win7系统安装sql server 2000 图解全过程

热门文章

  1. 聚焦2017博鳌亚洲论坛:数据安全仍是互联网金融的重中之重
  2. 这次面试就差不多了,你有什么问题需要问我呢?
  3. MFC动态菜单全攻略
  4. Illustrator 教程,如何在 Illustrator 中沿路径添加文本?
  5. iOS开发之Xcode项目文件自动展开问题的解决办法
  6. HoudahSpot 6.2 for Mac文件搜索软件
  7. Mac系统功能快速切换状态栏小工具One Switch for Mac
  8. 如何使用ImageRanger Pro Edition mac版创建缩略图?
  9. Convirt管理机Socat驻留进程故障处理
  10. 扎克伯格正用“山寨”策略碾压Snapchat