Mã bảo hiểm nêu bật các phương pháp không sử dụng - tôi nên làm gì?


59

Tôi đã được giao nhiệm vụ tăng độ bao phủ mã của một dự án Java hiện có.

Tôi nhận thấy rằng công cụ bao phủ mã ( EclEmma ) đã làm nổi bật một số phương thức không bao giờ được gọi từ bất cứ đâu.

Phản ứng ban đầu của tôi không phải là viết các bài kiểm tra đơn vị cho các phương thức này, mà là làm nổi bật chúng cho quản lý / nhóm quản lý trực tuyến của tôi và hỏi tại sao các chức năng này lại bắt đầu.

Cách tiếp cận tốt nhất sẽ là gì? Viết bài kiểm tra đơn vị cho họ, hoặc đặt câu hỏi tại sao họ ở đó?


1
Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
maple_shaft

Câu trả lời:


119
  1. Xóa bỏ.
  2. Cam kết.
  3. Quên.

Cơ sở lý luận:

  1. Mã chết là chết. Bằng chính mô tả của nó, nó không có mục đích. Nó có thể đã có một mục đích tại một thời điểm, nhưng điều đó đã biến mất, và vì vậy mã sẽ bị biến mất.
  2. Kiểm soát phiên bản đảm bảo rằng trong sự kiện duy nhất hiếm có (theo kinh nghiệm của tôi) mà ai đó đến sau để tìm mã đó, nó có thể được truy xuất.
  3. Là một tác dụng phụ, bạn ngay lập tức cải thiện phạm vi bảo hiểm mã mà không làm gì cả (trừ khi mã chết được kiểm tra, điều này hiếm khi xảy ra).

Hãy cẩn thận từ các bình luận: Câu trả lời ban đầu cho rằng bạn đã xác minh kỹ lưỡng rằng mã này, vượt quá nghi ngờ, đã chết. Các IDE có thể đọc được và có một số cách mà mã trông có vẻ thực sự có thể được gọi. Mang theo một chuyên gia trừ khi bạn hoàn toàn chắc chắn.


118
Nói chung tôi sẽ đồng ý với phương pháp này, nhưng nếu bạn chưa quen với một dự án và / hoặc một nhà phát triển cơ sở, tốt hơn hãy hỏi người cố vấn / cấp trên của bạn trước khi xóa. Tùy thuộc vào dự án, một số phương thức có thể không được sử dụng nhưng được gọi / sử dụng bởi mã bên ngoài không nằm trong mã dự án mà bạn có quyền truy cập. Nó có thể là mã được tạo tự động để việc xóa của bạn sẽ không đạt được gì ngoài tiếng ồn lịch sử nhật ký. IDE của bạn có thể không thể tìm thấy quyền truy cập dựa trên phản ánh từ bên trong dự án. V.v. Nếu bạn không chắc chắn về các trường hợp góc như vậy ít nhất hãy hỏi một lần.
Frank Hopkins

11
Mặc dù tôi đồng ý với cốt lõi của câu trả lời này, nhưng câu hỏi theo nghĩa đen là "tôi có nên hỏi tại sao chúng ở đó không?" . Câu trả lời này có thể mang lại ấn tượng OP không nên hỏi đội của họ trước khi xóa.
Doc Brown

58
Trước tiên tôi muốn thêm một bước - kiểm tra nhật ký đổ lỗi cho các dòng mã không sử dụng. Nếu bạn có thể tìm thấy người đã viết chúng, bạn có thể hỏi họ đang làm gì. Nếu các dòng này là mới thì rất có thể ai đó đang có kế hoạch sử dụng chúng sớm (trong trường hợp đó có lẽ chúng nên được kiểm tra đơn vị ngay bây giờ).
bdsl

10
Có rất nhiều điều sai với câu trả lời này, như thể hiện trong các bình luận hoặc câu trả lời khác, mà tôi không thể tin rằng đây là câu trả lời được bình chọn và chấp nhận hàng đầu.
user949300

11
@Emory Cách tốt nhất để bắt đầu trong một nhóm mới là phá vỡ công trình bằng cách vô tư xóa mọi thứ vì bạn nghĩ không ai cần chúng. Đảm bảo rằng bạn đang phổ biến từ ngày 1. Chắc chắn nó có thể không cần thiết (vì mỗi lớn ứng dụng, cũ luôn có 100% mã vùng phủ sóng ho ), nhưng đó là một ROI rất xấu.
Voo

55

