Tìm mã không sử dụng [đã đóng]


208

Tôi phải cấu trúc lại một ứng dụng C # lớn và tôi đã tìm thấy rất nhiều chức năng không bao giờ được sử dụng. Làm cách nào để kiểm tra mã không sử dụng, vì vậy tôi có thể loại bỏ tất cả các chức năng không sử dụng?




Tôi ngạc nhiên khi điều này được dán nhãn là lạc đề, tôi thấy câu hỏi và câu trả lời hữu ích 11 năm sau khi câu hỏi được viết. liên kết ngoài chủ đề được cung cấp nói rằng "... các công cụ phần mềm thường được các lập trình viên sử dụng; và ..." chắc chắn có liên quan đến SO!.
Shelbypereira

Câu trả lời:


218

Vâng, ReSharper làm điều này. Nhấp chuột phải vào giải pháp của bạn và chọn "Tìm các vấn đề về mã". Một trong những kết quả là "Biểu tượng không sử dụng". Điều này sẽ cho bạn thấy các lớp, phương thức, v.v., không được sử dụng.


20
điều đó thật tuyệt. không đủ người biết về điều này. Bạn cũng phải bật Solution Wide Phân tích để hiển thị mọi thứ.
mcintyre321

16
Resharper là một công cụ tuyệt vời, nhưng tôi thấy nó không đáng tin cậy cho nhiệm vụ này. Tôi có một phương thức công khai nơi tôi đã xóa tất cả các tham chiếu. Nếu tôi nhấp chuột phải vào phương thức và chọn Show Usages, thì không có gì, nhưng các vấn đề về mã của Resharper không liệt kê nó là không sử dụng.
dùng890155

9
Chúng tôi đang sử dụng tiêm phụ thuộc. Kết quả là, mọi thứ dường như được sử dụng để chia sẻ lại bởi vì ngay cả các loại không sử dụng vẫn đang được đăng ký với sự thống nhất.
Montgomery 'monty' Jones

11
@ user890155 Điều đó có thể là do phương thức này là công khai, thư viện có thể được sử dụng bởi một ứng dụng khác không có trong giải pháp hiện tại. Tôi tin rằng nó sẽ chỉ gắn cờ các phương thức nội bộ và riêng tư là các vấn đề về mã nếu không được sử dụng.
Lukazoid

3
@elggarc Về việc tiêm phụ thuộc, hãy xem plugin Agent Mulder được đề cập ở đây: blog.jetbrains.com/dotnet/2012/08/resharper-70-plug-ins Trang chủ dự án: hmemcpy.github.com/AgentMulder Agent Mulder - hỗ trợ cho Các khuôn khổ tiêm phụ thuộc như Autofac, Castle Windsor, Unity. Vì ReSharper không biết về các thùng chứa này, các lớp thường có thể được đánh dấu là không sử dụng hoặc không được khởi tạo. Đặc vụ Mulder nói với ReSharper khi các lớp này đang được sử dụng và cung cấp điều hướng đến điểm đăng ký từ mỗi lớp.
Grzegorz Smulko

29

Đó là một câu hỏi tuyệt vời, nhưng được cảnh báo rằng bạn đang đi trong vùng nước nguy hiểm ở đây. Khi bạn xóa mã, bạn sẽ phải đảm bảo rằng bạn đang biên dịch và kiểm tra thường xuyên.

Một công cụ tuyệt vời xuất hiện trong tâm trí:

NDepend - công cụ này chỉ là tuyệt vời. Phải mất một chút thời gian để mò mẫm, và sau 10 phút đầu tiên tôi nghĩ rằng hầu hết các nhà phát triển chỉ nói "Bắt vít!" và xóa ứng dụng. Khi bạn cảm thấy tốt về NDepend, nó cung cấp cho bạn cái nhìn sâu sắc tuyệt vời về cách các ứng dụng của bạn được kết hợp. Hãy xem thử: http://www.ndepend.com/ . Quan trọng nhất, công cụ này sẽ cho phép bạn xem các phương thức không có bất kỳ người gọi trực tiếp nào. Nó cũng sẽ hiển thị cho bạn nghịch đảo, một cây gọi hoàn chỉnh cho bất kỳ phương thức nào trong cụm (hoặc thậm chí giữa các cụm).

Dù bạn chọn công cụ nào, đó không phải là một nhiệm vụ nhẹ nhàng. Đặc biệt là nếu bạn đang xử lý các phương thức công khai trên các cụm thư viện, vì bạn có thể không bao giờ biết khi nào một ứng dụng sẽ tham chiếu chúng.


4
Một lời cảnh báo khác, nếu ứng dụng của bạn là asp.net, với NDepend, bạn sẽ cần biên dịch trước trang web của mình để bạn có thể phân tích mã phía sau và NDepend không thể bao gồm / biết về các cuộc gọi từ các trang aspx (tức là các cuộc gọi phương thức trong ObjectDataSource và thích)
Jaime

16

Resharper là tốt cho điều này như những người khác đã nêu. Mặc dù vậy, hãy cẩn thận, những công cụ này không tìm thấy mã của bạn được sử dụng bởi sự phản chiếu, ví dụ như không thể biết nếu một số mã KHÔNG được sử dụng bởi sự phản chiếu.


