有没有办法让 PMD 规则集忽略圈复杂度的 Hashcode 和 Equals 方法?
Is there a way to make PMD ruleset ignore Hashcode & Equals methods for Cyclomatic complexity?
我已经知道可以添加到我的代码中的各种注释或注释,但这不是我要找的。
我正在寻找一种只让我修改 CyclomaticComplexity 规则的方法。
我没有在规则中看到任何选项,尽管这似乎是一个相当普遍的需求。而且似乎没有 xpath,因为它使用 java class.
如果没有更好的办法,您可以覆盖用于规则的 java class 吗?
你是对的,这条规则没有特定的选项来显式忽略 hashCode
和 equals
方法。但是,现在应该可以通过 suppressions。每个规则都有一个 "violationSuppressXPath" 属性 - 看起来,这在某种程度上用于此规则,它应该适用于这个用例:它不仅适用于违规行为,而且同时分析源代码。
这是 CyclomaticComplexityRule which inherits from StdCyclomaticComplexityRule. If you look at line 188 的源代码,您会看到已检查方法节点是否有任何抑制。如果该方法被抑制,则不会对其进行分析,并且 不应计入 class 复杂度。 [请参阅下面的更新]。
violationSuppressXPath
的可能的 XPath 表达式可能如下所示:
./MethodDeclarator[@Image='hashCode' or @Image='equals']
您需要使用 custom ruleset,才能配置 属性。您的规则集可能如下所示:
<?xml version="1.0"?>
<ruleset name="Custom ruleset"
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
<description>CyclomaticComplexity ignoring hashCode and equals</description>
<rule ref="rulesets/java/codesize.xml/CyclomaticComplexity">
<properties>
<property name="violationSuppressXPath" value="./MethodDeclarator[@Image='hashCode' or @Image='equals']"/>
</properties>
</rule>
</ruleset>
请注意,我的示例使用 PMD 5。4.x - 它比您提到的 PMD 4.3 更新得多。规则组织已更改以支持多种语言 - 这意味着 PMD 4.3 的规则参考将只是 rulesets/codesize.xml/CyclomaticComplexity
.
更新 (2016-05-20)
使用配置的 violationSuppressXPath 属性,方法 "equals" 和 "hashCode" 不再突出显示。仅抑制违规消息。 但是方法的内容仍然计算class的总复杂度,因此任何conditions/ifstatements/loops/etc。被检查(这是因为 super.visit()
在 line 186 的抑制之前被调用)并且因为 isSuppressed
检查只理解注释。
这意味着,虽然方法本身不再突出显示,但 class 是,因为它包含一个复杂的方法。
完全忽略 equals/hashCode 方法的唯一方法是用
注释它们
@SuppressWarnings("PMD.CyclomaticComplexity")
然后,它们将被完全忽略,并且真的不计入 class 复杂度。
对我有用。
// Ignore PMD warning that equals and hashCode should be defined, while we need only custom equals.
@SuppressWarnings("PMD.OverrideBothEqualsAndHashcode")
class DefineYourClass...
我已经知道可以添加到我的代码中的各种注释或注释,但这不是我要找的。
我正在寻找一种只让我修改 CyclomaticComplexity 规则的方法。 我没有在规则中看到任何选项,尽管这似乎是一个相当普遍的需求。而且似乎没有 xpath,因为它使用 java class.
如果没有更好的办法,您可以覆盖用于规则的 java class 吗?
你是对的,这条规则没有特定的选项来显式忽略 hashCode
和 equals
方法。但是,现在应该可以通过 suppressions。每个规则都有一个 "violationSuppressXPath" 属性 - 看起来,这在某种程度上用于此规则,它应该适用于这个用例:它不仅适用于违规行为,而且同时分析源代码。
这是 CyclomaticComplexityRule which inherits from StdCyclomaticComplexityRule. If you look at line 188 的源代码,您会看到已检查方法节点是否有任何抑制。如果该方法被抑制,则不会对其进行分析,并且 不应计入 class 复杂度。 [请参阅下面的更新]。
violationSuppressXPath
的可能的 XPath 表达式可能如下所示:
./MethodDeclarator[@Image='hashCode' or @Image='equals']
您需要使用 custom ruleset,才能配置 属性。您的规则集可能如下所示:
<?xml version="1.0"?>
<ruleset name="Custom ruleset"
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
<description>CyclomaticComplexity ignoring hashCode and equals</description>
<rule ref="rulesets/java/codesize.xml/CyclomaticComplexity">
<properties>
<property name="violationSuppressXPath" value="./MethodDeclarator[@Image='hashCode' or @Image='equals']"/>
</properties>
</rule>
</ruleset>
请注意,我的示例使用 PMD 5。4.x - 它比您提到的 PMD 4.3 更新得多。规则组织已更改以支持多种语言 - 这意味着 PMD 4.3 的规则参考将只是 rulesets/codesize.xml/CyclomaticComplexity
.
更新 (2016-05-20)
使用配置的 violationSuppressXPath 属性,方法 "equals" 和 "hashCode" 不再突出显示。仅抑制违规消息。 但是方法的内容仍然计算class的总复杂度,因此任何conditions/ifstatements/loops/etc。被检查(这是因为 super.visit()
在 line 186 的抑制之前被调用)并且因为 isSuppressed
检查只理解注释。
这意味着,虽然方法本身不再突出显示,但 class 是,因为它包含一个复杂的方法。
完全忽略 equals/hashCode 方法的唯一方法是用
注释它们@SuppressWarnings("PMD.CyclomaticComplexity")
然后,它们将被完全忽略,并且真的不计入 class 复杂度。
对我有用。
// Ignore PMD warning that equals and hashCode should be defined, while we need only custom equals.
@SuppressWarnings("PMD.OverrideBothEqualsAndHashcode")
class DefineYourClass...