Tất cả các câu trả lời khác đều dựa trên giả định rằng các phương pháp trong câu hỏi thực sự không được sử dụng. Tuy nhiên, câu hỏi không chỉ rõ liệu dự án này là độc lập hay một thư viện nào đó.

Nếu dự án đang nói đến là một thư viện, các phương thức dường như không được sử dụng có thể được sử dụng bên ngoài dự án và loại bỏ chúng sẽ phá vỡ các dự án khác. Nếu chính thư viện được bán cho khách hàng hoặc được cung cấp công khai, thậm chí có thể không thể theo dõi việc sử dụng các phương pháp này.

Trong trường hợp này, có bốn khả năng:

  • Nếu các phương thức là riêng tư hoặc gói riêng tư, chúng có thể được gỡ bỏ một cách an toàn.
  • Nếu các phương thức là công khai, sự hiện diện của chúng có thể được biện minh ngay cả khi không sử dụng thực tế, để hoàn thiện tính năng. Họ nên được kiểm tra mặc dù.
  • Nếu các phương thức là công khai và không cần thiết, loại bỏ chúng sẽ là một thay đổi đột phá và nếu thư viện tuân theo phiên bản ngữ nghĩa , điều này chỉ được phép trong một phiên bản chính mới.
  • Ngoài ra, các phương thức công khai cũng có thể được phản đối và loại bỏ sau đó. Điều này mang lại một chút thời gian cho người tiêu dùng API chuyển đổi từ các chức năng không dùng nữa trước khi chúng bị xóa trong phiên bản chính tiếp theo.

9
Ngoài ra, nếu đó là một thư viện, các chức năng sẽ có để hoàn thành
PlasmaHH

Bạn có thể giải thích làm thế nào họ nên được thử nghiệm? Nếu bạn không biết tại sao phương pháp lại ở đó, có lẽ bạn không biết nó phải làm gì.
TKK

Các tên phương thức như filter_name_exists, ReloadSettingshoặc addToSchema(được chọn ngẫu nhiên từ 3 dự án nguồn mở tùy ý) sẽ cung cấp một vài gợi ý cho những gì phương thức được cho là nó làm. Một bình luận javadoc có thể hữu ích hơn nữa. Không phải là một đặc điểm kỹ thuật phù hợp, tôi biết, nhưng có thể đủ để tạo ra một vài thử nghiệm có thể ngăn chặn hồi quy ít nhất.
Zoltan

1
phương thức công khai trên một lớp riêng hoặc giao diện không nên được coi là công khai cho mục đích này. tương tự nếu một lớp công khai được lồng trong một lớp riêng, nó không thực sự công khai.
emory

31

Trước tiên hãy kiểm tra xem công cụ bảo hiểm mã của bạn có đúng không.

Tôi đã gặp tình huống họ không chọn các phương thức được gọi thông qua các tham chiếu đến giao diện hoặc nếu lớp được tải động ở đâu đó.


Cảm ơn sẽ làm. Trên Eclipse, tôi thực hiện tìm kiếm trên cơ sở mã cho hàm và không có gì xuất hiện. Nếu bạn có bất kỳ đề xuất nào khác về cách thực hiện tìm kiếm toàn diện hơn, tôi sẽ rất biết ơn.
Lucas T

3
có, bạn nên kiểm tra các dự án khác có thể nhập lớp dưới dạng dll
Ewan

7
Câu trả lời này cảm thấy không đầy đủ. "Trước tiên hãy kiểm tra xem công cụ bảo hiểm mã của bạn có đúng không. Nếu đúng, thì .... [chèn phần còn lại của câu trả lời] ". Cụ thể, OP muốn biết phải làm gì nếu công cụ bao trùm mã là chính xác.
Jon Bentley

1
@jonbentley OP đang yêu cầu cách tiếp cận tốt nhất cho báo cáo công cụ. "Kiểm tra thủ công" vì nó khá rõ ràng từ ngữ cảnh không chính xác
Ewan

15

Vì Java được biên dịch tĩnh, nên việc gỡ bỏ các phương thức sẽ khá an toàn. Loại bỏ mã chết luôn luôn tốt. Có một số khả năng rằng có một số hệ thống phản chiếu điên rồ chạy chúng trong thời gian chạy, vì vậy hãy kiểm tra trước với các nhà phát triển khác, nhưng nếu không thì hãy loại bỏ chúng.


