Ý tưởng tốt để đặt số lỗi trong một nhận xét vào đầu tệp nguồn? [đóng cửa]


40

Có phải là một thực hành tốt để đặt số lỗi trong chính tệp trong một nhận xét tiêu đề?

Các ý kiến ​​sẽ trông giống như thế này:

 MODIFIED    (MM/DD/YY)
 abc 01/21/14 - Bug 17452317 - npe in drill across in dashboard edit mode

 cde 01/17/14 - Bug 2314558  - some other error description

Nó có vẻ hữu ích, nhưng nó được coi là thực hành xấu?


23
Câu hỏi tôi đặt ra là "Bạn có thể làm gì với số lỗi được nhúng mà bạn chưa thể làm với cơ sở dữ liệu lỗi của mình?" Tôi không thể nghĩ về bất kỳ trường hợp sử dụng thực tế.
M. Dudley


6
@JensG Đó là lý do bạn đặt nó trong cam kết thông báo, và logtrên các tập tin sẽ cung cấp cho bạn khá nhiều điều tương tự chính xác, nhưng mà không làm lộn xộn lên các tập tin ...
Izkata

1
@JensG Và khi bạn đã sửa điểm hoặc hàng trăm lỗi trên một tệp cụ thể? Câu trả lời rõ ràng là bạn định kỳ xóa ID cũ, nhưng sau đó bạn quay lại để ghi nhật ký VC ...
dmckee

3
Câu hỏi này là chủ đề của bài viết Ars Technica Chúng ta có nên liệt kê các lỗi trong tiêu đề của tệp nguồn không? (xuất bản 15 ngày sau khi câu hỏi này được đăng).
Peter Mortensen

Câu trả lời:


107

Tôi đã thấy điều này được thực hiện trước đây, cả bằng tay bởi các tác giả và tự động bởi các tập lệnh và trình kích hoạt được tích hợp với các hệ thống kiểm soát phiên bản để thêm tác giả, nhận xét đăng ký và thông tin ngày vào tệp.

Tôi nghĩ cả hai phương pháp đều khá khủng khiếp vì hai lý do chính. Đầu tiên, nó thêm sự lộn xộn và tiếng ồn cho tập tin, đặc biệt là khi những bình luận này già đi và trở nên không liên quan đến trạng thái hiện tại của tập tin. Thứ hai, đó là thông tin trùng lặp với những gì đã được duy trì trong hệ thống kiểm soát phiên bản và nếu bạn đang sử dụng hệ thống kiểm soát phiên bản hiện đại hỗ trợ các bộ thay đổi thì thực sự sẽ mất thông tin về các thay đổi.

Nếu bất cứ điều gì, hãy xem xét tích hợp với hệ thống theo dõi lỗi của bạn. Một số công cụ cho phép bạn liên kết một khiếm khuyết hoặc số ID nhiệm vụ trong nhận xét đăng ký với một mục trong công cụ theo dõi. Nếu bạn có tất cả các khiếm khuyết, yêu cầu nâng cao và các tác vụ công việc trong công cụ, bạn có thể cung cấp liên kết theo cách đó. Tất nhiên, điều này đi kèm với nhược điểm của sự phụ thuộc vào các công cụ đó cho dự án.


2
"và nếu bạn đang sử dụng một hệ thống kiểm soát phiên bản hiện đại hỗ trợ các bộ thay đổi, thì thực sự nó sẽ mất thông tin về các thay đổi." - bạn có thể giải thích rõ hơn không?
Geek

10
@Geek Tôi không biết phải giải thích gì. Nếu bạn xem một tệp tham chiếu số ID lỗi, bạn sẽ không thấy các tệp khác thay đổi do lỗi tương tự trừ khi bạn tìm kiếm các tệp. Đó là những gì một bộ thay đổi là - một tập hợp các tệp được kiểm tra cùng nhau.
Thomas Owens

9
Tôi cũng sẽ nói thêm rằng nếu bạn chuyển sang một hệ thống theo dõi lỗi mới thì tất cả những con số đó sẽ trở nên vô giá trị ngay lập tức. Tôi đã gặp phải công việc hiện tại nơi một số ý kiến ​​có số từ phần mềm theo dõi lỗi đã được sử dụng trong 10 năm.
17 của ngày 26

2
Vì vậy, sau khi thay đổi hệ thống theo dõi lỗi mới, chúng trở nên hữu ích như thể chúng chưa bao giờ ở đó. Nhưng giả sử họ đã cung cấp một số giá trị tại một số điểm và không cung cấp giá trị âm ngay bây giờ, tại sao không làm điều đó?
Cruncher

