2016-05-12 15 views
2

Ich bin bereits über die verschiedenen Anmerkungen oder Kommentare informiert, die ich in meinen Code einfügen kann, aber das ist nicht das, wonach ich suche.Gibt es eine Möglichkeit, PMD-Regelsatz Hashcode & Equals Methoden für Cyclomatic Komplexität zu ignorieren?

Ich bin auf der Suche nach einer Möglichkeit, die nur mich ändern die CyclomaticComplexity Regel. Ich habe keine Option in der Regel gesehen, obwohl es scheint, als eine ziemlich häufige Notwendigkeit. Und es scheint keinen X-Pfad zu geben, da er eine Java-Klasse verwendet.

Wenn nichts besser ist, können Sie die für die Regel verwendete Java-Klasse überschreiben?

Antwort

2

Sie haben recht, es gibt keine spezielle Option für diese Regel, die Methoden hashCode und equals explizit zu ignorieren. Allerdings sollte es jetzt über suppressions möglich sein. Jede Regel hat eine "violationSuppressXPath" -Eigenschaft - und es scheint, dass dies für diese Regel in einer Weise verwendet wird, dass es mit diesem Anwendungsfall funktionieren sollte: Es wird nicht nur für die Verstöße angewendet, sondern auch während der Analyse des Quellcodes.

Hier ist der Quellcode für CyclomaticComplexityRule, der von StdCyclomaticComplexityRule erbt. Wenn Sie sich line 188 ansehen, sehen Sie, dass der Methodenknoten auf Unterdrückungen geprüft wird. Wenn die Methode unterdrückt wird, wird sie nicht analysiert und sollte nicht zur Klassenkomplexität gezählt werden. [Siehe Update unten].

Ein möglicher XPath-Ausdruck für violationSuppressXPath könnte wie folgt aussehen:

./MethodDeclarator[@Image='hashCode' or @Image='equals'] 

Sie erhalten ein custom ruleset, um verwenden müssen, um die Eigenschaft zu konfigurieren. Du bist ruleset könnte wie folgt aussehen:

<?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> 

Bitte beachten Sie, dass meine Beispiele PMD 5.4.x verwenden - die viel neuer als PMD 4.3 Sie genannt. Die Regelorganisation wurde geändert, um mehrere Sprachen zu unterstützen. Dies bedeutet, dass die Regelreferenz für PMD 4.3 nur rulesets/codesize.xml/CyclomaticComplexity lautet.

-Update (2016-05-20)

Mit der konfigurierten violationSuppressXPath Eigenschaft, die Methoden "gleich" und "hashCode" werden nicht mehr hervorgehoben. Nur die Verletzungsnachrichten werden unterdrückt. Allerdings der Inhalt der Methode zählt immer noch zu der gesamten Komplexität der Klasse, so dass alle Bedingungen/if Anweisungen/Schleifen/etc. werden überprüft (dies ist, weil super.visit() vor der Unterdrückung bei line 186 aufgerufen wird) und weil die isSuppressed Prüfung nur Anmerkungen versteht.

Dies bedeutet, während die Methode selbst nicht mehr markiert ist, ist die Klasse, weil sie eine komplexe Methode enthält.

Der einzige Weg ist, um vollständig die Gleichen/hashCode Methoden zu ignorieren, diese mit Dann

@SuppressWarnings("PMD.CyclomaticComplexity") 

mit Anmerkungen zu versehen, werden sie völlig ignoriert und in Richtung der Klasse Komplexität zählen nicht wirklich.

+0

Was wäre hervorragend ist die Fähigkeit, die Methodennamen 'equals' und 'hashCode' im XML auf der obersten Ebene, ähnlich wie Dateien, die ignoriert werden sollen. Wahrscheinlich eine große Frage, oder? – Adam

+1

Ich habe meine 'equals()' und 'hashCode()' mit '@SuppressWarnings (" PMD.CyclomaticComplexity ") annotiert, aber ich sehe immer noch die Warnungen in der Klasse:' Die Klasse 'Order' hat eine modifizierte zyklomatische Komplexität von 3 (Höchste = 11) .' und ähnlich für 'Standard Cyclomatic Comlexity'. – Adam

+1

@Adam Alte Post, aber ich stieß auch auf diese. Um die 'Standard Cyclomatic Complexity' und' Modified Cyclomatic Complexity' zu adressieren, können Sie auch '@ SuppressWarnings' verwenden und sowohl" PMD.ModifiedCyclomaticComplexity "als auch" PMD.StdCyclomaticComplexity "' einschließen. – avojak