«Почему» за правилами PMD - PullRequest
27 голосов
/ 24 марта 2010

Есть ли хороший ресурс, который описывает «почему» за наборами правил PMD? На сайте PMD есть «что» - то, что делает каждое правило - но он не описывает, почему PMD имеет это правило и почему игнорирование этого правила может привести к неприятностям в реальном мире. В частности, мне интересно знать, почему PMD имеет правила AvoidInstantiatingObjectsInLoops и OnlyOneReturn (первое кажется необходимым, если вам необходимо создать новый объект, соответствующий каждому объекту в коллекции, второе кажется необходимым во многих случаях, когда вернуть значение, основанное на некоторых критериях), но что я действительно ищу, так это ссылка где-то, объясняющая «почему» за большинством правил PMD, поскольку это встречается достаточно часто.

Просто чтобы прояснить, я знаю, что я могу отключить их и как это сделать, мне просто интересно, почему они там вообще. Извините, если есть что-то очевидное, что я пропустил, но я выполнил поиск Google и SO, прежде чем опубликовать это. Я также понимаю, что эти вопросы часто являются вопросом «вкуса» - я ищу то, что является аргументом для правил и какие есть альтернативы. Чтобы привести конкретный пример, как вы должны реализовать один объект, соответствующий каждому объекту в цикле (что является обычной операцией в Java) без создания экземпляров каждого объекта в цикле?

Ответы [ 4 ]

19 голосов
/ 24 марта 2010

В каждом случае правило может зависеть от конкретных обстоятельств или просто «вкуса».

Следует избегать создания объекта в цикле, если существует большое количество итераций, а создание экземпляров стоит дорого. Если вы можете переместить код из цикла, вы избежите много экземпляров объекта и, следовательно, улучшите производительность. Сказав это, это не всегда возможно, а в некоторых случаях это просто не влияет на общую производительность кода. В этих случаях делайте все, что яснее.

Для OnlyOneReturn есть несколько способов увидеть это (с ярыми сторонниками позади каждого), но все они в основном сводятся к вкусу.

Для вашего примера, сторонники OnlyOneReturn хотят код как:

public int performAction(String input) {
    int result;
    if (input.equals("bob")) {
        result = 1;
    } else {
        result = 2;
    }
    return result;
}

Вместо:

public int performAction(String input) {
    if (input.equals("bob")) {
        return 1;
    } else {
        return 2;
    }
}

Как видите, дополнительная ясность ReturnOnlyOnce может быть обсуждена.

Также см. Этот SO вопрос, который относится к реализации в циклах .

5 голосов
/ 24 марта 2010

Эта статья, Сравнение инструментов поиска ошибок для Java , "Ник Рутар, Кристиан Алмазан и Джефф Фостер, сравнивает несколько средств проверки ошибок для Java ..." - FindBugs Документы и публикации . PMD считается более многословным.

Приложение. Как предполагают авторы,

"все инструменты выбирают различные компромиссы между генерация ложных срабатываний и ложных отрицаний. "

В частности, AvoidInstantiatingObjectsInLoops может вообще не быть ошибкой, если это является намерением. Это включено, чтобы помочь Избегать создания ненужных объектов . Точно так же OnlyOneReturn носит наводящий характер. Множественные возвраты представляют собой форму goto , иногда считается вредной , но разумно используется для улучшения читабельности.

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

Как уже отмечалось здесь , более поздние версии PMD поддерживают улучшенную настройку при интеграции в процесс сборки.

1 голос
/ 24 марта 2010

Каждое правило находится в наборе правил PMD, который может дать вам подсказку о причинах, лежащих в основе правила (если это не объяснено подробно на самой странице набора правил).

В случае AvoidInstantiatingObjectsInLoops может быть дорогостоящим создание подобного объекта снова и снова. Однако это часто необходимо. В моем собственном проекте я отключил это правило, поскольку оно помечает слишком много ложных срабатываний.

В случае OnlyOneReturn обратите внимание, что он находится в наборе правил с именем Спорный , что указывает на то, что эти правила являются дискуссионными и зависят от конкретного случая. Я также отключил весь этот набор правил.

1 голос
/ 24 марта 2010

Вы можете заглянуть на домашнюю страницу PMD, здесь правила подробно объясняются и часто с объяснением почему. Сайт структурирован для правил-групп, здесь ссылка на basic-rules: http://pmd.sourceforge.net/rules/basic.html

...