@ 17of26 - Tôi tưởng tượng bạn có thể liên kết các lỗi / vấn đề cũ với các lỗi mới, nếu không có cơ chế nào khác ngoài nhận xét như "lỗi theo dõi vấn đề cũ 1234".
Kenny Evitt

42

Có chính xác một trường hợp tôi sẽ làm điều này, cụ thể như là một phần cảnh báo cho các lập trình viên tương lai: "Đừng gọi chức năng foo()trực tiếp ở đây; điều này đã gây ra lỗi # 1234, cụ thể là ...", và sau đó mô tả ngắn về lỗi sau.

Và nếu mã đã thay đổi theo cách không có sự cám dỗ để gọi foo()trực tiếp, hãy xóa nhận xét đó. Nó sẽ chỉ gây khó chịu và làm nổ tung mã.


19
Có thể tôi là một người khó tính, nhưng nếu foo()không được gọi trực tiếp, thì mã nên được cấu trúc theo cách mà nó không thể.
MetaFight

20
Ồ, tôi đã cố gắng viết một cái gì đó làm ví dụ, để làm cho văn bản cụ thể hơn - đừng lấy tôi quá theo nghĩa đen. Trường hợp tốt hơn sẽ là trường hợp bạn sử dụng thư viện bên ngoài và chức năng bạn thường sử dụng cho mục đích cụ thể có lỗi. Sau đó, một bình luận "Đừng gọi foo()đây" sẽ hợp lý.
rem

16

Đó là một thực tế khủng khiếp. Nó thêm nỗ lực để đạt được một hiệu ứng là sao chép thuần túy; nói cách khác, điều duy nhất mà nó thêm vào chỉ bằng cách sử dụng nhật ký cam kết là khả năng tạo ra sự không nhất quán. Các tệp nguồn của bạn trở nên lộn xộn với số lượng không giới hạn mà bạn không bao giờ nhìn vào.

Ưu điểm duy nhất tôi có thể nhận thấy ở tất cả là bạn có thể xây dựng lại lịch sử nguồn mà không cần truy cập vào kiểm soát phiên bản, ví dụ như khi nghiên cứu bản in. Nhưng rất ít người có đủ năng lực để tuân theo sự phức tạp của phát triển phần mềm, trong khi đồng thời không thể hiểu kiểm soát phiên bản.


Có bao nhiêu lỗi chính xác mà bạn nghĩ là có thể có trong một tệp và nếu có nhiều lỗi thì có lẽ đã đến lúc viết lại.
Andy

11

Không.

Đó là những gì mọi người đã làm trước khi họ sử dụng một hệ thống kiểm soát phiên bản (tức là khi mã nguồn chỉ là bản sao lưu trong zipfiles).


2
đó là một hệ thống kiểm soát phiên bản (và một hệ thống mà tôi đã thấy được sử dụng hoạt động trong các nhà phần mềm cách đây không lâu như năm 2006, và không còn nghi ngờ gì nữa về việc sử dụng ở đâu đó ngày nay).
jwenting

