2010-11-28 3 views
99

Был question comparing PMD and CheckStyle. Тем не менее, я не могу найти хороший анализ различий/сходств между PMD и FindBugs. Я считаю, что ключевое различие заключается в том, что PMD работает с исходным кодом, а FindBugs работает с скомпилированными файлами байт-кода. Но с точки зрения возможностей, должен ли он быть либо/или выбором, либо дополнять друг друга?В чем разница между PMD и FindBugs?

ответ

136

Я использую оба. Я думаю, они дополняют друг друга.

Как вы сказали, PMD работает с исходным кодом и поэтому обнаруживает такие проблемы, как: нарушение соглашений об именах, отсутствие фигурных скобок, неправильная проверка нулей, длинный список параметров, ненужный конструктор, отсутствие перерыва в коммутаторе и т. Д. PMD также сообщает вы о вашего кода, который я нахожу очень полезным (FindBugs не говорит вам о сложности Cyclomatic).

FindBugs Работы по байт-коду. Вот некоторые проблемы: FindBugs обнаруживает, что PMD не делает: метод equals() терпит неудачу в подтипах, метод clone может возвращать значение null, сравнительное сравнение логических значений, невозможное литье, 32bit int сдвинуто на величину, не находящуюся в диапазоне 0-31, коллекция, содержащая себя, метод equals всегда возвращает true, бесконечный цикл и т. д.

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

+0

Каков конкретный код ошибки, который вы видели, когда коллекция содержит себя и почему это указывает на вероятную ошибку FindBugs? – Geek 2013-03-17 11:58:35

20

Лучшая особенность PMD: XPath Rules, в комплекте с конструктором правил, позволяющий легко создавать новые правила из образцов кода (аналогично построителям GUI RegEx и XPath). FindBugs сильнее из коробки, но очень важно разработать конкретные правила и шаблоны проекта.

Например, я столкнулся с проблемой производительности, связанной с 2-мя вложенными циклами, что привело к времени работы O (n^2), чего легко избежать. Я использовал PMD для создания специального запроса , чтобы просмотреть другие экземпляры вложенных циклов - // ForStatement/Statement // ForStatement. Это указывало на еще два случая проблемы. Это не общее правило.

1

ПМД

  • известный
  • широко используется в промышленности
  • вы можете добавить свои правила в XML
  • дает подробный анализ уровней Ошибки и уровни предупреждения
  • вы также можете сканировать ваш код для «копировать и вставлять строки». Дублировать код. Это дает хорошее представление об использовании java oops.
Смежные вопросы