2010-06-21 37 views
40

Tôi đang ở trong một dự án mà các lập trình viên trước đó đã dán mã sao chép toàn bộ địa điểm. Những mã này thực sự giống hệt nhau (hoặc rất giống nhau) và chúng có thể đã được cấu trúc lại thành một.Công cụ phát hiện mã trùng lặp (Java)

Tôi đã dành vô số giờ để tái cấu trúc các mã này theo cách thủ công nhưng tôi nghĩ rằng phải có cách tốt hơn. Một số là phương pháp tĩnh rất tầm thường có thể đã được chuyển vào một lớp tổ tiên (nhưng thay vào đó là bản sao được dán bởi tất cả các lập trình viên trước đây).

Có công cụ phân tích mã nào có thể phát hiện công cụ này và cung cấp báo cáo/đề xuất không? Tôi thích công cụ nguồn mở/miễn phí nếu có thể.

+5

Khá đáng tiếc rằng một số cuộc thảo luận hữu ích nhất được đóng là "không có chủ đề". Cuộc thảo luận dưới đây có chứa "câu trả lời được đề xuất và spam" không? Tại sao ngay sau khi mọi người có được một chút sức mạnh mà họ trải nghiệm điều này liên tục kêu gọi cảnh sát một cái gì đó mà không đòi hỏi bất kỳ cảnh sát? – user1433852

Trả lời

24

tôi sử dụng các công cụ sau:

Cả hai công cụ đều có hỗ trợ phát hiện trùng lặp mã. Nhưng cả hai đều thiếu khả năng tư vấn cho bạn cách refactor mã của bạn.

JetBrains IntelliJ IDEA Ultimate có phân tích mã tĩnh tốt với hỗ trợ sao chép mã, nhưng nó không phải là miễn phí.

+3

Checkstyle - không [bất kỳ chi tiết nào] (https://github.com/checkstyle/checkstyle/issues/523) – KrishPrabakar

5

Hầu hết các công cụ được liệt kê trong bài viết trên Wikipedia Duplicate Code Tools sẽ phát hiện các bản sao bằng nhiều ngôn ngữ khác nhau, bao gồm cả Java.

+0

Cảm ơn bạn đã liên kết. –

+3

Vì ai đó đã xóa các liên kết không có từ điển từ wikipedia, đây là liên kết đến phiên bản cũ của trang: http://en.wikipedia.org/w/index.php?title=Duplicate_code&oldid=522795578 ​​ – Nickolay

1

Hoặc là Simian hoặc PMD's CPD. Trước đây hỗ trợ một bộ ngôn ngữ rộng hơn nhưng không miễn phí cho các dự án thương mại.

+1

Một tính năng của simian khá tốt là khả năng tìm mã không được sao chép, nhưng được phát triển độc lập. Vì vậy, nó có thể làm điều tương tự, nhưng có tên biến hoàn toàn khác nhau và thậm chí cả các loại phụ. Thiết lập simainls bạn có thể chỉ định bỏ qua các tên biến và các kiểu phụ như cùng kiểu cha, v.v. – drekka

+0

Rất hiếm khi các máy dò bản sao tìm mã "không được sao chép mà phát triển độc lập" trừ khi các đoạn mã là vi mô (a * b là một bản sao của x * y và được phát triển độc lập nhưng không ai quan tâm. Có được xây dựng một máy dò bản sao mạnh mẽ, kinh nghiệm của tôi là những gì họ tìm thấy là mã đã được nhân bản; những cái tốt hơn có thể tìm thấy mã nhân bản với các tên biến được thay đổi và các hằng số khác nhau. Simian là một trong số đó. Những cái mạnh (tôi là một trong số này) có thể phát hiện khi các biểu thức phụ và câu lệnh tùy ý được thay thế. –

+0

Simian dường như không còn ở bất kỳ hình thức ban đầu nào. Trong mọi trường hợp, liên kết đã chết. Đây là một liên kết đến một công cụ Simian nhưng nó không phải là rõ ràng với tôi nếu nó là cùng một sản phẩm: http://www.harukizaemon.com/simian/ – pjv

0

Xem chúng tôi SD Java CloneDR, một công cụ để phát hiện chính xác và mã trùng lặp gần như bỏ lỡ trong các hệ thống Java lớn.

CloneDR sẽ tìm thấy các dòng mã mặc dù có thay đổi khoảng trắng, ngắt dòng, xóa chèn chú thích, sửa đổi hằng số hoặc số nhận dạng và trong một số trường hợp, thậm chí thay thế một câu lệnh khác.

Nó cho thấy nơi mỗi tập hợp các dòng vô tính được tìm thấy, mỗi bản sao riêng lẻ, trừu tượng các dòng vô tính có chung phổ biến và tham số hóa trừu tượng để cho biết mỗi cá thể bản sao có thể được bắt nguồn từ trừu tượng như thế nào.

Nó tìm thấy 10-20% bản sao trong hầu hết các hệ thống Java.

+0

Nó không phải là miễn phí, nhưng tôi sẽ cung cấp cho nó một spin dù sao. –

5

SonarQube có thể phát hiện mã trùng lặp nhưng không đưa ra đề xuất loại bỏ chúng. Nó là miễn phí và - mặc dù với thiết lập mặc định, nó chỉ có thể phát hiện các dòng vô tính giống hệt nhau - có một plugin miễn phí CodeAnalyzer for SonarQube mà bạn có thể phát hiện các dòng cấu trúc phức tạp hơn thay vì các từ vựng lexical.

Các vấn đề liên quan