1
@jwenting Tôi đã thấy những câu hỏi trên chính trang này từ những người không may hiện đang làm việc trong các cửa hàng nơi đó là thông lệ hiện tại :-(
Carson63000

Chúng tôi sử dụng một hệ thống kiểm soát nguồn tuyệt vời. Không ai ngoài tôi đưa ý kiến ​​khi kiểm tra mã. <nhún> Tôi nhận xét một số điều nhất định (như PLQuery không luôn được SCM theo dõi). Tôi nhận xét mã của mình để giải thích, nhưng không bao giờ buộc nó trở lại các lỗi cụ thể, nhưng tôi luôn tham chiếu các lỗi trong SCM cam kết nhận xét khi tôi đăng ký. Hy vọng cuối cùng sẽ có người đánh giá cao nó.
Pedantic

11

Đó là, IMHO, một ý tưởng rất tồi. Sau khi sửa đổi số 100, bạn sẽ có 90% ý kiến ​​và 10% mã. Tôi sẽ không coi đó là sạch sẽ và có thể đọc được.

Điểm duy nhất trong điều này tôi thấy là khi bạn phải trao đổi mã giữa các SCC và vì lý do nào đó, bạn không thể chuyển lịch sử giữa hai hệ thống (nhưng ngay cả khi bạn lưu các nhận xét lịch sử theo cách đó, bạn sẽ mất lịch sử tìm khác biệt tốt, vì vậy lưu các ý kiến ​​sẽ chỉ giúp bạn một chút).


8

Tôi thấy rằng mọi người đều phản đối ý tưởng này và đưa ra một lý do lịch sử (thời đại kiểm soát nguồn trước) về lý do tại sao mọi người thực hiện nó.

Tuy nhiên, trong công ty hiện tại của tôi, các nhà phát triển cơ sở dữ liệu đang theo thông lệ này và họ cũng gắn thẻ số lỗi xung quanh đoạn mã. Đôi khi tôi thấy điều này hữu ích khi bạn thấy một lỗi trong mã và bạn có thể tìm thấy ngay bản sửa lỗi đã giới thiệu vấn đề này. Nếu chúng ta không có thông tin đó trong gói cơ sở dữ liệu của mình thì chắc chắn sẽ không dễ dàng tìm ra nguyên nhân gốc của việc thực hiện đó.

Vâng, nó làm xáo trộn mã, nhưng nó giúp tìm ra lý do tại sao đoạn mã đó ở đó.


3
Chắc chắn rồi. Đôi khi tôi có cảm giác nhẹ, rằng các lập trình viên kinh hoàng vì sự dư thừa, vì vậy họ tránh có cùng thông tin có thể truy cập thông qua các cách khác nhau. Điều đó rất thú vị, bởi vì các lập trình viên thường kinh hoàng vì hiệu suất kém và do đó sử dụng bộ nhớ cache trong chương trình của họ. Nhưng số lỗi bộ nhớ đệm trong mã bên cạnh nơi chúng hữu ích nhất được coi là xấu? Mmmh.
JensG

Thường có một cách khác để có được thông tin đó (trong dự án tôi đang thực hiện, đó sẽ là right click > Team > Show Annotationssự đổ lỗi cho tập tin hiện tại), nhưng sự khác biệt là, với các bình luận có thể khám phá - họ có thể nhảy ra khỏi bạn - và với các chú thích, bạn phải có ý định quyết định đi tìm chúng.
David Conrad

Suy nghĩ, quyết định, nhấp, nhấp, nhấp, cuộn. Đó là lý do tại sao tôi nói "bộ nhớ đệm trong mã". Nếu nó ở đó, tôi chỉ thấy nó.
JensG

2
@JensG Quan điểm thú vị. Bộ nhớ cache có thể cải thiện hiệu suất nhưng chúng cũng có chi phí mang theo. Nếu bộ đệm phải được lấp đầy, cập nhật, không hợp lệ, bị xóa và v.v.
Jeffrey Hantin

7

Một trong những điểm trong bài kiểm tra Joel

Bạn có một cơ sở dữ liệu lỗi?

Thông tin như vậy có thể được lưu trong cơ sở dữ liệu lỗi nếu bạn cho rằng chúng quan trọng, nhưng chúng chỉ gây nhiễu trong các bình luận.


1
Xem ví dụ trong câu hỏi - các ý kiến ​​sẽ tham chiếu cơ sở dữ liệu lỗi ...
Izkata

@Izkata Nhưng đó là điểm chính. Cơ sở dữ liệu có thể có một trường "bình luận" với bình luận. Câu hỏi không phải là về việc có một cơ sở dữ liệu lỗi hay không, mà là về việc giữ nó trong tệp nguồn có phải là một ý tưởng tốt hay không. Tôi nghĩ, ngay cả khi chúng là bình luận, chúng vẫn nên được giữ trong cơ sở dữ liệu vì đó là những gì nó dùng.
Pierre Arlaud

6

Tôi nghĩ rằng bạn có hai vấn đề ở đây. Đầu tiên, tại sao bạn hoàn toàn nên dựa vào diff khi hầu hết các hệ thống cho phép bạn nhập bình luận sửa đổi? Giống như nhận xét mã tốt, bạn khám phá lý do tại sao thay đổi được thực hiện và không chỉ là thay đổi.

Thứ hai, nếu bạn có khả năng này, hãy biến nó thành một thông lệ tốt để đặt tất cả chúng vào cùng một vị trí. Không cần phải xem qua các tập tin để đánh dấu các dòng mã không còn cần thiết. Nhận xét bên trong mã làm việc là có để cho bạn biết lý do tại sao nó được mã hóa theo cách này.

Một khi bạn áp dụng điều này vào thực tế, các thói quen được hình thành làm cho cơ sở mã dễ dàng hoạt động hơn đối với mọi người.

Lỗi liên quan và theo dõi tính năng cùng với lý do tại sao bạn thay đổi tệp này, có thể cho bạn ý tưởng về mức độ bạn cần tìm hiểu sâu về lịch sử và có thể nhìn vào các khác biệt. Tôi đã có một yêu cầu "Thay đổi lại công thức ban đầu." Tôi biết ngay nơi sẽ đi trong lịch sử sửa đổi và chỉ xem xét một hoặc hai khác biệt.

Cá nhân, mã nhận xét trông giống như một công việc đang tiến hành cho một vấn đề đang được giải quyết bằng thử nghiệm và lỗi. Lấy mớ hỗn độn này ra khỏi mã sản xuất. Có thể dễ dàng trượt các dòng mã vào và ra chỉ làm cho nó dễ bị nhầm lẫn hơn.


2

Nếu bạn không có VCS với thông báo cam kết và không có hệ thống theo dõi lỗi với tùy chọn để bạn để lại nhận xét, thì đó là một tùy chọn chứ không phải tùy chọn tối ưu để theo dõi các thay đổi.
Tốt hơn là có một bảng tính với thông tin đó hoặc nếu bạn đang ở trong một môi trường không có "sự xa xỉ" như vậy, một tệp văn bản nằm ở đâu đó gần nguồn của bạn.
Nhưng tôi thực sự khuyên bạn nên ở trong một môi trường như vậy để bắt đầu xây dựng một trường hợp hướng tới đầu tư vào hệ thống theo dõi lỗi và VCS :)


