Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

Ответ 4

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

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

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