Werkzeuge zur Erhaltung der Softwarearchitektur – PMD / DRY – Teil 10


PMD

Das Werkzeug PMD analysiert den Quellcode. Nach Angaben der Entwickler ist PMD kein Akronym. Besonders hervorzuheben sind folgende Analysepunkte

  • Cut and Paste Detector – Duplizierter Quellcode
    • bläht den Quellcode auf
    • erschwert die Wartung
    • erhöht den Testaufwand
  • Zuweisungen in Schleifenbedingungen
  • Komplexitätsanalyse / Lose Kopplung (Law of Demeter)
  • Umfangreiches, strukturiertes Regelwerk
  • Erkennung von doppelten unäre Operationen (!!)

Für den Bereich Kommentare und Dokumentation ist PMD nicht geeignet (vergl. Checkstyle).

Integration

  • IDE
  • SVN Pre-Commit Hook
  • Maven-Build (Ausführung und Erzeugen von Basisdaten)
  • Jenkins (GUI und Grenze für ungültige Artefakte)
    • DRY: Darstellung Cut and Paste Detector

False/Positive

False/Positives können auf folgende Weisen markiert werden

  • Parametrisierung der Regeln
  • Codestellen über Annotation oder Kommentare markieren
  • Ausschluss von Projekten / Packages

Regelerweiterung

Es werden verschiedene Regelpakete / Module bereitgestellt.

  • Java für JEE / Android
  • https://pmd.github.io/pmd-5.4.1/pmd-java/rules/index.html
  • nicht Java Code (z.B. JSF, JSP, JavaScript)

Des Weiteren sind eigene Erweiterungen möglich, wenn auch meistens nicht notwendig

  • Java / Xpath
  • http://pmd.sourceforge.net/pmd-4.3.0/howtowritearule.html
  • http://pmd.sourceforge.net/pmd-4.3.0/xpathruletutorial.html
  • https://pmd.github.io/latest/pmd-java/rules/index.html

Beispiel Blacklist für Regeln

<?xml version="1.0" encoding="UTF-8"?>
<ruleset xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         name="pmd-eclipse"
         xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
    <description>shoeso RuleSet</description>

    <!-- Regeldefinition siehe https://pmd.github.io/latest/pmd-java/rules/index.html -->

    <rule ref="rulesets/java/basic.xml">
        <exclude name="AvoidUsingHardCodedIP"/>
        <exclude name="CollapsibleIfStatements"/>
    </rule>

    <rule ref="rulesets/java/clone.xml">
    </rule>
    ...
</ruleset>

Du hast Fragen oder Anmerkungen? Kontakt: arndt@schoenb.de