15

Như Jeff đã chỉ ra, công cụ NDepend có thể giúp tìm các phương thức, trường và loại không sử dụng.

Để giải thích một chút, NDepend đề xuất viết Quy tắc mã trên Truy vấn LINQ (CQLinq) . Khoảng 200 quy tắc mã mặc định được đề xuất, 3 trong số đó được dành riêng để phát hiện mã không sử dụng / chết

Về cơ bản quy tắc như vậy để phát hiện phương thức không sử dụng, ví dụ như:

// <Name>Dead Methods</Name>
warnif count > 0 
from m in Application.Methods where !m.MethodsCallingMe.Any()
select m

Quy tắc NDepend để tìm các phương thức không sử dụng (phương thức chết)

Nhưng quy tắc này là ngây thơ và sẽ trả lại dương tính giả tầm thường. Có nhiều tình huống mà một phương thức không bao giờ được gọi nhưng nó không được sử dụng (điểm vào, hàm tạo lớp, bộ hoàn thiện ...) đây là lý do tại sao 3 quy tắc mặc định được xây dựng nhiều hơn:

NDepend tích hợp trong Visual Studio 2017,2015, 2013, 2012, 2010, do đó các quy tắc này có thể được kiểm tra / duyệt / chỉnh sửa ngay bên trong IDE . Công cụ này cũng có thể được tích hợp vào quy trình CI của bạn và nó có thể xây dựng các báo cáo sẽ hiển thị các quy tắc vi phạm và các thành phần mã thủ phạm. NDepend cũng có phần mở rộng VS Team Services .

Nếu bạn nhấp vào 3 liên kết ở trên về phía mã nguồn của các quy tắc này, bạn sẽ thấy rằng các liên kết liên quan đến các loại và phương thức hơi phức tạp. Điều này là do họ phát hiện không chỉ các loại và phương thức không sử dụng, mà cả các loại và phương thức chỉ được sử dụng bởi các loại và phương thức chết không sử dụng (đệ quy).

Đây là phân tích tĩnh , do đó tiền tố Có khả năng trong các tên quy tắc. Nếu một phần tử mã chỉ được sử dụng thông qua sự phản chiếu, các quy tắc này có thể coi nó là không được sử dụng mà không phải là trường hợp.

Ngoài việc sử dụng 3 quy tắc này, tôi khuyên bạn nên đo độ bao phủ mã bằng các thử nghiệm và cố gắng để có phạm vi bảo hiểm đầy đủ. Thông thường, bạn sẽ thấy mã không thể được bao phủ bởi các thử nghiệm, thực sự là mã không được sử dụng /chết có thể được loại bỏ một cách an toàn. Điều này đặc biệt hữu ích trong các thuật toán phức tạp, nơi không rõ liệu một nhánh mã có thể truy cập được hay không.

Tuyên bố miễn trừ trách nhiệm: Tôi làm việc cho NDepend.


6

Tôi cũng sẽ đề cập rằng việc sử dụng IOC aka Unity có thể khiến những đánh giá này bị sai lệch. Tôi có thể đã sai nhưng một số lớp rất quan trọng được khởi tạo thông qua Unity dường như không có khả năng khởi tạo như ReSharper có thể nói. Nếu tôi làm theo các khuyến nghị của ReSharper, tôi sẽ bị hos!


4

ReSharper thực hiện một công việc tuyệt vời là tìm mã không sử dụng.

Trong VS IDE, bạn có thể nhấp chuột phải vào định nghĩa và chọn 'Tìm tất cả các tham chiếu', mặc dù điều này chỉ hoạt động ở cấp độ giải pháp.


1

Sự thật là công cụ này không bao giờ có thể cho bạn câu trả lời chắc chắn 100%, nhưng công cụ bảo hiểm có thể mang lại cho bạn một khoản tiền khá tốt.

Nếu bạn tính với bộ kiểm thử đơn vị toàn diện, bạn có thể sử dụng công cụ bao phủ kiểm tra để xem chính xác những dòng mã nào không được thực thi trong quá trình chạy thử. Bạn vẫn sẽ cần phân tích mã theo cách thủ công: loại bỏ những gì bạn cho là mã chết hoặc viết thử để cải thiện phạm vi kiểm tra.

Một công cụ như vậy là NCover , với tiền thân nguồn mở trên Sourceforge . Một cách khác là PartCover .

Kiểm tra câu trả lời này trên stackoverflow.


1

Tôi đã đi qua AXTools CODESMART..Hãy thử một lần. Sử dụng trình phân tích mã trong phần đánh giá. Nó sẽ liệt kê các chức năng cục bộ và toàn cầu đã chết cùng với các vấn đề khác.


0

FXCop là một công cụ phân tích mã ... Nó làm được nhiều hơn là tìm mã không sử dụng. Tôi đã sử dụng FXCop trong một thời gian và bị mất các khuyến nghị nên đã gỡ cài đặt nó.

Tôi nghĩ rằng NDepend trông giống như một ứng cử viên có khả năng hơn.

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.