`
alanwu
  • 浏览: 200733 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

三步教你改善Java代码质量zz

阅读更多

http://www.bitscn.com/java/advanceprogram/200803/131922.html

 

本文讨论了如何以递进的方式使用Apache Ant来改善我们的代码质量。并按着三步走的原则给出了具体的实现步骤。 bitscn.com

  一、充分利用单元测试、代码覆盖

bitscn.com

  单元测试、代码覆盖是最容易被接受和实现的方式。事实上,大多数开发人员都知道单元测试对他们很重要。在我们开始讨论这些东西之前,先看一下 Google研究院主管Peter Norvig的一段话:“如果你认为你们不需要对自己的代码进行单元测试,那么就写在纸上写一所有的原因,并且仔细研究这张纸,然后扔了它,继续测试自己 的程序吧”。看来Google也是非常推崇进行单元测试的。那么谁又来测试那么测试者呢?也就是说,我们怎么能验证对程序做了足够的测试呢?这是一个非常 有价值的问题,因为那些未通过测试的程序才是我们更应该关注的地方。这个问题的一个解决方案就是使用代码覆盖工具,这种工具将告诉我们我们到底测试了多少 代码(也就是被测试代码的百分比),然后使用一般的综合处理来合并覆盖核对结果。如果覆盖核对失败,那么我们建立应用程序的过程也就失败了。

bitsCN.Com

  对了本文所讨论的递增代码策略选择了代码覆盖工具Cobertura,这是由于它非常容易使用,而且拥有良好的定义格式,以及四个Ant任务接 口。这些任务之一就是cobertura-check,当代码不能完成我们要求的覆盖率时,它就会失败。如下面的代码显示如果覆盖率未达到80%,Ant 在建立工程时就会失败:

bitsCN_com

  <target name="coverage_check"> bitsCN_com

  <cobertura-check totallinerate="80"/>

中国网管论坛

  </target name="coverage_check"> bitsCN.Com

  除了使用硬编码来指定这个覆盖率外,我们还可能以使用一个更容易建立的结果作为当前核对的覆盖率。我们可以通过使用两个核心Ant任务连接一对 Cobertura任务来完成这个任务。并不不用担心各种覆盖率的具体的值。我们的目标是完成可测量的代码改善,而不是设置一个绝对的代码覆盖率。

bitsCN.nET中国网管博客

  在建立用于测试和运行我们的代码的targets后,我们可以将用于核对我们的建立脚本的增量覆盖率。第一步是使用一个cobertura报吿任务建立一个XML格式的覆盖报表。代码如下:

bitsCN.nET中国网管博客

  <cobertura-report format="xml"/>

www_bitscn_com

  下面是由一个cobertura报表任务产生的 中国_网管联盟

  coverage.xml 中国.网管联盟

  <?xml version="1.0"?>

www.bitsCN.com

  <!DOCTYPE coverage SYSTEM "http://cobertura.sourceforge.net/xml/coverage-02.dtd">

中国网管联盟

  <coverage line-rate="0.43612334801762115" branch-rate="0.48344370860927155" version="1.8" timestamp="1181043899853"> bitsCN.nET中国网管博客

  <sources>

中国网管论坛

  <source>./src/java</source>

bbs.bitsCN.com

  </sources> www_bitscn_com

  <packages>

BBS.bitsCN.com网管论坛

  …… 中国网管联盟

  </packages>

bitscn.com

  </coverage> bbs.bitsCN.com

  现在要确保将这个文件保存在某个硬盘上,因为我们在后面会需要这个文件。

中国网管联盟

  二、从报表中取出覆盖率

DL.bitsCN.com网管软件下载

  一开始,我们可以试着使用Ant的XmlProperty任务来直接获得这个覆盖率,并给一个Ant属性。但是这个方法有以下两个问题: www.bitsCN.com

  1. 在coverage.xml中的覆盖率是一个小数,但当核对任务时需要一个整数百分比。

中国_网管联盟

  2. 在实际的项目中,coverage.xml的文件尺寸非常大,如果在Java中尝试使用XmlProperty任务时可能会出现Java OutOfMemoryError错误。而我们只想从coverage.xml文件中获得以下的内容:

bitsCN_com

  <xslt in="coverage.xml" out="build/coverage.properties" style="src/xsl/coverage.xsl" />

 

上面的简单的XSL模板需要产生一个只包含我们需要的值的属性文件,内容如下:

中国_网管联盟

  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> www_bitscn_com

  <xsl:output method="text" omit-xml-declaration="yes"/> DL.bitsCN.com网管软件下载

  <xsl:template match="coverage">

中国.网管联盟

  total.line-rate=

中国_网管联盟

  <xsl:value-of select="floor(@line-rate*100)"/> BBS.bitsCN.com网管论坛

  </xsl:template> 中国.网管联盟

  </xsl:stylesheet>

bitsCN.Com

  要注意的是方法floor(@line-rate*100),可以将小数覆盖率转换为整型覆盖率。最终结果是一个只包含下面一行的coverage.properties文件:

DL.bitsCN.com网管软件下载

  total.line-rate=44

bitsCN_com

  现在我们可以使用Ant的属性任务来从coverage.properties读取这个Ant属性所需要的覆盖率: 中国网管论坛

  <property file="build/coverage.properties" />

bitsCN_com

  最后,我们可以将最初的"80"使用新的Ant属性替换,代码如下: bitscn.com

  <cobertura-check totallinerate="${total.line-rate}"/>

bitsCN_com

  三、将内容放到一起

中国_网管联盟

  最后的build.xml文件看上去的形似如下: 中国网管论坛

  <target name="coverage_check" depends="check_against_previous_rate"> bitsCN.Com

  <antcall target="coverage_report"/> 中国_网管联盟

  </target> 中国.网管联盟

  <target name="coverage_report">

中国_网管联盟

  <cobertura-report format="xml" destdir="." />

www_bitscn_com

  </target>

bitsCN_com

  <target name="check_against_previous_rate" depends="coverage_xml_to_properties"> www.bitsCN.com

  <property file="build/coverage.properties" /> 中国网管论坛

  <cobertura-check totallinerate="${coverage.line-rate}" /> www.bitsCN.com

  </target> DL.bitsCN.com网管软件下载

  <target name="coverage_xml_to_properties"> bitsCN.nET中国网管博客

  <xslt in="coverage.xml" out="build/coverage.properties" style="src/xsl/coverage.xsl" />

中国_网管联盟

  </target> DL.bitsCN.com网管软件下载

  要注意一个新的覆盖报告仅仅当覆盖核对被通过后才能被产生,也就是说,每次提高覆盖率后,都会比上一次建立的代码质量有所提高。

中国网管论坛

  四、改善跟踪率的其他方法

BBS.bitsCN.com网管论坛

  还有一些递增地改善代码质量的方法是通过将覆盖率记录到文件中来跟踪代码改善率。我们可以通过Ant的echo任务建立如下的代码:

中国.网管联盟

  <target name="time">

www.bitsCN.com

  <tstamp> bitsCN.Com

  <format property="date.time" pattern="yyyy-MM-dd HH:mm"/>

www.bitsCN.com

  </tstamp> BBS.bitsCN.com网管论坛

  </target> 中国网管论坛

  <target name="log" depends="time">

中国.网管联盟

  <echo file="${history.txt}" append="true">

bitsCN.nET中国网管博客

  ${date.time};total.line-rate;${total.line-rate} 中国.网管联盟

  </echo> bbs.bitsCN.com

  </target> DL.bitsCN.com网管软件下载

  五、结果可测量、改善可视化 bbs.bitsCN.com

  经过对一个工程的测试,在这个工作使用本文所提供的策略后的一周内定,这个工程的代码质量改善了超过30%.而更另人兴奋的是以前开发人员都不需要对代码进行测试,而现在它们会为通过测试而使他们的代码质量的提高感到骄傲。 DL.bitsCN.com网管软件下载

  当然,我们不需要只停留在本文所介绍的方法和理论上。我们也可以将增量改善策略用在其他的代码规则中。因为大多数的代码核对工具都可以产生基于XML格式的输出,我们可以使用XSL模板来过滤出与之相关的代码规则,并将这些规则作为当前的代码核对工具的输入。

 

 

分享到:
评论

相关推荐

    阿里巴巴java笔试zz.

    3. 李白买酒问题:这是一个数学问题,与编程无关,但逻辑思维是程序员必备的技能。解题方法是通过逆向计算,确定李白每次遇到店和花时的饮酒情况。 4. 类比推理题:这道题目考察逻辑推理和类比能力,与编程语言无关...

    base zz zz zz zz

    base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz

    java代码,简单小程序

    java代码。对初学者有大用!

    基于Java与HTML的studyjava-zz设计源码,深入探索Java编程新视野

    该项目为“studyjava-zz”设计源码,深入探索Java编程新视野,共计包含549个文件,涵盖209个Java源代码文件、74个Git忽略文件、70个项目配置文件、68个classpath文件、66个偏好设置文件、25个Markdown文档、16个XML...

    JAVA源码Java火影忍者游戏源代码

    根据提供的文件信息,我们可以推断出这是一份关于使用Java编程语言开发的“火影忍者”游戏的源代码。接下来,我们将详细分析并总结出与该标题、描述及部分内容相关的知识点。 ### Java编程语言 Java是一种广泛使用...

    Zz: java 线程池设计思想

    3. **workQueue**:用于保存待执行任务的工作队列,通常有三种类型:无界队列(如`LinkedBlockingQueue`)、有界队列(如`ArrayBlockingQueue`)和直接提交(如`SynchronousQueue`)。 4. **threadFactory**:线程...

    zz.rar_JAVA俄罗斯方块

    本项目“zz.rar_JAVA俄罗斯方块”提供了一套完整的JAVA源代码,让开发者可以深入理解如何用JAVA语言实现这个经典游戏。本文将详细解析该项目中的关键知识点,帮助读者更好地理解和掌握JAVA编程技巧。 1. **JAVA基础...

    聊天工具的java开发 超越QQ 天翔ZZ

    《聊天工具的Java开发:超越QQ,天翔ZZ》 在IT行业中,开发一款聊天工具是一项挑战性十足的任务,尤其当目标是超越如QQ这样的巨头时。本文将深入探讨使用Java语言开发聊天工具的关键知识点,结合"天翔ZZ"这个项目,...

    java源代码

    Java源代码是编程学习的重要组成部分,它展示了程序的逻辑结构和实现细节,是理解Java语言原理和编程思想的关键。这份压缩包包含了一系列的Java源文件,涵盖了从初级到中级的编程知识,对于初学者和有一定基础的学习...

    爱心代码 zz.zipz

    在IT行业中,"爱心代码 zz.zipz" 的标题暗示了一个编程相关的项目,可能是某位开发者为了表达情感或者公益目的而创建的。这个压缩文件包含了名为 "爱心代码 (5).zip" 的子文件,可能是一个包含多个源代码文件的集合...

    利用 First Fit 算法解决物流3D bin packing问题 Java实现

    在实际编程中,还需要注意一些细节,例如错误处理、输入验证和代码优化。此外,为了测试算法的有效性,可以使用随机生成的数据集或真实物流场景的数据。 总结来说,First Fit算法通过简单地将物品放入第一个足够大...

    ZZ超级画板教程.pdf

    7. 高质量画笔选项:ZZ 超级画板增加了高质量画笔选项,图形更加细致美观。 8. 色彩渐变的画笔和填充选项:用户可以使用变化的参数来控制色彩。 9. 可变换文本的插入功能:用户可以插入可变换的文本,高度和宽度可以...

    Java语言基础入门教程 Java实训教程 14.嵌套类等 共34页.pptx

    ### Java语言基础入门教程:嵌套类详解 #### 一、概述 《Java语言基础入门教程》中的第14章主要介绍了嵌套类的相关概念及其使用方法。本章旨在通过详细的解析帮助读者理解和掌握嵌套类的基础知识以及如何在实际...

    利用 Best Fit 算法解决物流3D bin packing问题 Java实现

    在Java代码中,你可以使用`ArrayList`或`LinkedList`作为箱子列表,`Comparator`实现箱子的排序,以及`if`语句或`switch`语句进行条件判断。同时,注意使用面向对象的设计原则,使代码可读性和可维护性更强。 **...

    JAVA源码Java赌神游戏网络版源代码

    通过对“JAVA源码Java赌神游戏网络版源代码”的分析,我们不仅了解了 Java 语言的基础知识,还深入了解了如何使用 Java 进行网络游戏的开发。此外,还讨论了百度网盘作为资源分享平台的一些特点和注意事项。这些知识...

    Java课程设计 介绍及代码

    在"Java课程设计 介绍及代码"这个主文件中,我们可能会发现一系列的Java代码示例,每段代码都对应一个具体的课程设计任务。这些代码可能分为多个部分,包括问题描述、需求分析、设计方案、代码实现和测试结果。通过...

    JAVA源码Java游戏沙丘城堡源代码

    通过对“JAVA源码Java游戏沙丘城堡源代码”的分析,我们不仅了解了JAVA语言在游戏开发领域的应用及其优势,同时也深入了解了该游戏的具体实现方式和技术栈。这对于想要学习JAVA游戏开发的朋友来说,是一份非常宝贵的...

    zz牌类小游戏24点

    三是这款游戏主要是作为初学者的学习资源,说明它的代码可能设计得相对简单易懂,便于学习和理解Java编程基础以及游戏开发的基本原理。 【标签关联知识点】 1. **Java**: Java是一种广泛使用的高级编程语言,具有跨...

    zz经典C代码.rar_C语言 图像_ZZ丫C香烟代码

    标题中的“zz经典C代码.rar_C语言 图像_ZZ丫C香烟代码”暗示了这是一个包含C语言编程中关于图像处理的代码集合,可能是一些示例或实践项目。"ZZ丫C香烟代码"可能是作者或者这个代码库的特定代号或者命名风格。描述中...

    zz CAD快速计算长度插件

    在CAD中想要快速测量长度,在CAD工具栏找到加载应用程序,再点击加载 加载成功后在输入栏输入“zz”(不分大小写)在选择你需要测量的线段即可。

Global site tag (gtag.js) - Google Analytics