9
+1 để kiểm tra với mọi người, đó là loại tuân theo nguyên tắc ít bất ngờ nhất. Bạn không muốn ai đó dành quá nhiều thời gian để tìm kiếm phương pháp chỉ còn lại ở đó một vài cam kết trước đó. Ngoài ra, trong một số trường hợp, mã chết có thể là nội dung mới đã được kiểm tra nhưng chưa được kết nối ở bất kỳ đâu (mặc dù trong trường hợp này, tài liệu này phải được ghi lại rõ ràng bằng các nhận xét và được kiểm tra).
Frax

4
Chà, trừ khi mã sử dụng sự phản chiếu để gọi các phương thức "không sử dụng", nhưng trong trường hợp đó, bạn có vấn đề lớn hơn nhiều và chúng tôi mong muốn được xem mã tại thefailywft.com (Thực hiện kiểm tra nhanh để xem có mã nào có ClassName không. lớp học).
MTilsted

2
Nó được biên dịch tĩnh, nhưng cũng có invokedynamichướng dẫn, vì vậy, bạn biết đấy ...
corsiKa

@MTilsted: Có nhiều khung sẽ gọi mã bằng cách sử dụng chuỗi - Tôi có thể nghĩ về ít nhất là Spring và Hibernate ngoài đỉnh đầu của tôi.
jhominal

9

Cách tiếp cận tốt nhất sẽ là gì? Viết bài kiểm tra đơn vị cho họ, hoặc đặt câu hỏi tại sao họ ở đó?

Xóa mã là một điều tốt.

Khi bạn không thể xóa mã, bạn chắc chắn có thể đánh dấu nó là @Deprecated , ghi lại bản phát hành chính nào bạn đang nhắm mục tiêu để xóa phương thức. Sau đó, bạn có thể xóa nó "sau". Trong lúc này, rõ ràng là không có mã mới nào được thêm vào mà phụ thuộc vào nó.

Tôi sẽ không khuyên bạn nên đầu tư vào các phương pháp không dùng nữa - vì vậy không có thử nghiệm đơn vị mới nào chỉ để đạt các mục tiêu bảo hiểm.

Sự khác biệt giữa hai chủ yếu là liệu các phương thức có phải là một phần của giao diện được xuất bản hay không . Việc tự ý xóa các phần của giao diện được xuất bản có thể gây ngạc nhiên khó chịu cho người tiêu dùng phụ thuộc vào giao diện.

Tôi không thể nói chuyện với EclEmma, ​​nhưng từ kinh nghiệm của tôi, một trong những điều bạn cần cẩn thận là sự phản ánh. Ví dụ, nếu bạn sử dụng các tệp cấu hình văn bản để chọn lớp / phương thức nào sẽ truy cập, thì sự khác biệt được sử dụng / không sử dụng có thể không rõ ràng (Tôi đã bị đốt cháy bởi thời gian được ghép nối đó).

Nếu dự án của bạn là một chiếc lá trong biểu đồ phụ thuộc, thì trường hợp khấu hao sẽ bị suy yếu. Nếu dự án của bạn là một thư viện, thì trường hợp khấu hao sẽ mạnh hơn.

Nếu công ty của bạn sử dụng một repo đơn , thì xóa có rủi ro thấp hơn trong trường hợp đa repo.

Như đã lưu ý bởi l0b0 , nếu các phương thức đã có sẵn trong kiểm soát nguồn, phục hồi chúng sau khi xóa là một bài tập thẳng về phía trước. Nếu bạn thực sự lo lắng về việc cần phải làm điều đó, hãy suy nghĩ về cách tổ chức các cam kết của bạn để bạn có thể khôi phục các thay đổi đã xóa nếu bạn cần chúng.

Nếu độ không chắc chắn đủ cao, bạn có thể xem xét nhận xét mã , thay vì xóa nó. Đó là công việc bổ sung trong đường dẫn hạnh phúc (nơi mã bị xóa không bao giờ được khôi phục), nhưng nó giúp khôi phục dễ dàng hơn. Tôi đoán là bạn nên thích xóa thẳng cho đến khi bạn bị đốt cháy bởi điều đó một vài lần, điều này sẽ cung cấp cho bạn một số hiểu biết về cách đánh giá "sự không chắc chắn" trong bối cảnh này.

câu hỏi tại sao họ ở đó?

Thời gian đầu tư để nắm bắt truyền thuyết không nhất thiết là lãng phí. Tôi đã được biết là thực hiện xóa theo hai bước - trước tiên, bằng cách thêm và cam kết nhận xét giải thích những gì chúng ta đã học về mã, sau đó xóa mã (và nhận xét).

Bạn cũng có thể sử dụng một cái gì đó tương tự như hồ sơ quyết định kiến ​​trúc như một cách để nắm bắt truyền thuyết với mã nguồn.


9