2

Hãy ghi nhớ điều này - mã thường dài hơn các công cụ hỗ trợ nó. Nói cách khác, trình theo dõi vấn đề, kiểm soát phiên bản và tất cả các tập lệnh khác sẽ phát triển trong quá trình phát triển. Thông tin bị mất.

Mặc dù tôi đồng ý, sự lộn xộn của tệp rất khó chịu, mở tệp và hiểu lịch sử của nó mà không cần sử dụng các công cụ, luôn rất hữu ích - đặc biệt là nếu tôi đang duy trì mã.

Cá nhân, tôi nghĩ rằng có chỗ cho cả các công cụ và nhật ký mã.


2

Tôi biết Git không làm điều này và câu trả lời đơn giản là "tại sao trên trái đất sẽ cho nó đi không?"

Đó là một thiết kế ít mô-đun nói chung. Theo giải pháp này, bây giờ các tệp là một số kết hợp giữa nội dung và siêu dữ liệu. Amazon S3 là một ví dụ khác về dịch vụ lưu trữ các tệp không thêm vấn đề trước YAML hoặc tương tự vào các tệp.

Bất kỳ người tiêu dùng nào của tệp đều được yêu cầu xử lý tệp đó thông qua hệ thống kiểm soát phiên bản trước. Đây là khớp nối chặt chẽ, ví dụ IDE yêu thích của bạn sẽ bị hỏng nếu nó không hỗ trợ VCS của bạn.


2

Không, nó không phải là một thực hành tốt để theo dõi sửa lỗi của bạn như nhận xét trong mã. Điều này chỉ tạo ra sự lộn xộn.

Tôi cũng sẽ nói tương tự cho thông điệp bản quyền mà bạn đề cập. Nếu không có ai bên ngoài công ty của bạn sẽ thấy mã này, không có lý do gì để đưa vào thông báo bản quyền.

Nếu bạn đang sử dụng phần mềm theo dõi phiên bản ( Git , SVN , v.v.), thì bạn nên đưa các ghi chú đó vào tin nhắn cam kết của mình. Không ai muốn tìm hiểu các tiêu đề của mỗi tệp mã để tạo ghi chú phát hành hoặc xem tổng quan về những thay đổi đã được thực hiện. Tất cả các nhật ký thay đổi này phải được lưu trữ cùng nhau, trong lịch sử theo dõi phiên bản, theo dõi lỗi của bạn hoặc cả hai.

Nếu bạn đang tìm kiếm một bài đọc tốt về chủ đề này, tôi khuyên bạn nên sử dụng chương bốn của Clean Code .


Thông báo bản quyền cũng có (hơi thừa) đưa nhân viên thông báo rằng tập tin thuộc về nhà tuyển dụng. Và có lẽ không khuyến khích chia sẻ bất hợp pháp (thậm chí bởi nhân viên), xét xử của bao nhiêu người dường như nghĩ về bản quyền mà chỉ áp dụng nếu có một thông báo.
Bernd Jendrissek

1

Tôi nghĩ rằng có những yếu tố khác cho cuộc thảo luận này thường bị lãng quên nhưng là những trường hợp mà một số nhận xét sửa đổi được gửi đến một nhóm.

