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 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?
Câu trả lời:
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.
Đó 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.
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
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 / mã 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.
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!
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.
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.
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.