首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

用 PMD 铲除 bug(2)

用 PMD 铲除 bug(2)

可用的规则PMD 包含 16 个规则集,涵盖了 Java 的各种常见问题,其中一些规则要比其他规则更有争议:
传递哪个名称?对于在命令行中传递的规则名称,没有详细的文档记录。有时需要试一下并产生一些错误,您才能清楚这些名称。在这里,圆括号中给出的名称是可以使用的。

  • 基本(rulesets/basic.xml)—— 规则的一个基本合集,可能大多数开发人员都不认同它:          catch 块不该为空,无论何时重写           equals(),都要重写           hashCode(),等等。
  • 命名(rulesets/naming.xml)—— 对标准 Java 命令规范的测试:变量名称不应太短;方法名称不应过长;类名称应当以小写字母开头;方法和字段名应当以小写字母开头,等等。
  • 未使用的代码(rulesets/unusedcode.xml)—— 查找从未使用的私有字段和本地变量、执行不到的语句、从未调用的私有方法,等等。
  • 设计(rulesets/design.xml)—— 检查各种设计良好的原则,例如:          switch 语句应当有            default 块,应当避免深度嵌套的           if 块,不应当给参数重新赋值,不应该对 double 值进行相等比较。
  • 导入语句(rulesets/imports.xml)—— 检查 import 语句的问题,比如同一个类被导入两次或者被导入           java.lang 的类中。
  • JUnit 测试(rulesets/junit.xml)—— 查找测试用例和测试方法的特定问题,例如方法名称的正确拼写,以及           suite() 方法是不是 static 和 public。
  • 字符串(rulesets/string.xml)—— 找出处理字符串时遇到的常见问题,例如重复的字符串标量,调用           String 构造函数,对           String 变量调用           toString() 方法。
  • 括号(rulesets/braces.xml)—— 检查           for、           if、          while 和           else 语句是否使用了括号。
  • 代码尺寸(rulesets/codesize.xml)—— 测试过长的方法、有太多方法的类以及重构方面的类似问题。
  • Javabean(rulesets/javabeans.xml)—— 查看 JavaBean 组件是否违反 JavaBean 编码规范,比如没有序列化的 bean 类。
  • 终结函数(finalizer)—— 因为在 Java 语言中,          finalize() 方法不是那么普遍(我上次编写这个代码也经是好多年前的事了),所以它们的使用规则虽然很详细,但是人们对它们相对不是很熟悉。这类检查查找           finalize() 方法的各种问题,例如空的终结函数,调用其他方法的           finalize() 方法,对           finalize() 的显式调用,等等。
  • 克隆(rulesets/clone.xml)—— 用于           clone() 方法的新规则。凡是重写           clone() 方法的类都必须实现           Cloneable,          clone() 方法应该调用           super.clone(),而           clone() 方法应该声明抛出           CloneNotSupportedException 异常,即使实际上没有抛出异常,也要如此。
  • 耦合(rulesets/coupling.xml)—— 查找类之间过度耦合的迹象,比如导入内容太多;在超类型或接口就已经够用的时候使用子类的类型;类中的字段、变量和返回类型过多等。
  • 严格的异常(rulesets/strictexception.xml)—— 针对异常的测试:不应该声明该方法而抛出           java.lang.Exception 异常,不应当将异常用于流控制,不应该捕获           Throwable,等等。
  • 有争议的(rulesets/controversial.xml)—— PMD 的有些规则是有能力的 Java 程序员可以接受的。但还是有一些争议。这个规则集包含一些更有问题的检验,其中包括把 null 赋值给变量、方法中有多个返回点,以及从           sun 包导入等。
  • 日志(rulesets/logging-java.xml)—— 查找           java.util.logging.Logger 的不当使用,包括非终状态(nonfinal)、非静态的记录器,以及在一个类中有多个记录器。
您可以一次用多个规则集进行检查,只需在命令行中用逗号分隔规则集名称即可:
1
2
$ /usr/pmd-2.1/etc/pmd.sh ~/Projects/XOM/src html
rulesets/design.xml,rulesets/naming.xml,rulesets/basic.xml




构建自己的规则集 如果频繁地用某个规则集合进行检查,那么您可能想把它们组合在自己的规则集文件中,如清单 2 所示。这个规则集导入了一些基本规则、命名规则和设计规则:
清单 2. 导入基本规则、命名规则和设计规则的规则集
1
2
3
4
5
6
7
8
9
<?xml version="1.0"?>
<ruleset name="customruleset">
  <description>
  Sample ruleset for developerWorks article
  </description>
  <rule ref="rulesets/design.xml"/>
  <rule ref="rulesets/naming.xml"/>
  <rule ref="rulesets/basic.xml"/>
</ruleset>




如果您的需求还要细一些,那么您可以从每个规则集中选取每个想要包含的规则。例如,清单 3 显示了一个定制规则集,它从三个内置规则集中选取了 11 个特定的规则。因为检查大型的代码基址需要的时间相当长,即使是在快速硬件上也是如此,所以这种方法还可以帮助您更快地发现您要查找的特定问题。
清单 3. 导入 11 个特定规则的规则集
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0"?>
<ruleset name="specific rules">
  <description>
  Sample ruleset for developerWorks article
  </description>
  <rule ref="rulesets/design.xml/AvoidReassigningParametersRule"/>
  <rule ref=
    "rulesets/design.xml/ConstructorCallsOverridableMethod"/>
  <rule ref="rulesets/design.xml/FinalFieldCouldBeStatic"/>
  <rule ref="rulesets/design.xml/DefaultLabelNotLastInSwitchStmt"/>
  <rule ref="rulesets/naming.xml/LongVariable"/>
  <rule ref="rulesets/naming.xml/ShortMethodName"/>
  <rule ref="rulesets/naming.xml/VariableNamingConventions"/>
  <rule ref="rulesets/naming.xml/MethodNamingConventions"/>
  <rule ref="rulesets/naming.xml/ClassNamingConventions"/>
  <rule ref="rulesets/basic.xml/EmptyCatchBlock"/>
  <rule ref="rulesets/basic.xml/EmptyFinallyBlock"/>
</ruleset>




您也可以把大多数规则包含在一个集合,但是不包括少数您不同意的或者会造成大量误报的特定规则。例如,XOM 在进行表查找的时候经常使用没有 default 块的         switch 语句。我可以保留大多数设计规则,但是可以在导入设计规则的规则元素中添加         <exclude name="SwitchStmtsShouldHaveDefault"/> 子元素,避开对遗漏         default 块的检查,如清单 4 所示:      
清单 4. 排除了设计规则的规则集,          switch 语句应当包含 default 块        
1
2
3
4
5
6
7
8
9
<?xml version="1.0"?>
<ruleset name="dW rules">
  <description>
  Sample ruleset for developerWorks article
  </description>
  <rule ref="rulesets/design.xml">
    <exclude name="SwitchStmtsShouldHaveDefault"/>
  </rule>
</ruleset>




(但是,细想一下,也许 PMD 是对的,而我应该添加 default 块。)
您可用的规则并不仅限于内置规则。您可以添加新规则:可以通过编写 Java 代码并重新编译 PDM,或者更简单些,编写 XPath 表达式,它会针对每个 Java 类的抽象语法树进行处理。
返回列表