Khi làm việc trong môi trường nhóm với cơ sở mã được chia sẻ và trong đó một số thành viên trong nhóm có khả năng làm việc trong cùng một lĩnh vực mã, đặt một nhận xét sửa đổi ngắn trong phạm vi (phương thức hoặc lớp) chính xác cho thấy một thay đổi có thể rất hữu ích cho nhanh chóng giải quyết xung đột hợp nhất hoặc checkin.

Tương tự như vậy, khi làm việc trong môi trường có nhiều nhánh (tính năng) tham gia, giúp người thứ ba (chủ xây dựng) dễ dàng hơn trong việc xác định những việc cần làm để giải quyết xung đột tiềm ẩn.

Bất cứ khi nào bạn phải rời khỏi IDE và hỏi ai đó tại sao họ thay đổi điều gì đó, điều đó sẽ làm gián đoạn năng suất của cả hai thành viên trong nhóm. Một ghi chú nhanh trong phạm vi chính xác có thể giúp giảm bớt hoặc loại bỏ hầu hết sự gián đoạn này.


3
câu hỏi là về nhận xét ở phần đầu của tệp nguồn, ngay sau thông báo bản quyền - điều này không liên quan gì đến các bình luận trong phạm vi hẹp hơn
gnat

Tất cả các câu trả lời ở đây đang nói về điều đó, mặc dù. Nếu tôi thực hiện các thay đổi quan trọng đối với toàn bộ tệp lớp (reorg hoặc định dạng sửa lỗi), tôi sẽ không nhận xét tệp lớp là phạm vi?
StingyJack

0

Bất kỳ thông tin lỗi nào liên quan trực tiếp đến một đoạn mã, sẽ trở nên không liên quan khi tính toàn vẹn của toàn bộ thay đổi được sửa đổi bằng cách sửa liên tiếp.

Nó được sử dụng phổ biến để thêm thông tin trong tóm tắt chức năng khi chúng ta phải dựa vào các công cụ bên ngoài (giả sử javadocs) để tạo ghi chú phát hành từ mã. Nó chủ yếu là vô dụng hoặc dư thừa với các công cụ kiểm soát phiên bản hiện đại.

Nó chỉ có thể có ý nghĩa như là một nhận xét trong một đoạn mã rất mô-đun, nếu người ta phải dùng đến một mã hóa tối nghĩa hoặc không rõ ràng mà các nhà phát triển trong tương lai sẽ bị cám dỗ thay đổi - không biết lý do đằng sau nó - như trong một cách giải quyết lỗi thư viện / thiếu sót.


0

Tôi chắc chắn sẽ không đưa thông tin đó vào đầu tập tin - thường thì những thứ đó thuộc về hệ thống bán vé.

Tuy nhiên, có một số trường hợp tham chiếu vào hệ thống vé và / hoặc tài liệu khác có ý nghĩa. Ví dụ, nếu có một lời giải thích dài về thiết kế, hoặc mô tả các lựa chọn thay thế. Hoặc thông tin làm thế nào để kiểm tra mọi thứ, hoặc giải thích tại sao nó được thực hiện chính xác theo cách đó. Nếu đó là ngắn, nó thuộc về chính tập tin; nếu nó dài và / hoặc là về một bức tranh lớn hơn, có lẽ bạn sẽ muốn đặt nó ở một nơi khác và tham khảo nó.


điều này dường như không thêm giá trị đáng kể vào những gì đã được đăng trong các câu trả lời trước
gnat

0

Dự án tôi hiện đang được giao tại nơi làm việc có loại danh sách số lỗi này ở đầu mỗi tệp; tuy nhiên, không ai trong số các nhà phát triển vẫn còn trong dự án nối thêm nó nữa. Hầu hết trong số họ nghĩ rằng đó là một sự lãng phí không gian vô ích, vì nó kém hơn nhiều so với việc theo dõi lỗi cam kết với một tệp bằng hệ thống kiểm soát phiên bản của chúng tôi.

Trong một số tệp quan trọng nhất định đã trải qua nhiều sửa chữa và cải tiến, các danh sách này đã trở nên quá lớn, bạn phải cuộn qua chúng để lấy mã. Khi gre các danh sách này có thể dẫn đến một số tích cực sai như một tiêu đề lỗi ngắn hoặc mô tả ngắn được liệt kê với mỗi danh sách.

Nói tóm lại, những danh sách này tốt nhất là vô dụng và tệ nhất là một sự lãng phí không gian lớn, hỗn loạn khiến cho mã khó tìm kiếm và định vị 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.