Sự khác biệt giữa PMD và FindBugs là gì?


107

Có một câu hỏi so sánh PMD và CheckStyle . Tuy nhiên, tôi không thể tìm thấy phân tích tốt về sự khác biệt / tương đồng giữa PMD và FindBugs. Tôi tin rằng một điểm khác biệt chính là PMD hoạt động trên mã nguồn, trong khi FindBugs hoạt động trên các tệp bytecode được biên dịch. Nhưng xét về khả năng, đó có nên là một trong hai lựa chọn hay chúng bổ sung cho nhau?

Câu trả lời:


151

Tôi đang sử dụng cả hai. Tôi nghĩ chúng bổ sung cho nhau.

Như bạn đã nói, PMD hoạt động trên mã nguồn và do đó phát hiện các vấn đề như: vi phạm quy ước đặt tên, thiếu dấu ngoặc nhọn, kiểm tra null đặt sai vị trí, danh sách tham số dài, hàm tạo không cần thiết, thiếu ngắt trong công tắc, v.v. PMD cũng cho bạn biết về Cyclomatic độ phức tạp của mã của bạn mà tôi thấy rất hữu ích (FindBugs không cho bạn biết về độ phức tạp Cyclomatic).

FindBugs hoạt động trên bytecode. Dưới đây là một số vấn đề FindBugs tìm thấy PMD nào không: phương thức equals () không thành công trên các kiểu con, phương thức nhân bản có thể trả về null, so sánh tham chiếu các giá trị Boolean, không thể ép kiểu, 32 bit int bị dịch chuyển bởi một số lượng không nằm trong phạm vi 0-31, một tập hợp chứa chính nó, phương thức bằng luôn trả về true, một vòng lặp vô hạn, v.v.

Thông thường mỗi người trong số họ tìm thấy một loạt vấn đề khác nhau. Sử dụng cả hai. Những công cụ này đã dạy tôi rất nhiều về cách viết mã Java tốt.


Mã lỗi cụ thể mà bạn thấy khi một bộ sưu tập chứa chính nó là gì và tại sao mã đó lại được FindBugs đánh dấu là một lỗi có thể xảy ra?
Geek

cũng kể từ Sonarqube 6.3 không còn ... Sonarqube bây giờ cần Java 8 và FindBugs chỉ hỗ trợ Java 7 chưa
Markus

22

Tính năng tốt nhất của PMD là Quy tắc XPath của nó , đi kèm với Trình thiết kế quy tắc để cho phép bạn dễ dàng xây dựng các quy tắc mới từ các mẫu mã (tương tự như các trình tạo GUI của RegEx và XPath). FindBugs mạnh hơn hẳn, nhưng việc xây dựng các quy tắc và mẫu cụ thể của dự án là rất quan trọng.

Ví dụ: tôi đã gặp sự cố hiệu suất liên quan đến 2 vòng lặp for lồng nhau, dẫn đến thời gian chạy O (n ^ 2), điều này có thể dễ dàng tránh được. Tôi đã sử dụng PMD để tạo một truy vấn đặc biệt , để xem xét các trường hợp khác của các vòng lặp for lồng nhau - // ForStatement / Statement // ForStatement. Điều này chỉ ra thêm 2 trường hợp của vấn đề. Đây không phải là một quy tắc chung chung.


2

PMD là

  • nổi danh
  • được sử dụng rộng rãi trong công nghiệp
  • bạn có thể thêm các quy tắc của mình trong xml
  • cung cấp cho bạn phân tích chi tiết về mức độ lỗi và mức độ cảnh báo
  • bạn cũng có thể quét mã của mình để tìm "sao chép và dán các dòng". Mã trùng lặp. Điều này cung cấp ý tưởng tốt về việc triển khai các java oops.

Không nói chuyện với FindBugs; chúng bổ sung cho nhau vì các bộ vấn đề của chúng không giống nhau.
Stevers
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.