Почему правила PMD

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

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


person James Kingsbery    schedule 24.03.2010    source источник
comment
Я полагаю, что вы могли бы оценить книгу Стива МакКоннелла «Полный код», в которой он исследует эти вопросы более четко и исчерпывающе.   -  person NomeN    schedule 24.03.2010
comment
Я проверю это. Это больше похоже на то, что я искал.   -  person James Kingsbery    schedule 24.03.2010


Ответы (4)


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

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

У 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, который относится к создание экземпляров внутри циклов.

person jsight    schedule 24.03.2010
comment
+1 PMD не следует в большинстве случаев воспринимать очень серьезно по сравнению, например, с FindBugs. - person ponzao; 24.03.2010
comment
последний образец все равно должен генерировать ненужное предупреждение о предложении else :) - person matt b; 24.03.2010
comment
@matt b - Это тоже дело вкуса. :) - person jsight; 24.03.2010
comment
Привет, у меня небольшой вопрос. Должен ли я доверять правилам PMD и следовать им? - person emeraldhieu; 14.08.2011
comment
Зачем вам ссылаться на вопрос SO о PHP? Я надеюсь, что PHP и Java работают совершенно по-разному. - person rve; 01.05.2013
comment
@rve PHP и Java ничем не отличаются в этом аспекте. - person Alex Shesterov; 25.02.2017

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

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

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

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

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

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

person trashgod    schedule 24.03.2010
comment
Интересная статья, но не то, что я спрашивал. Как я уже сказал выше, я знаю, что могу отключить эти предупреждения, и мне интересно, какова причина, по которой PMD выдает эти предупреждения. - person James Kingsbery; 24.03.2010
comment
Ах, вы хотели разъяснить, в частности, эти два правила. Я подробно изложил выше, но ответ, процитированный @jsight, особенно хорошо касается OnlyOneReturn. - person trashgod; 24.03.2010
comment
Я никогда не думал, что return похож на goto, это полезно. - person James Kingsbery; 25.03.2010
comment
Сейчас я принимаю их как должное, но несколько полезных механизмов управления потоком можно считать отклонениями от структурного программирования. en.wikipedia.org/wiki/Structured_programming#Common_deviations - person trashgod; 25.03.2010
comment
ИзбежатьInstantiatingObjectsInLoops невозможно во многих распространенных ситуациях. Например, заполнение списка POJO из набора результатов. - person Lluis Martinez; 27.04.2016
comment
Цитируемой статье уже 14 лет, и в ней обсуждается PMD 1.9, который тогда был инструментом анализа только для Java. Сейчас PMD имеет версию 6.8.0, и с тех пор он значительно вырос как по объему, так и по точности своих правил, и хотя он по-прежнему содержит категорию стиля кода, он также имеет другие категории, которые более явно указывают на проблемы с кодом (безопасность). категория, подверженная ошибкам категория и т. д.) - person Johnco; 05.10.2018
comment
@Johnco: Спасибо за обновление. Я отредактировал ответ соответственно. - person trashgod; 05.10.2018

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

person Dishayloo    schedule 24.03.2010
comment
Как я сказал в своем посте, я знаю об этом, это не то, что я ищу, потому что в большинстве случаев нет почему (конкретно для двух, которые я ищу). - person James Kingsbery; 24.03.2010

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

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

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

person Avi    schedule 24.03.2010
comment
Да, как я уже сказал, я знаю, что вы можете, и я часто это делаю, отключать правила. - person James Kingsbery; 24.03.2010