Board logo

标题: 用 PMD 铲除 bug(2) [打印本页]

作者: look_wt    时间: 2018-10-15 18:50     标题: 用 PMD 铲除 bug(2)

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

您可以一次用多个规则集进行检查,只需在命令行中用逗号分隔规则集名称即可:
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 类的抽象语法树进行处理。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0