Một công cụ bao phủ mã không phải là tất cả hiểu biết, nhìn thấy tất cả. Chỉ vì công cụ của bạn tuyên bố rằng phương thức này không được gọi, điều đó không có nghĩa là nó không được gọi. Có sự phản ánh, và tùy thuộc vào ngôn ngữ, có thể có những cách khác để gọi phương thức. Trong C hoặc C ++, có thể có các macro xây dựng tên hàm hoặc phương thức và công cụ có thể không thấy cuộc gọi. Vì vậy, bước đầu tiên sẽ là: Thực hiện tìm kiếm văn bản cho tên phương thức và các tên liên quan. Hỏi đồng nghiệp có kinh nghiệm. Bạn có thể tìm thấy nó thực sự được sử dụng.

Nếu bạn không chắc chắn, hãy đặt một khẳng định () vào đầu mỗi phương thức "không sử dụng". Có lẽ nó được gọi. Hoặc một tuyên bố đăng nhập.

Có lẽ mã thực sự có giá trị. Nó có thể là mã mới mà một đồng nghiệp đã làm việc trong hai tuần, và anh ấy hoặc cô ấy sẽ bật vào ngày mai. Nó không được gọi hôm nay vì cuộc gọi đến nó sẽ được thêm vào ngày mai.

Có lẽ mã thực sự có giá trị phần 2: Mã có thể đang thực hiện một số thử nghiệm thời gian chạy rất tốn kém có thể tìm thấy những thứ không ổn. Mã chỉ được bật nếu mọi thứ thực sự đi sai. Bạn có thể đang xóa một công cụ sửa lỗi có giá trị.

Thật thú vị, lời khuyên tồi tệ nhất có thể "Xóa. Cam kết. Quên." được đánh giá cao nhất. (Đánh giá mã? Bạn không thực hiện đánh giá mã? Bạn đang làm gì để lập trình nếu bạn không thực hiện đánh giá mã?)


Tôi tôn trọng không đồng ý về "XÓA. CAM KẾT. GIỚI THIỆU" là lời khuyên tồi tệ nhất. (Tôi nghĩ nó là tốt nhất.). Cách tiếp cận của bạn cũng OK. Tôi nghĩ lời khuyên tồi tệ nhất có thể là viết các bài kiểm tra đơn vị thực hiện "mã chết" nhưng không đưa ra khẳng định nào. Công cụ bảo hiểm mã sẽ bị lừa nghĩ rằng chúng được sử dụng.
emory

3
Không có gì trong câu trả lời "Xóa. Cam kết. Quên" nói không làm mã đánh giá. IMHO hoàn toàn có thể (và được khuyến nghị, IMHO) để xem lại mã sau khi được cam kết (nhưng trước khi triển khai :-)).
sleske

@sleske Làm thế nào để bạn xem lại mã không còn nữa? Câu trả lời đó cũng không đề cập đến "đánh giá".
user949300

@ user949300: Việc thay đổi mã có cần xem xét hay không là một câu hỏi riêng biệt và không phụ thuộc vào việc mã được thêm, thay đổi hay xóa (thêm mã có thể còn tai hại hơn là xóa nó, xem ví dụ về lỗ hổng Heartbleed). Thêm vào đó, câu trả lời (bây giờ) nói là "mang lại một chuyên gia", nghe có vẻ khá gần với đánh giá mã.
sleske

1
@ user949300: Về "Làm thế nào để bạn xem lại mã không còn nữa" - Tôi hy vọng điều đó là hiển nhiên: Bằng cách xem xét sự thay đổi trong công cụ kiểm soát phiên bản của bạn. Làm thế nào khác bạn sẽ xem xét các thay đổi (bất kỳ thay đổi)?
sleske

6

Tùy thuộc vào môi trường mà phần mềm chạy vào, bạn có thể đăng nhập nếu phương thức được gọi. Nếu nó không được gọi trong một khoảng thời gian thích hợp, thì phương pháp có thể được gỡ bỏ một cách an toàn.

Đây là một cách tiếp cận thận trọng hơn là chỉ xóa phương thức và có thể hữu ích nếu bạn đang chạy trong môi trường rất nhạy cảm với lỗi.

Chúng tôi đăng nhập vào một #unreachable-codekênh chùng chuyên dụng với một mã định danh duy nhất cho mỗi ứng cử viên để loại bỏ và nó được chứng minh là khá hiệu quả.



sau đó "một khoảng thời gian thích hợp" dài hơn (mặc dù tôi thích một "người đàn ông sau nửa đêm")
Jamie Bull
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.