2016-05-12 1 views
2

Я уже знаю о различных комментариях или комментариях, которые я могу добавить в свой код, но это не то, что я ищу.Есть ли способ сделать набор правил PMD игнорировать методы Hashcode & Equals для сложности Cyclomatic?

Я ищу способ, которым я могу изменить правило CyclomaticComplexity. Я не видел никаких вариантов в правиле, хотя это кажется довольно распространенной потребностью. И, похоже, это не xpath, поскольку он использует класс java.

Если ничего лучше, вы можете переопределить класс java, используемый для правила?

ответ

2

Вы правы, для этого правила нет конкретного варианта, чтобы явно игнорировать методы hashCode и equals. Однако теперь это должно быть возможно через suppressions. Каждое правило имеет свойство «ственное нарушение », и кажется, что это используется для этого правила таким образом, что он должен работать с этим прецедентом: он применяется не только к нарушениям, но и при анализе исходного кода.

Читальный код CyclomaticComplexityRule который наследует от StdCyclomaticComplexityRule. Если вы посмотрите на line 188, вы увидите, что узел метода проверен для любых подавлений. Если метод подавлен, то он не анализируется, и не следует учитывать в отношении сложности класса. [См. Обновление ниже].

Возможное выражение XPath для violationSuppressXPath может выглядеть следующим образом:

./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 собственности, методы "равно" и "хэш-код" не выделяются больше. Подавляются только сообщения о нарушении. Однако содержание метода все еще учитывает общую сложность класса, поэтому любые условия/if statements/loop/etc. (это потому, что super.visit() вызывается перед подавлением в line 186), и потому что проверка isSuppressed только понимает аннотации.

Это означает, что, хотя сам метод больше не выделяется, класс является, поскольку он содержит сложный метод.

Единственный способ полностью игнорировать РАВНО/методы Hashcode есть, аннотировать их с

@SuppressWarnings("PMD.CyclomaticComplexity") 

Затем они полностью игнорируются, и на самом деле не засчитываются сложности класса.

+0

Что было бы замечательно - это возможность помещать имена методов «equals» и «hashCode» в XML на верхнем уровне, подобно файлам, которые следует игнорировать. Наверное, большой вопрос, верно? – Adam

+1

Я аннотировал мои 'equals()' и 'hashCode()' с '@SuppressWarnings (" PMD.CyclomaticComplexity ")', но я все еще вижу предупреждения в классе: 'Класс 'Order' имеет модифицированную циклическую сложность из 3 (максимум = 11) .' и аналогично для «Стандартной циклической сложности». – Adam

+1

@ Adam Старый пост, но я тоже натолкнулся на это. Для решения «стандартной циклической сложности» и «модифицированной циклической сложности» вы также можете использовать '@ SuppressWarnings' и включать в себя как« PMD.ModifiedCyclomaticComplexity », так и« PMD.StdCyclomaticComplexity ». – avojak

Смежные вопросы