Tiêu chuẩn mã hóa cho rõ ràng: nhận xét mọi dòng mã?


142

Tôi đã làm việc trong các cửa hàng sản xuất phần mềm quan trọng trong cuộc sống và tôi đã xử lý các quy tắc nhận xét nhằm giữ cho mã có thể đọc được và có khả năng cứu sống. Theo kinh nghiệm của tôi, mặc dù yêu cầu trở thành một công việc chết não được đánh dấu khỏi danh sách kiểm tra và không giúp tôi tập trung vào việc viết mã dễ hiểu. Nó cũng khiến người đánh giá ngang hàng của tôi mất một cuộc trò chuyện có ý nghĩa hơn với tôi về cách làm cho mã dễ hiểu hơn.

Tôi cũng đã phân loại mã sinh viên không có ý kiến ​​và xem lý do tại sao họ nên bị đánh dấu xuống vì bỏ bê chúng.

Tôi hiểu rằng việc sử dụng tên tốt, giữ cho các cấu trúc đơn giản, các chức năng ngắn và các mô-đun tập trung sẽ giữ cho mã đủ dễ hiểu để các bình luận có thể được giảm thiểu.

Tôi cũng hiểu rằng các ý kiến ​​nên giải thích tại sao mã làm những gì nó làm, không phải như thế nào.

Với tất cả điều này là thậm chí có thể viết các tiêu chuẩn mã hóa tốt để nắm bắt ý tưởng này? Những người sẽ có liên quan trong đánh giá ngang hàng nhưng sẽ không biến thành một hoạt động kiểm tra danh sách vô nghĩa tạo ra các ghi chú không hữu ích hơn: "Bạn quên nhận xét về dòng 42".

Một ví dụ về loại mã quy tắc này có thể yêu cầu khi được coi là một dòng trong danh sách kiểm tra:

/* Display an error message */
function display_error_message( $error_message )
{
    /* Display the error message */
    echo $error_message;

    /* Exit the application */
    exit();
}

/* -------------------------------------------------------------------- */

/* Check if the configuration file does not exist, then display an error */
/* message */
if ( !file_exists( 'C:/xampp/htdocs/essentials/configuration.ini' ) ) {
    /* Display an error message */
    display_error_message( 'Error: Configuration file not found. Application has stopped');
}

Nếu có thể diễn đạt điều này một cách chính xác trong một tài liệu tiêu chuẩn và có thể đơn giản là không, tôi muốn nắm bắt một ý tưởng dọc theo những dòng này:

Xem xét một nhận xét cho mỗi dòng, trình tự, câu lệnh, phần, cấu trúc, chức năng, phương thức, lớp, gói, thành phần, ... của mã. Tiếp theo hãy xem xét đổi tên và đơn giản hóa để loại bỏ bất kỳ nhu cầu nào cho nhận xét đó để bạn có thể xóa nó. Kiểm tra trong khi ý kiến ​​là hiếm. Lặp lại cho đến thời hạn. Sau đó lặp lại một số chi tiết


21
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

32
Nhận xét của cải không dành cho thảo luận mở rộng. :) Những /* Display an error message */bình luận đó là khủng khiếp và thực sự tác động dễ đọc.
Andrea Lazzarotto

Chúng tôi cần IDE của chúng tôi để có các tùy chọn để ẩn ý kiến. Có thể một tùy chọn cho cả khối và bình luận nội tuyến ẩn riêng. Bằng cách này bạn có tốt nhất của cả hai lựa chọn. Đặt nhiều bình luận vào, nhưng có tùy chọn ẩn chúng để giữ cho mã trông sạch sẽ và không bị lộn xộn.
Doug.McFarlane

1
@ Doug.McFarlane Tôi nghĩ rằng nên tồn tại cho vim. Tất nhiên, nó làm ở cả cấp độ tập tin và khối - rtfm-sarl.ch/articles/ leather - comments.html !
Michael Durrant

Câu trả lời:


171

Câu trả lời của Michael Durrant là IMHO không tệ, nhưng nó không thực sự trả lời câu hỏi (như anh ấy tự thừa nhận), vì vậy tôi sẽ cố gắng đưa ra một câu trả lời:

Tôi cũng hiểu rằng các ý kiến ​​nên giải thích tại sao mã làm những gì nó làm, không phải như thế nào.

Với tất cả điều này là thậm chí có thể viết các tiêu chuẩn mã hóa tốt để nắm bắt ý tưởng này?

Rõ ràng bạn có thể viết một danh sách kiểm tra cho các đánh giá mã của bạn , có chứa các câu hỏi như

  • "nếu có một bình luận, nó có giải thích tại sao mã làm những gì nó làm không?"
  • "là mỗi dòng mã - trong ngữ cảnh của nó - có thể tự giải thích đủ để nó không cần bình luận, hoặc nếu không, nó có kèm theo một bình luận đóng khoảng cách đó không? Hoặc (tốt nhất là) mã có thể được thay đổi để nó không cần bình luận nữa à? "

Nếu bạn thích, bạn có thể gọi đây là "tiêu chuẩn mã hóa" (hoặc không, nếu bạn nghĩ rằng tiêu chuẩn mã hóa nên được dành riêng cho một danh sách các quy tắc braindead, dễ dàng trả lời nếu chúng được thực hiện hay không, cách định dạng mã nên trông giống như, hoặc nơi để khai báo các biến). Không ai cản trở bạn tập trung vào danh sách kiểm tra của bạn về các câu hỏi ngữ nghĩa , thay vì đi theo con đường dễ dàng và chỉ đưa các quy tắc chính thức vào đó.

Vào cuối ngày, bạn nên chắc chắn rằng nhóm của bạn cần một danh sách kiểm tra như vậy. Để áp dụng các câu hỏi như vậy, bạn cần lập trình viên có một số kinh nghiệm làm người đánh giá và bạn cần tìm hiểu xem liệu nó có thực sự cải thiện khả năng đọc mã trong một nhóm các chuyên gia hay không. Nhưng đó là điều bạn phải làm việc cùng với nhóm của mình.


45
Ai đã đánh giá thấp điều này? Đây là những câu trả lời cho sự phát triển phần mềm quan trọng. Đây là một thế giới khác so với nơi mà hầu hết các lập trình viên làm việc. Trong những thế giới này, một tiêu chuẩn mã hóa yêu cầu mỗi dòng mã có nhận xét riêng không phải là câu trả lời đúng. Không phải là gửi bình luận. OTOH, đưa ra nhận xét theo đánh giá mã chính xác là loại tiêu chuẩn phù hợp cho phần mềm quan trọng. Nó làm cho mã có thể xem xét và bảo trì nhiều hơn, nhưng điều này phải trả giá. Chi phí đó mờ nhạt so với các vụ kiện hàng triệu đô la xuất phát từ phần mềm được viết kém.
David Hammen

4
câu trả lời khôn ngoan. nếu chúng ta có thể tìm thấy các quy tắc chính hãng cho mã hóa, chúng ta sẽ không cần lập trình viên. chúng ta chỉ cần có mã máy. nó có thể xảy ra! :(

4
@DavidHammen: cảm ơn bình luận của bạn. Trên thực tế, tôi nghĩ rằng điều này không chỉ áp dụng cho "phát triển phần mềm quan trọng". Mỗi phần mềm được duy trì và phát triển qua nhiều năm, thường bởi những người khác nhau, sẽ được hưởng lợi từ việc nuôi ong dễ hiểu cho các lập trình viên bảo trì tiếp theo.
Doc Brown

5
Đây là lời khuyên tốt cho bất kỳ mã hóa nào , không chỉ mã được duy trì bởi những người khác nhau. Ngay cả khi bạn là người duy nhất sử dụng tập lệnh / chương trình, tương lai bạn phải sửa đổi mã trong thời gian một năm sẽ đánh giá cao sự rõ ràng (và thời gian được lưu bằng cách không phải giải mã mã mờ).
Anthony Geoghegan

5
Bạn có thể chỉnh sửa "câu trả lời hiện tại được nâng cao nhất" thành một cái gì đó khách quan hơn không? Không phải mọi độc giả sẽ biết lịch sử bình chọn của những câu trả lời này.
candied_orange

151

Mô hình chống chính dẫn đến mã kém chất lượng với độ rõ ít hơn

btw độc giả, tiêu đề ban đầu là "bình luận mỗi dòng mã?" và bạn có thể tưởng tượng phản ứng bản năng của nhiều người trong chúng ta, bao gồm cả bản thân tôi. Sau này tôi đổi tên thành tiêu đề chính xác hơn.

Lúc đầu, đọc câu hỏi của bạn tôi nghĩ, yuch trùng lặp nội dung trong các bình luận, nhưng ok, có thể nếu bạn có đủ sự nghiêm ngặt đối với đánh giá của nhiều người ... nhưng sau đó lại: mọi người mắc lỗi, không nhận thấy sự không nhất quán, v.v. và theo thời gian cuối cùng sẽ có sự khác biệt Về phản xạ tôi nghĩ vấn đề lớn hơn nhiều:

Các nhà phát triển sẽ có xu hướng viết mã tồi tệ hơn. Họ sẽ sử dụng các tên và cấu trúc khó hiểu hơn vì 'nó được giải thích trong bình luận - xem!'.

Xem xét:

living_room_set = tables + chairs.

Bây giờ hãy xem xét:

set = tbls+chrs # Make the set equal to the table plus the chairs

Bạn không chỉ có cả hai tên khó hiểu hơn và nhiều hơn để đọc, bạn còn phải nhìn qua lại, xem mã, một bộ là gì? nhìn bên trái mã, nhìn phải vào bình luận, tbls là gì, nhìn trái mã, nhìn phải vào bình luận, chrs là gì, nhìn phải vào bình luận. Yuch!

Tóm lược

Phát triển hoặc nâng cao tiêu chuẩn nhận xét nếu bạn bị buộc phải ở vị trí hiện tại với tư cách là nhà phát triển (Như một chương trình COBOL trước đây tôi chắc chắn đã thấy những người lớn!) Nhưng dành nhiều thời gian, sức lực và niềm đam mê của bạn để chống lại việc bình luận chống mẫu sử dụng các đối số:

  • Mã và Nhận xét không đồng bộ với nhau khi chỉ một thay đổi

  • Nhận xét có thể mô tả những gì một người nghĩ nhưng có thể sai và do đó che đậy lỗi

  • Mã trở nên khó đọc hơn

  • Mã tốt trở nên khó viết hơn

  • Xu hướng sử dụng tên khó hiểu hơn

  • Quá nhiều ký tự để đọc trong mã và ý kiến

  • Các biên tập viên khác nhau sử dụng các phong cách khác nhau

  • Yêu cầu trình độ tiếng Anh cao hơn so với chỉ viết mã

  • Mất thời gian và tài nguyên và trừ đi giá trị dài hạn *

Ngoài ra, tranh luận về mã tốt hơn mà không có nhận xét như vậy, - trên thực tế có một tiêu chuẩn (!) - tất cả các tên biến phải là full_english_words - có một! Vì vậy, sử dụng năng lượng 'tiêu chuẩn' đó theo các tiêu chuẩn của mã và bài kiểm tra viết tốt.

Một trong hai vấn đề khó khăn là đặt tên - đừng bỏ qua vấn đề với các bình luận.

Cho rằng một trong những vấn đề khác là tối ưu hóa sớm và việc tối ưu hóa nói chung có thể dẫn đến tối nghĩa 'tại sao lại theo cách này', đây là một lĩnh vực mà các nhận xét giải thích cho mã kém rõ ràng có thể có lợi mặc dù các cảnh báo trên vẫn được áp dụng.

* mã ngày mai


8
Tôi không tin bạn đã trả lời câu hỏi. Câu hỏi không phải là về việc có ý kiến ​​trên mỗi dòng. Đó là hỏi làm thế nào để nói với các nhà phát triển nhận xét mã mà không khiến họ bình luận mỗi dòng.
hichris123

7
Vâng, tôi không trả lời câu hỏi tiêu chuẩn cụ thể mà thay vào đó là cố gắng giúp mọi người không đi theo con đường đó. Vì vậy, đây có thể không phải là câu trả lời cho câu hỏi cụ thể nhưng có chứa lời khuyên có giá trị mà khó có thể đưa ra trong một nhận xét.
Michael Durrant

1
Vấn đề khó khăn khác là gì?
David Grinberg


1
Mỗi lý do của bạn để tránh các bình luận có thể bị phản đối nhưng StackExchange không cho phép các bình luận đủ dài (heh) để tôi giải quyết tất cả các ý kiến ​​ở đây. Đơn giản là: quá mức giống như gian lận cử tri: nó xảy ra, nhưng rất hiếm khi; Lần cuối cùng bạn thực sự thấy nó xảy ra là khi nào? Viết bình luận tốt không nên chỉ đơn giản là một suy nghĩ; nếu được thực hiện đúng, nó sẽ giúp quá trình phát triển. Vâng, nó cần tài nguyên, nhưng tiền chi trả là mã tốt hơn. Bạn sẽ không bao giờ có thể có được tiếng nổ tương tự cho đồng tiền của mình bằng cách hy sinh các bình luận cho một tiêu chuẩn đặt tên biến tốt hơn. Vâng, bình luận mỗi dòng là hạt.
bộ

23

Tôi không nghĩ rằng một tài liệu tiêu chuẩn mã hóa là nơi để xác định những gì đã là thông thường. Mục đích của một tiêu chuẩn mã hóa là để đảm bảo tính nhất quán (và tránh tranh luận) về các vấn đề mà những người hợp lý có thể không đồng ý và không có câu trả lời đúng rõ ràng duy nhất, ví dụ như quy ước đặt tên, thụt lề, v.v.

Nhận xét như trong ví dụ của bạn là vô dụng khách quan và có thể là do nhà phát triển thiếu kinh nghiệm hoặc nhà phát triển đã từng làm việc với một hệ thống xây dựng để kiểm tra một cách máy móc sự hiện diện của các bình luận (một ý tưởng thực sự tồi tệ, nhưng nó tồn tại). Trong cả hai trường hợp, giải pháp là giáo dục, có thể thông qua đánh giá mã.

Nếu bạn bắt đầu thêm tất cả các loại "thực tiễn tốt nhất" vào tiêu chuẩn mã hóa, bạn sẽ chỉ lặp lại việc đã được nêu trong nhiều cuốn sách. Chỉ cần mua "Mã sạch", "Hoàn tất mã" và "Lập trình viên thực dụng" cho nhà phát triển được đề cập và giữ tiêu chuẩn mã hóa của bạn gọn gàng.


63
Một trong nhiều điều tôi đã học được sau hơn 40 năm trong cây vợt này là ý thức chung không hoàn toàn phổ biến.
John R. Strohm

10
Không có những thứ như lẽ thường.
whatsisname

1
in_programming no .. thế giới thực oh yeah nhưng nó chỉ là một thuật ngữ cho kiến ​​thức kinh nghiệm trong thế giới thực
Michael Durrant

@ JohnR.Strohm: Kinh nghiệm của tôi đã tích cực hơn nhiều so với bạn, nhưng tôi cũng đã thấy việc sử dụng ý thức thông thường có thể được khuyến khích tích cực như thế nào bởi các quy tắc thực thi máy móc.
JacquesB

Tôi đồng ý 99,9% với câu trả lời này. Tiêu chuẩn mã hóa có nghĩa là điều mà các nhà phát triển chỉ ra khi một cuộc tranh luận xảy ra tại Đánh giá mã. Xem xét mã có nghĩa là để làm phong phú sản phẩm không bắt đầu chiến tranh. Vì vậy, nhiều cuộc chiến tranh mà tôi đã thấy được xúi giục bởi Code Reviews mà không có Tiêu chuẩn mã hóa. Tôi dám nói rằng nếu bạn không thể tự động hóa việc kiểm tra các mục trong tiêu chuẩn mã hóa thì nó sẽ ở trong đó. Đánh giá mã là thời gian để truyền đạt 'ý thức chung' cho các nhà phát triển ít kinh nghiệm khác. Đây không phải là lúc để đấu tranh về việc đặt tên biến. linux / kernel / gen_init_cpio.c dòng 335.
Andrew T Finnell

19

Điều đó là không thể. Những gì bạn về cơ bản đang cố gắng làm là gần như cơ giới hóa phán đoán tốt.

Khi viết các phần mềm quan trọng như cho các hệ thống y tế hỗ trợ sự sống, một lượng lớn danh sách kiểm tra và không có gì là không thể tránh khỏi. Ngay cả những người thông minh cũng mắc lỗi, rất nhiều phần mềm cho các thiết bị này được viết bởi những người không giỏi trong công việc của họ, vì vậy 'hệ thống' phải có khả năng bảo vệ chống lại công việc cẩu thả, làm cho nó an toàn chi phí thị trường.

Lựa chọn tốt nhất của bạn là bỏ qua Tiêu chuẩn mã hóa nghiêm ngặt để bình luận và dẫn dắt nhóm bằng ví dụ. Cho người khác thấy những bình luận tốt trông như thế nào bằng cách cố gắng tạo ra mã chất lượng tốt được nhận xét phù hợp. Thay vì cố gắng tìm ra cách cuối cùng để mô tả cách viết bình luận (bản thân chúng thường xuyên hơn không phải là một cuộc gọi phán xét) hãy cho người khác biết ý của bạn trên cơ sở hàng ngày với các đánh giá mã của riêng bạn. Khi các thành viên khác đọc mã của bạn, họ sẽ theo dõi nếu họ cảm thấy nó hữu ích. Và nếu họ không thể thì không có Tiêu chuẩn nào có thể giúp họ viết bình luận tốt hơn để bắt đầu.


1
+1 cho "Bạn đang cố gắng cơ giới hóa phán đoán tốt", -1 cho "Tùy chọn duy nhất của bạn là chỉ hy vọng điều tốt nhất" và điều đó khiến tôi không bỏ phiếu. Giáo dụcđào tạo đội ngũ của bạn cũng là một lựa chọn. Tiêu chuẩn có thể cho phép phán xét.
tự đại diện

1
@Wildcard Có lẽ bạn có thể giải thích cách một Tiêu chuẩn có thể cho phép phán xét? Đó sẽ không phải là một Hướng dẫn tại thời điểm đó? Tiêu chuẩn là "một ý tưởng hoặc sự vật được sử dụng làm thước đo, định mức hoặc mô hình trong các đánh giá so sánh." Làm thế nào người ta có thể sử dụng một cái gì đó vốn chủ quan, vì vậy chủ quan nó phụ thuộc vào người đọc nó, như một thước đo chất lượng?
Andrew T Finnell

1
@Wildcard: Vấn đề là khi bạn tham gia vào các ngành được quy định, quy trình sẽ thống trị tối cao trên tất cả mọi thứ, có một quy trình quan trọng hơn là liệu quy trình đó có đáng giá hay không. Mọi thứ phải được rút gọn thành các hộp kiểm trên một số hình thức, mọi hộp kiểm phải cụ thể và có thể kiểm chứng được, và bạn càng có nhiều cách kiểm tra trong hộp kiểm tra thì bạn càng gặp nhiều rủi ro khi gặp rắc rối trong kiểm toán.
whatsisname

Đó là một thế giới kỳ lạ, và hãy ghi nhớ các quy tắc được viết bởi các quan chức có ít kiến ​​thức về miền phần mềm và bạn thường kết thúc với các hệ thống tồn tại để biện minh và yêu cầu bản thân thay vì là phương tiện để kết thúc để đảm bảo chất lượng sản phẩm.
whatsisname

1
@whatsisname Tôi rất vui khi có người khác hiểu. Câu trả lời của bạn được viết thanh lịch và chính xác hơn những gì tôi có thể cố gắng đạt được. Tuyên bố with systems that exist to justify and require themselves rather than being a means to an end to ensure quality productsnày là chính xác những gì tôi đã cố gắng minh họa. Cảm ơn bạn đã tìm thấy lời nói của tôi cho tôi. Tôi thực sự có ý đó. Chúng ta phải tách biệt ý tưởng tạo ra chất lượng khỏi ý tưởng tuân theo một quy trình vì chúng không giống nhau. Đây là lý do tại sao chúng tôi có QA, Stackoverflow và rất tha thứ cho khách hàng.
Andrew T Finnell

14

Cập nhật

Phản ứng của tôi trong trích dẫn để nhấn mạnh:

Tôi tin rằng câu trả lời nêu rõ các bình luận không nên được giải quyết trong Tiêu chuẩn mã hóa và sau đó liệt kê một bộ câu hỏi phòng thủ để chống lại nó, là câu trả lời đúng duy nhất.

Vấn đề ở đây là Tiêu chuẩn mã hóa chỉ là Tiêu chuẩn . Những ý tưởng cực kỳ chủ quan không nên có trong Tiêu chuẩn mã hóa . Nó có thể là một hướng dẫn trong Thực tiễn tốt nhất, nhưng hướng dẫn đó không thể được sử dụng để chống lại nhà phát triển trong quá trình Đánh giá mã. Theo ý kiến ​​cá nhân của tôi, Tiêu chuẩn mã hóa phải càng gần với Tự động hóa càng tốt. Có quá nhiều thời gian lãng phí trong Đánh giá mã tranh luận về cách đặt tên, khoảng cách, tab, dấu ngoặc, nhận xét, v.v. khi TẤT CẢ nó có thể được tự động hóa. Ngay cả câu trả lời về tableschairscó thể được tự động. LINT'ers cho phép từ điển, Kiểm tra viết hoa theo khái niệm (Biến, Hàm, Phương thức, Lớp, v.v.).

Ngay cả việc kiểm tra JavaDoc cũng có thể được Robot LINT'er triển khai trước khi Yêu cầu kéo được chấp nhận. Rất nhiều dự án nguồn mở thực hiện điều này chính xác. Bạn gửi Yêu cầu kéo của mình, mã được xây dựng với tệp Travis-CI, bao gồm Phân tích tĩnh và nó phải vượt qua tất cả các Tiêu chuẩn mã hóa có thể được thể hiện một cách khách quan. Không có tiếng chuông của con người trong việc 'làm điều đó không chính xác' hoặc không 'cung cấp giá trị' với một nhận xét, hoặc cách sai để đặt tên biến, et el. Những cuộc thảo luận đó không mang lại giá trị nào và tốt nhất là để lại cho một robot bên thứ ba có thể vượt qua sự mã hóa cảm xúc của chúng ta.

Để thực sự trả lời câu hỏi, chúng tôi sẽ phải giải quyết cách viết một Tiêu chuẩn nhằm giải quyết câu hỏi sau: Nhận xét này có cung cấp giá trị không? Tiêu chuẩn mã hóa có thể không thể ra lệnh 'giá trị' của một nhận xét. Do đó, nó trở nên cần thiết cho một người đi qua danh sách kiểm tra đó. Việc chỉ đề cập đến các bình luận trong Tiêu chuẩn mã hóa sẽ tạo ra một danh sách kiểm tra mà Poster gốc muốn tránh.

Đó là lý do tại sao các bình luận thường không được trình biên dịch xử lý và loại bỏ. Giá trị của chúng không thể được xác định. Là nhận xét trong câu hỏi có giá trị; có hay không?. Trả lời câu hỏi này là NP-hard. Chỉ có con người mới có cơ hội trả lời đúng, và thậm chí sau đó nó chỉ có thể được trả lời tại thời điểm nó được đọc, bởi người đang đọc nó; nơi giá trị của bình luận đó bị ảnh hưởng bởi thời tiết, cuộc sống gia đình của anh ấy hoặc cô ấy, cuộc họp cuối cùng họ chỉ tham dự và không kết thúc tốt đẹp, thời gian trong ngày, lượng cà phê họ đã uống. Tôi tin tưởng bức tranh đang trở nên rõ ràng hơn.

Làm thế nào nó có thể được thể hiện đúng trong bất kỳ Tiêu chuẩn nào? Một tiêu chuẩn không hữu ích trừ khi nó có thể được áp dụng một cách nhất quán và công bằng, trong đó công bằng hơn về tính khách quan chứ không phải tình cảm.

Tôi tranh luận rằng Tiêu chuẩn mã hóa phải duy trì mục tiêu nhất có thể. Các biến số được đặt tên là mục tiêu IS. Chúng có thể dễ dàng được kiểm tra đối với một từ điển để đánh vần đúng, cấu trúc ngữ pháp và vỏ. Bất cứ điều gì ngoài đó là một "trận đấu tức giận" được chiến thắng bởi người có sức mạnh nhất hoặc "đánh bại trán". Một cái gì đó, cá nhân tôi, đấu tranh với KHÔNG làm.

Khi tôi bình luận, tôi luôn bình luận nói chuyện với bản thân tương lai của tôi ở người thứ ba. Nếu tôi quay lại mã này sau 5 năm, tôi cần biết điều gì? Điều gì sẽ hữu ích, điều gì sẽ gây nhầm lẫn và điều gì sẽ lỗi thời với mã? Có một sự khác biệt giữa mã tài liệu để tạo API công khai có thể tìm kiếm và mã nhận xét cung cấp giá trị cho bên thứ ba không xác định, ngay cả khi bên thứ ba đó là chính bạn.

Đây là một bài kiểm tra litmus tốt. Nếu bạn là người duy nhất trong dự án. Bạn biết bạn là người duy nhất trong dự án. Điều gì sẽ có trong tiêu chuẩn mã hóa của bạn? Bạn muốn mã của mình sạch sẽ, tự giải thích và dễ hiểu cho chính mình trong tương lai. Bạn có muốn xem lại mã với chính mình về lý do tại sao bạn không đưa ra nhận xét trên mỗi dòng không? Bạn có xem lại từng bình luận bạn đã tạo trên 100 tệp bạn đã đăng ký không? Nếu không thì tại sao lại ép người khác?

Một điều tôi tin là đã bỏ lỡ trong các cuộc thảo luận này là Tương lai Bạn cũng là nhà phát triển cho dự án này. Khi hỏi về giá trị, ngày mai bạn cũng là một người có thể rút ra giá trị từ nhận xét. Vì vậy, quy mô đội, theo tôi không quan trọng. Kinh nghiệm nhóm không thành vấn đề, nó thay đổi quá thường xuyên.

Không có số lượng mã nhận xét nào xem xét điều này ngăn chặn một nhà sản xuất tốc độ khỏi bị rơi và giết chết một bệnh nhân. Khi bạn nói về một nhận xét ảnh hưởng đến mã, bây giờ bạn sẽ nói về mã không phải là nhận xét. Nếu tất cả chỉ là một bình luận bị thiếu để giết một ai đó, thì có một thứ khác có mùi trong quá trình này.


Giải pháp cho loại mã hóa nghiêm ngặt này đã được cung cấp như một phương pháp để tự viết phần mềm. Và nó không có gì để làm với ý kiến. Vấn đề với ý kiến ​​là họ KHÔNG có tác động đến cách thức sản phẩm cuối cùng hoạt động. Những bình luận tốt nhất trên thế giới không thể ngăn phần mềm bị sập khi được nhúng trong bộ tạo tốc độ. Hoặc khi đo các tín hiệu điện bằng EKG di động.

Chúng tôi có hai loại ý kiến:

Máy có thể đọc bình luận

Các kiểu nhận xét như Javadoc, JSDoc, Doxygen, v.v ... là tất cả các cách nhận xét giao diện công cộng mà một bộ mã cung cấp. Giao diện đó chỉ có thể được sử dụng bởi một nhà phát triển khác (mã sở hữu cho nhóm hai người), một số nhà phát triển không xác định (ví dụ JMS) hoặc cho toàn bộ bộ phận. Mã này có thể được đọc bởi một quy trình tự động, sau đó tạo ra một cách khác để đọc các nhận xét đó, ala HTML, PDF, v.v.

Loại bình luận này là dễ dàng để tạo ra một tiêu chuẩn cho. Nó trở thành một quy trình khách quan để đảm bảo mọi phương thức, hàm, lớp có thể gọi công khai có thể chứa các bình luận cần thiết. Tiêu đề, tham số, mô tả et. el. Điều này là để đảm bảo rằng nhóm khác dễ dàng tìm và sử dụng mã.

Tôi đang làm một cái gì đó có vẻ điên rồ, nhưng nó thực sự không

Những bình luận này ở đây để giúp người khác thấy TẠI SAO mã này được viết theo một cách nhất định. Có lẽ có một lỗi số trong bộ xử lý mà mã đang chạy và nó luôn làm tròn, nhưng các nhà phát triển thường xử lý mã làm tròn. Vì vậy, chúng tôi nhận xét để đảm bảo rằng nhà phát triển chạm vào mã hiểu lý do tại sao bối cảnh hiện tại đang làm một cái gì đó thường có vẻ không hợp lý, nhưng thực tế đã được viết theo cách đó.

Loại mã này là nguyên nhân gây ra rất nhiều vấn đề. Nó thường không bị lỗi và sau đó được tìm thấy bởi một nhà phát triển mới và 'đã sửa.' Do đó phá vỡ mọi thứ. Ngay cả khi đó, các ý kiến ​​chỉ ở đó để giải thích TẠI SAO không thực sự ngăn chặn bất cứ điều gì phá vỡ.

Nhận xét không thể dựa vào

Bình luận cuối cùng là vô dụng và không thể tin tưởng. Bình luận thường không thay đổi cách chạy chương trình. Và nếu họ làm như vậy, thì quá trình của bạn đang gây ra nhiều vấn đề hơn thì nó nên. Nhận xét là suy nghĩ và không bao giờ có thể là bất cứ điều gì nhưng. Mã là tất cả những gì quan trọng vì đó là tất cả những gì được xử lý bởi máy tính.

Điều này nghe có vẻ asinine, nhưng chịu đựng tôi. Cái nào trong hai dòng này thực sự quan trọng?

// We don't divide by 0 in order to stop crashes.

return 1 / n;

Trong ví dụ này, tất cả vấn đề là chúng tôi không biết 'n' là gì, không có bất kỳ kiểm tra nào cho 0 và ngay cả khi có, không có gì ngăn cản nhà phát triển đặt n = 0SAU kiểm tra cho 0. Do đó, nhận xét là vô dụng và không có gì tự động có thể bắt được điều này. Không có tiêu chuẩn có thể bắt được điều này. Các bình luận, trong khi khá (với một số) không có liên quan đến kết quả của sản phẩm.

Hướng phát triển thử nghiệm

Điều gì có kết quả trên sản phẩm? Các ngành công nghiệp trong đó mã được viết theo nghĩa đen có thể lưu hoặc giết một ai đó phải được kiểm tra nghiêm ngặt. Điều này được thực hiện thông qua đánh giá mã, đánh giá mã, thử nghiệm, thử nghiệm, đánh giá mã, thử nghiệm đơn vị, thử nghiệm tích hợp, thử nghiệm, dàn dựng, tháng thử nghiệm, đánh giá mã và thử nghiệm cá nhân, dàn dựng, đánh giá mã, thử nghiệm, và cuối cùng có thể đi vào sản xuất. Bình luận không có gì để làm với bất kỳ điều này.

Tôi thà mã không có bình luận, có thông số kỹ thuật, có các bài kiểm tra đơn vị xác minh thông số kỹ thuật, nghiên cứu về kết quả của việc chạy mã trên thiết bị sản xuất, sau đó là mã tài liệu chưa từng được kiểm tra, cũng không có gì để so sánh mã chống lại.

Tài liệu rất hay khi bạn cố gắng tìm hiểu TẠI SAO ai đó đã làm một điều gì đó theo một cách nhất định, tuy nhiên, tôi đã tìm thấy trong những năm qua rằng tài liệu thường được sử dụng để giải thích tại sao một cái gì đó 'thông minh' được thực hiện, khi nó thực sự không cần thiết được viết theo cách đó.

Phần kết luận

Nếu bạn làm việc tại một công ty YÊU CẦU mỗi dòng được nhận xét, tôi ĐẢM BẢO ít nhất hai trong số các kỹ sư phần mềm trong dự án đã viết một chương trình tài liệu tự động trong Perl, Lisp hoặc Python để xác định ý tưởng chung về những gì dòng đang làm , sau đó thêm một nhận xét trên dòng đó. Bởi vì điều này là có thể làm, nó có nghĩa là các ý kiến ​​là vô ích. Tìm các kỹ sư đã viết các tập lệnh này để tự động ghi lại mã và sử dụng chúng làm bằng chứng cho lý do tại sao 'Nhận xét về mọi dòng' đang lãng phí thời gian, không cung cấp giá trị và có khả năng gây tổn thương.

Ở một bên, tôi đang giúp một người bạn thân với một bài tập lập trình. Giáo viên của ông đã đặt ra một yêu cầu rằng mọi dòng phải được ghi lại. Vì vậy, tôi có thể thấy quá trình suy nghĩ này sẽ đến từ đâu. Chỉ cần tự hỏi, bạn đang cố gắng làm gì, và đây có phải là điều đúng đắn? Rồi tự hỏi bản thân; Có cách nào để 'trò chơi' hệ thống với quy trình này không? Nếu có, thì nó thực sự bổ sung bất kỳ giá trị nào? Người ta không thể tự động viết các bài kiểm tra đơn vị kiểm tra mã nào đáp ứng một đặc điểm kỹ thuật nhất định và nếu có thể, đó sẽ không phải là điều xấu.

Nếu một thiết bị phải hoạt động trong một số điều kiện nhất định vì nó sẽ ở bên trong con người, cách duy nhất để đảm bảo thiết bị sẽ không giết chúng là nhiều năm thử nghiệm, đánh giá ngang hàng, thử nghiệm và sau đó KHÔNG BAO GIỜ thay đổi mã lần nữa. Đây là lý do tại sao NASA vẫn / vẫn đang sử dụng phần cứng và phần mềm cũ như vậy. Khi nói đến sự sống hay cái chết, bạn không chỉ 'tạo ra một chút thay đổi và kiểm tra nó.'

Bình luận không có gì để làm với cuộc sống. Nhận xét là dành cho con người, con người mắc lỗi, ngay cả khi viết bình luận. Đừng tin con người. Ergo, đừng tin vào những bình luận. Bình luận không phải là giải pháp của bạn.


3
Vấn đề với ý kiến ​​là họ KHÔNG có tác động đến cách thức sản phẩm cuối cùng hoạt động. tốt nếu các phần của con người đọc và viết đếm mã tôi nghĩ rằng không ảnh hưởng đến cách nó rốt cuộc làm việc, nhưng không phải cách mã thực thi khi cuối cùng bằng văn bản, có. Tôi muốn nói rằng vấn đề với mã chỉ đơn giản là nó đã lỗi thời và tệ hơn là không có mã!
Michael Durrant

1
Ở đây, chúng tôi đã có một máy chấm công muốn báo cáo hàng ngày cho những gì chúng tôi đã làm để anh ta có thể tối ưu hóa công việc của chúng tôi. Trong bất kỳ trường hợp nào, chúng tôi đã hơi tức giận về việc chúng tôi cần dành 15 phút mỗi ngày để điền vào mẫu đơn của mình để chúng tôi tự động hóa việc này bằng cách điền vào rác từ nhật ký của chúng tôi.
joojaa

1
Có một vấn đề khác với nhận xét "Chúng tôi không chia cho 0 để ngăn sự cố." Không rõ ràng về mặt ngữ pháp nếu mệnh đề "theo thứ tự" áp dụng cho hành động chia hoặc phủ định của nó. Nếu bạn sử dụng "Chúng tôi tránh chia cho 0 để ..." thì bạn sẽ tránh được sự mơ hồ này. :)
tự đại diện

1
"Đừng chia cho số 0 để ngăn chặn sự cố" thực sự cho tôi biết rất nhiều về suy nghĩ của người đã viết nó. Bạn không mã để tránh sự cố! Bạn mã để mã là chính xác, và không bị lỗi chỉ là một phần nhỏ của chính xác. Nếu việc tính toán số lượng thuốc cần tiêm kết thúc bằng 0, bạn không trả lại một số giá trị giả như 99999 ...
miễn phí vào

1
@AndrewTFinnell Ý tôi là nếu đôi khi bạn nhận được một phép chia bằng 0, việc thêm "if (divisor == 0) return <Something>; // tránh chia cho 0" sẽ không làm cho mã của bạn trở nên chính xác hơn. Thay vào đó, bạn cần tìm lý do tại sao số chia là 0 và khắc phục điều đó. Một số thuật toán được thiết kế để ước số bằng 0 là không thể tránh khỏi, nhưng chúng là ngoại lệ (Và trong đó trường hợp bạn có thể trả về giá trị "kết quả không thể tính được").
Immibis

12

Có hai điều khác nhau mà bạn ám chỉ khi bạn nói về ý kiến. Chúng không giống nhau, và sự khác biệt là quan trọng.

Tài liệu cho bạn biết về các bit hướng ra ngoài của một đoạn mã - giao diện của nó.

Thông thường, công cụ sẽ cho phép bạn đọc chúng theo kiểu 'độc lập', tức là bạn không nhìn vào mã bên dưới cùng một lúc.

Tất cả giao diện phải được ghi lại (ví dụ: mỗi phương thức, ngoại trừ các phương thức riêng tư) và nó sẽ mô tả các đầu vào, đầu ra và bất kỳ kỳ vọng, giới hạn nào khác, v.v., đặc biệt là những điều không thể được thể hiện thông qua các ràng buộc, kiểm tra, v.v. ( Chính xác bao nhiêu chi tiết và nơi nó đi phụ thuộc vào dự án).

Tài liệu tốt cho phép người tiêu dùng tiềm năng quyết định xem, khi nào và làm thế nào để sử dụng mã.

Nhận xét trong mã nguồn có một mục đích khác nhau. Họ ở đó để mọi người nhìn vào mã nguồn. Họ chủ yếu mô tả việc thực hiện.

Bình luận luôn được đọc trong số các mã cơ bản.

Nhận xét nên giải thích các quyết định đáng ngạc nhiên hoặc các thuật toán phức tạp hoặc các tùy chọn không được thực hiện (và lý luận). Họ ở đó để các nhà phát triển trong tương lai có thể hiểu được quá trình suy nghĩ của người tiền nhiệm của họ và có sẵn thông tin mà họ có thể bỏ qua hoặc dành nhiều thời gian để tìm kiếm, ví dụ:

# 'map' outperforms 'for' here by a factor of 10  

// This line works around an obscure bug in IE10, see issue #12053  

-- We are going to recursively find the parents up to and including the root node.
-- We will then calculate the number of steps from leaf node to root node.
-- We first use a WITH clause to get the ID of the root node.

Bạn không thể suy luận bất cứ điều gì từ việc không có bình luận, và tất nhiên bình luận có thể sai như mã xung quanh hoặc hơn thế nữa. Phán quyết phải được thực hiện cả về phía tác giả và về phía người đọc.

Bình luận mỗi dòng rõ ràng là nhiều công việc có giá trị bổ sung đáng ngờ, đi kèm với chi phí cơ hội. Nếu bạn có một quy tắc nói rằng mọi dòng phải được nhận xét, bạn sẽ nhận được điều đó, nhưng với chi phí của các phần quan trọng được nhận xét tốt .

Nhưng điều tồi tệ hơn thế: mục đích của một bình luận bị đánh bại nếu mỗi dòng được bình luận. Nhận xét trở thành tiếng ồn khiến mã khó đọc: che khuất hơn là làm rõ. Hơn nữa, bình luận bừa bãi làm cho những bình luận thực sự quan trọng khó phát hiện hơn.

Cả ý kiến ​​và tài liệu đều không cung cấp bất kỳ loại biện pháp hay đảm bảo nào về chất lượng mã mà họ mô tả; chúng không phải là sự thay thế cho QA chính hãng. Mục đích của họ là hướng tới tương lai, tức là với hy vọng rằng họ sẽ giúp những người tương tác với nó tránh mắc lỗi.

Tóm lại , các tiêu chuẩn mã hóa của bạn có thể và nên yêu cầu tài liệu (kiểm tra tự động giúp phát hiện các chức năng / phương pháp không có giấy tờ, nhưng con người vẫn cần kiểm tra xem tài liệu đó có tốt không). Nhận xét là một cuộc gọi phán xét và hướng dẫn phong cách của bạn nên thừa nhận điều này. Những người không bao giờ bình luận, và những người bình luận mà không suy nghĩ nên mong đợi được thử thách.


Tài liệu API công khai là một điểm tốt nhưng tôi thực sự thích giải thích các quyết định đáng ngạc nhiên. Sẽ rất tốt nếu vi phạm nguyên tắc ít gây ngạc nhiên ít nhất là đi kèm với một lời biện minh. +1
candied_orange

1
+1 cho các bình luận không liên quan như tiếng ồn. Giữ tín hiệu nhiễu cao.
sq33G

+1 đặc biệt cho mục đích bình luận bị đánh bại nếu mỗi dòng được bình luận. Quá tệ, điều này có thể được (và thường là) được sử dụng như một lý do để không bình luận gì cả, nhưng dù sao thì nó cũng rất đúng, vì những lý do bạn đã đề cập cộng bởi vì nếu mỗi dòng được bình luận, hầu hết mọi người sẽ tự động và dễ hiểu bắt đầu bỏ qua tất cả các bình luận .
SantiBailors

10

Bạn không thể mã hóa một tiêu chuẩn bình luận, bởi vì bạn không thể biết trước những bình luận quan trọng sẽ là gì.

Nhưng bạn vẫn muốn đảm bảo mã được nhận xét chính xác, vì đây là mã quan trọng trong cuộc sống. Giải pháp là có một tiêu chuẩn để xem xét mã - yêu cầu nhận xét đánh giá mã về tính dễ hiểu.

Điều này sẽ không đảm bảo rằng nó sẽ không biến thành một danh sách kiểm tra vô nghĩa, nhưng ít nhất nó sẽ giữ cho nó không làm cho mã khó đọc hơn. Và có khả năng làm cho nó tốt hơn.

Điều này đòi hỏi một nền văn hóa trong đó việc xem xét mã không phải là một cử chỉ vô nghĩa, trong đó việc gửi mã của bạn trở lại khó đọc là một điều tốt, và không phải là một sự xúc phạm hay khó chịu. Cũng quan trọng như vậy, một điều mà nói không rõ ràng, không được xem là một thất bại của người đọc.

Mã không thể đọc được, ở một mức độ nhất định, không thể tránh khỏi. Bởi vì người viết đắm chìm trong bối cảnh và sẽ thấy điều gì đó hiển nhiên khi nó chỉ rõ ràng nếu bạn biết x, y hoặc z.

Vì vậy, bạn sẽ không thể có một quy tắc nói đưa ra phản hồi tốt, nhưng bạn có thể phát hiện ra kiểm tra đánh giá. Ngay cả một người quản lý không phải lập trình viên cũng có thể làm như vậy - bởi vì câu hỏi thực sự không phải là mã được viết để có thể đọc được, mà là mã thực sự có thể đọc được, chỉ có thể được quyết định bởi người đọc nó.


7
Re Bạn không thể mã hóa một tiêu chuẩn bình luận - Chắc chắn bạn có thể. Bạn đưa ra nhận xét phải xem xét mã và mục đánh giá mã cho biết các nhận xét không giải thích mã phải được xử lý. Đây là một chi phí, một chi phí mà hầu hết các môi trường lập trình không muốn trả. Nó trả hết cho phần mềm quan trọng.
David Hammen

"... khi nó chỉ rõ ràng nếu bạn biết x, y hoặc z" Bạn có thể chỉ định lượng kiến ​​thức {x, y, z} cần biết trước để thấy điều gì đó hiển nhiên và sau đó (loại về mặt cơ học) bạn có thể kiểm tra xem điều này có đúng với mã hiện tại không. Trường hợp không, thêm ý kiến ​​cho đến khi nó được.
Trilarion

1
@DavidHammen: đó không phải là một tiêu chuẩn cho nhận xét, đó là một tiêu chuẩn cho đánh giá. Đó là những gì tôi đã đề nghị như là giải pháp. Bạn không thể nói nó phải có kích thước nhất định hoặc sử dụng một cú pháp cụ thể hoặc thậm chí hữu ích yêu cầu nhận xét ở vị trí đầu tiên (hoặc bạn nhận được các bình luận loại "thêm một vào i"). Bạn CÓ THỂ nói rằng người đánh giá phải nhận xét về mã và ý kiến. Như bạn nói, bạn có thể yêu cầu các vấn đề được đưa ra bởi đánh giá mã phải được giải quyết. Nhưng trách nhiệm cho việc này đã được người đánh giá thực hiện một công việc tốt. Chỉ người đánh giá có thể đánh giá xem mã và nhận xét là đủ.
jmoreno

@DavidHammen Những người được chọn để đánh giá thực hiện cuộc gọi phán xét? Và khi nào họ rời đi? Nếu những người mới không nghĩ giống như vậy hoặc nói tiếng Anh? Nếu 'Người phản biện' rời đi? Đề xuất của bạn đặt một vài nhà phát triển lên trên Tháp Ngà, dẫn đến bất đồng quan điểm, mất lòng tin và phá vỡ giao tiếp. Nhận xét có nghĩa là để cung cấp cái nhìn sâu sắc hoặc làm rõ cho những người có thể sử dụng nó. Có lẽ Joe cần nó nhưng Mary thì không. Điều gì xảy ra khi Mary là người phản biện? Hay Joe? Hay Mark?
Andrew T Finnell

@jmoreno - Không đặt các quy tắc / hướng dẫn về nhận xét vào các tiêu chuẩn mã hóa có nghĩa là các lập trình viên phải xem xét nhiều nguồn - và họ không biết tìm ở đâu cho đến khi đánh giá trở lại nói rằng các bình luận không đạt chuẩn. Đó là một sai lầm khi nghĩ rằng mọi thứ trong một tiêu chuẩn mã hóa phải được tự động hóa. Các quy tắc về tên có ý nghĩa, ví dụ, không thể tự động. Ít nhất là chưa. Ví dụ, x, y, và z, hay i, jkcó thể là tên khá ý nghĩa nếu ai thực hiện một thuật toán khoa học dựa trên một bài báo trên tạp chí được sử dụng một cách chính xác những tên trong công thức của nó.
David Hammen

9

Nhận xét từng dòng mã? Không .

Mục đích của các quy tắc khác mà bạn nói đến là chính xác để tránh điều đó.

Nhận xét cho một mã có thể đọc được là dư thừa tốt nhất, và tồi tệ nhất sẽ khiến độc giả bỏ qua việc tìm kiếm mục đích không tồn tại của bình luận.

Nếu bạn nhận xét toàn bộ mã tự giải thích, bạn sẽ nhân đôi số lượng đọc mà không đưa ra bất kỳ thông tin bổ sung nào. Tôi không chắc chắn nếu sự dư thừa như vậy sẽ trả hết. Người ta có thể tưởng tượng một nhà phê bình nói rằng 42 nói "display_error " trong khi bình luận nói "hiển thị cảnh báo". Nhưng hãy tưởng tượng một sự thay đổi trong mã. Bạn có hai nơi để sửa bây giờ. Nó trở nên rõ ràng phong cách này có tiêu cực sao chép-dán.

Tôi sẽ nói rằng tối ưu mã không cần bất kỳ bình luận nào, ngoài tài liệu.

Có những kiểu hoàn toàn ngược lại, nếu bạn nghi ngờ về dòng đó thì:

  1. Mã này quá phức tạp và nên được tái cấu trúc thành một hàm có tên với ý nghĩa ngữ nghĩa cho phần mã. Có thể là một phức tạp ifhoặc một phần của thuật toán. (Hoặc một lớp lót LINQ thông minh)

  2. Nếu không thể đơn giản hóa, bạn không biết đủ thành ngữ ngôn ngữ.

(Cá nhân tôi không phải là người cuồng tín về quy tắc không bình luận nghiêm ngặt, nhưng tôi thấy đó là một tư duy ban đầu tốt để thực hiện.)

Với tất cả điều này là thậm chí có thể viết các tiêu chuẩn mã hóa tốt để nắm bắt ý tưởng này?

Đối với quá trình. Tiêu chuẩn của chúng tôi đã cung cấp khá nhiều tín dụng cho người đánh giá. Giả sử họ không độc hại thì việc này tốt.

Khi anh ta hỏi "Biến là gì o gì?", Bạn đổi tên nó. Nếu anh ta hỏi khối này làm gì, có thể tái cấu trúc hoặc nhận xét. Nếu có một cuộc tranh luận về việc một cái gì đó rõ ràng hay không, nếu người xem xét không nhận được nó, thì theo định nghĩa thì không. Trong những dịp rất hiếm hoi, có một cái gì đó giống như ý kiến ​​thứ 2 từ vài người bạn.

Trung bình, bạn sẽ nhận được một mã dễ hiểu bởi các lập trình viên trung bình trong nhóm. IMO nó giữ thông tin dư thừa và đảm bảo rằng mã có thể hiểu được bởi ít nhất một thành viên khác trong nhóm, chúng tôi đã tìm thấy một cách tối ưu tốt.

Ngoài ra, không có sự tuyệt đối . Mặc dù chúng tôi là một nhóm nhỏ. Thật dễ dàng để tìm thấy sự đồng thuận trong nhóm 5.


2
Sử dụng các đánh giá mã để ra lệnh cho các biến, các lớp và phương thức nên được đặt tên là cách tốt nhất để khiến mọi người ghét một công ty, doanh nghiệp hoặc phương pháp. Đánh giá mã không nên được sử dụng như một cách để thực thi những điều không thực sự quan trọng. Tiêu chuẩn mã hóa phải được kiểm tra thông qua quy trình tự động. Độ dài tên biến, Độ phức tạp tròn, Luật Demeter, là tất cả những thứ có thể được kiểm tra. Nếu ai đó bảo tôi đổi tên một biến từ 'i' thành một cái gì đó như indexForThePreinglyCollection, tôi sẽ tìm một nơi khác để làm việc. Các biến> 3 ký tự đều được kiểm tra trước khi đăng ký tự động.
Andrew T Finnell

3
@AndrewTFinnell Tôi có thể viết mã không thể theo mã trong bất kỳ mô hình lập trình nào bạn quan tâm để đặt tên.
candied_orange

2
@AndrewTFinnell Vâng, tôi sẽ không đồng ý một cách lịch sự. " Sử dụng đánh giá mã để ra lệnh ", tôi không biết bạn đã lấy nó từ đâu. Tôi không muốn làm việc trên mã với các biến i, j, kkhắp nơi sau khi tác giả ban đầu bỏ. Tôi không hiểu quan điểm của bạn về bộ gen "con người". Tôi nghi ngờ có một ngôn ngữ là một tuyên bố duy nhất, hoặc hai là quá khó để hiểu. Như tôi đã nói, tôi đã thấy các ifs và LINQliners phức tạp . Họ có thể được bình luận hoặc tái cấu trúc dưới một cái tên có ý nghĩa về mặt ngữ nghĩa, tôi đoán đó là "bình luận tốt" của bạn.
luk32

3
@ luk32 Tôi tôn trọng quyền không đồng ý. Các biến lặp là khá rõ ràng theo ngữ cảnh theo ý kiến ​​của tôi. Trong khi tôi hiểu được tình cảm của tuyên bố của bạn, tôi tin rằng có quá nhiều thực tiễn đưa tình cảm đó đến cực điểm. Chúng ta có thực sự cần mã đọc: for (int indexForCurrentDatabaseRow = 0; indexForCurrentDatabaseRow < currentUserRecordSetResults.length; indexForCurrentDatabaseRow = indexForCurrentDatabaseRow + 1)so với for (int i = 0; i < results.length; i++)? Có lẽ đó là vấn đề ưu tiên và / hoặc dành thời gian xem mã. Những cái tên quá dài có mùi với tôi.
Andrew T Finnell

2
Tôi không nghĩ rằng tên nên được quyết định trong đánh giá mã. Việc xem xét mã thường sẽ bắt đầu sau khi tác giả nghĩ rằng nó đủ tốt, điều đó cũng có nghĩa là nó được nhận xét đúng, dễ hiểu và các biến có tên đàng hoàng. Vấn đề là - nếu người đánh giá nghĩ rằng mã quá phức tạp hoặc đấu tranh với ý nghĩa của một biến, thì mã đó là khó hiểu. Điều này không phải bàn cãi - rõ ràng ít nhất một nhà phát triển - người đánh giá - đã không hiểu nó. Có cần tái cấu trúc (và làm thế nào) hoặc nhận xét đúng hay không là một vấn đề khác.
Idan Arye

9

Câu hỏi:

Với tất cả điều này là thậm chí có thể viết các tiêu chuẩn mã hóa tốt để nắm bắt ý tưởng này? Những người sẽ có liên quan trong đánh giá ngang hàng nhưng sẽ không biến thành một hoạt động kiểm tra danh sách vô nghĩa tạo ra các ghi chú không hữu ích hơn: "Bạn quên nhận xét về dòng 42".

Bình luận không nên tìm cách giáo dục người đọc về ngôn ngữ. Một người đọc nên được giả định để biết ngôn ngữ tốt hơn nhà văn, nhưng với bối cảnh ít hơn nhiều so với nhà văn.

Một người đọc mã này, từ ví dụ của bạn, nên biết rằng exit()sẽ thoát khỏi ứng dụng - do đó làm cho nhận xét trở nên dư thừa:

/* Exit the application */
exit();

Nhận xét dư thừa là vi phạm DRY và các thay đổi đối với mã không nhất thiết phải truyền đến các bình luận, để lại các bình luận không phản ánh những gì mã thực sự đang làm.

Tuy nhiên, các ý kiến ​​giải thích lý do tại sao bạn làm điều gì đó có thể có giá trị - đặc biệt là nếu bạn không thể dễ dàng truyền đạt ý nghĩa trong chính mã.

PEP 8 của Python (hướng dẫn kiểu cho Python trong thư viện chuẩn CPython) cung cấp hướng dẫn sau cho các nhận xét nội tuyến:

Sử dụng bình luận nội tuyến một cách tiết kiệm.

Một bình luận nội tuyến là một bình luận trên cùng một dòng như một tuyên bố. Các bình luận nội tuyến nên được phân tách bằng ít nhất hai khoảng trắng từ câu lệnh. Họ nên bắt đầu với một # và một không gian duy nhất.

Bình luận nội tuyến là không cần thiết và trong thực tế gây mất tập trung nếu họ nêu rõ ràng. Đừng làm điều này:

x = x + 1                 # Increment x

Nhưng đôi khi, điều này rất hữu ích:

x = x + 1                 # Compensate for border

Cho một ví dụ như vậy, cá nhân tôi thích tiến thêm một bước và cũng sẽ cố gắng loại bỏ nhận xét này. Ví dụ: tôi có thể đến:

border_compensation = 1
compensated_x = x + border_compensation

Làm cho mã của bạn tự viết tài liệu không phải là một ý tưởng mới .

Quay lại câu hỏi thực tế:

Với tất cả điều này là thậm chí có thể viết các tiêu chuẩn mã hóa tốt để nắm bắt ý tưởng này?

Tôi tin rằng hướng dẫn và ví dụ PEP 8 thể hiện một tiêu chuẩn mã hóa tốt nắm bắt ý tưởng này. Vì vậy, có, tôi tin rằng nó có thể.


1
"Một người đọc nên được giả định là biết ngôn ngữ tốt hơn nhà văn" Tôi có một thời gian khó tin rằng đó là thái độ đúng đắn. Tôi có thể thấy giả sử họ biết nhiều , nhưng mỗi đội đều khác nhau và mỗi người trong một đội đều khác nhau, vì vậy một tuyên bố về vấn đề đặc biệt này có vẻ không khôn ngoan.
Bryan Oakley

4
Nếu không có hướng dẫn này, bạn sẽ có các lập trình viên cơ sở cam kết nhận xét giải thích mã tầm thường cho không ai ngoài chính họ và các lập trình viên midlevel sử dụng các giải pháp khó xử chỉ đơn giản để làm cho mã dễ tiếp cận hơn với các lập trình viên cơ sở. Hướng dẫn này giúp loại bỏ sự dư thừa và đảm bảo ngay cả một lập trình viên thành thạo vẫn tiếp tục cải thiện mã của họ. Khi tôi xem lại mã, tôi có thể đã quên ngữ cảnh, nhưng nói chung, tôi biết ngôn ngữ đang làm gì thậm chí còn tốt hơn so với khi tôi lần đầu tiên viết nó.
Aaron Hall

4

Tôi nghĩ rằng khi bạn thấy loại bình luận này và thỉnh thoảng tôi tự viết theo cách này, đó là vì tác giả đang viết thông số kỹ thuật trong các bình luận và sau đó đi qua và thực hiện từng bình luận.

Nếu chúng ta bị thách thức viết một tiêu chuẩn mã hóa tạo ra mã có thể hiểu được về chức năng cần thiết của nó hơn là chức năng thực sự của nó (để có thể phát hiện ra lỗi) thì chúng ta thực sự đang nói về cách các thông số kỹ thuật được xác định, ghi lại và liên kết với sản phẩm cuối cùng?

biên tập ----

Chỉ cần làm rõ. Tôi không nhận được bình luận so với tdd so với bài kiểm tra đơn vị nào tốt nhất. Hoặc đề xuất một nhận xét trên mỗi dòng là tốt / xấu

Tôi chỉ đề xuất một lý do mà bạn có thể thấy phong cách bình luận được nói đến trong ví dụ.

Và từ câu hỏi đó, liệu một tiêu chuẩn mã hóa về nhận xét sẽ thực sự được viết tốt hơn như là một yêu cầu tài liệu đặc tả của một số loại.

tức là các bình luận là để giải thích mục đích của mã, đó cũng là thông số kỹ thuật


6
Trong 20 năm, tôi chưa bao giờ thấy một số nguyên mẫu nhận xét nào đó mã của họ theo cách này sau đó điền vào các khoảng trống bằng mã thực tế. Đã có một cách khách quan để đạt được những gì bạn đang nói hoặc những gì tôi nghĩ bạn đang nói. Nó được gọi là Phát triển hướng thử nghiệm. Các bài kiểm tra đơn vị xác định thông số kỹ thuật và liệu mã có tuân thủ thông số đó không. Tất cả không có ý kiến.
Andrew T Finnell

9
Mặc dù tôi không nghĩ rằng mã trong câu hỏi là một ví dụ tốt về điều này, nhưng thực tế viết ra một quy trình trong các bình luận trước, sau đó quay lại và điền mã được gọi cụ thể trong "Hoàn thành mã" như một thực hành có thể để giúp tạo mã có thể đọc được, @AndrewTFinnell. Nó chắc chắn không phải là chưa từng nghe thấy, ngay cả khi nó nằm ngoài trải nghiệm của bạn.
Josh Caswell

6
cũng có trước tdd tôi tin
Ewan

2
Bạn đang nói về quá trình lập trình mã giả? Mục đích của việc đó là để giảm ý kiến. Tôi không bao giờ nhớ rằng cuốn sách nêu rõ các bình luận nên được để lại trong mã. Và bình luận để tạo ra một thủ tục khái niệm có nghĩa là cấp cao, không phải cấp thấp. Nếu một người bình luận mỗi dòng họ định viết thì họ có thể vừa viết những dòng đó. Ý tưởng là để tạo ra các nguyên tắc của mã không phải mỗi dòng. Cuốn sách không đề nghị bình luận mỗi dòng. Đó là trọng tâm của câu hỏi này. Và tôi có thể sai, nhưng tôi tin đó là phiên bản thứ hai.
Andrew T Finnell

2
@JoshCaswell & Ewan, vâng, đó một kỹ thuật từ nhiều năm trước và thực sự đã có trước TDD. Nhưng, bạn đã có ý định xóa các bình luận sau đó! Và TDD đã thay thế hoàn toàn nó như một cách hợp lý để tạo mã đáp ứng một thông số kỹ thuật.
David Arno

4

Với tất cả điều này là thậm chí có thể viết các tiêu chuẩn mã hóa tốt để nắm bắt ý tưởng này? Những người sẽ có liên quan trong đánh giá ngang hàng nhưng sẽ không biến thành một hoạt động kiểm tra danh sách vô nghĩa tạo ra các ghi chú không hữu ích hơn: "Bạn quên nhận xét về dòng 42".

Điều này rõ ràng vượt lên trên và vượt ra ngoài tài liệu - điều này chạm vào cách mã được cấu trúc, thuật toán nào được chọn, v.v. Nó thậm chí có thể chạm vào phân tích yêu cầu và thiết kế.

Quy tắc số 1 của tôi là "Đừng ghi lại tài liệu rõ ràng." Quy tắc số 2 là "Viết mã rõ ràng".

Đối với mã quan trọng về an toàn (mà tôi chưa bao giờ phải làm việc, cảm ơn Chúa), đây là một bước cần thiết nhưng không ở đâu đủ gần bước đầu tiên. Nó thậm chí có thể phải đi xuống để bắt buộc những tính năng ngôn ngữ nào phải tránh (Tôi đã thấy nhiều hơn một tiêu chuẩn bắt buộc "Bạn sẽ không sử dụng scanf( "%s", input ); vì bất kỳ lý do nào ").


Rõ ràng là trong mắt của kẻ si tình. Và thay đổi tùy thuộc vào thời hạn.
Tony Enni

3

Thực tiễn tốt nhất về mã tự viết tài liệu không phải là sự đồng thuận chính thống - trong khi có thể chấp nhận rộng rãi rằng mã dễ hiểu tốt hơn mã mật mã, không phải ai cũng đồng ý về việc mã có phức tạp phải luôn được cấu trúc lại hay không hoặc có thể bình luận không nó

Nhưng cuộc tranh luận này là về những đoạn mã khó hiểu - và bạn đang nói về việc bình luận từng dòng mã. Các dòng mã khó hiểu nên rất hiếm - nếu hầu hết các dòng của bạn phức tạp như thế này hơn là bạn đang lạm dụng một lớp lót thông minh và bạn nên dừng lại! Chắc chắn, đôi khi vai trò của một dòng có thể hơi khó hiểu, nhưng đó là vai trò trong bối cảnh của một đoạn mã lớn hơn - những gì chính dòng đó làm hầu như luôn luôn đơn giản.

Vì vậy, bạn không nên bình luận các dòng - bạn nên bình luận các đoạn mã. Nhận xét cụ thể có thể được đặt gần các dòng họ đề cập đến, nhưng những bình luận này vẫn đề cập đến mã lớn hơn. Họ không mô tả những gì / tại sao dòng này làm - họ mô tả những gì nó làm trong mã đó và / hoặc tại sao nó cần thiết trong mã đó.

Vì vậy, nó không phải là dòng nên được nhận xét mà là những đoạn mã lớn hơn. Mỗi đoạn mã nên được bình luận? Không. Harold Abelson nói rằng " Các chương trình phải được viết cho mọi người đọc và chỉ tình cờ cho các máy thực thi ". Nhưng ý kiến chỉ dành cho mọi người đọc - máy không thực thi chúng. Nếu các tiêu chuẩn mã hóa của bạn buộc phải viết bình luận dư thừa trên mỗi dòng / đoạn mã, bạn không chỉ gánh nặng cho nhà phát triển cần viết chúng - bạn cũng đang gánh nặng các nhà phát triển sẽ phải đọc chúng!

Đây là một vấn đề, bởi vì khi hầu hết các bình luận bạn đọc là dư thừa, bạn sẽ ngừng chú ý đến chúng (vì bạn biết chúng sẽ chỉ là rác dư thừa), và sau đó bạn sẽ bỏ lỡ các bình luận quan trọng . Vì vậy, tôi nói - chỉ viết bình luận quan trọng, để khi ai đó thấy một bình luận trong mã họ sẽ biết rằng thật đáng để đọc nó để hiểu mã.


1
Bỏ lỡ những ý kiến ​​quan trọng: +1. Câu bắt đầu: "Họ không mô tả" có thể sử dụng một số cấu trúc lại để làm cho nó dễ theo dõi hơn.
candied_orange

3

IMHO nó nên làm cả hai. Nhận xét mỗi dòng là ngớ ngẩn, bởi vì bạn kết thúc với các dòng như

  i++;    /* Increment i */

hoàn toàn không có manh mối về lý do tại sao bạn muốn tăng i. Mở rộng trên đó một chút và bạn có phong cách bình luận Doxygen điển hình, tạo ra một lượng lớn thông báo mà không cung cấp bất kỳ ý tưởng nào về mã này để làm gì hoặc cách thức hoạt động của nó. (Ít nhất là theo như tôi từng thấy: Tôi thừa nhận rằng có thể viết tài liệu hữu ích bằng cách sử dụng một hệ thống như vậy, nhưng tôi không nín thở.)

OTOH, nếu bạn viết một khối nhận xét tốt ở đầu hàm (hoặc bất kỳ nhóm nào là hợp lý), mô tả cả những gì cần hoàn thành và làm thế nào, nếu nó không rõ ràng, bạn có thứ gì đó hữu ích. Nếu là tôi, bạn thậm chí có thể bao gồm mã LaTeX cho các phương trình có liên quan hoặc tham chiếu đến các bài báo, ví dụ: "Điều này thực hiện sơ đồ WENO để giải phương trình Hamilton-Jacobi, như đã thảo luận trong ..."


2
+1 cho nhận xét doxygen: Đây chính xác là sự phản đối của tôi trong việc bao gồm "tài liệu" doxygen trong mã của tôi; 95% thời gian nó chỉ lặp lại những gì đã rõ ràng từ chữ ký hàm. Tôi cũng vậy, tôi chưa thấy một tài liệu doxygen nào có giá trị gì cả. Viết những bình luận đó làm lãng phí thời gian ba lần: Một lần để viết bình luận, một lần để đọc lại chúng và một lần để gỡ lỗi các vấn đề được tạo ra bởi nội dung bình luận cũ.
cmaster

1
Không phải bạn đang mâu thuẫn với chính mình? Tôi nghĩ rằng cả hai chúng ta đều đồng ý rằng việc một chức năng có một nhận xét mô tả những gì nó làm từ góc độ hộp đen là rất quan trọng - "các đầu vào này đi vào, chức năng thực hiện điều này và các đầu ra này xuất hiện". Nó tạo thành hợp đồng giữa người viết chức năng và người sử dụng chức năng. Mục đích của Doxygen chỉ đơn giản là chuẩn hóa định dạng của những bình luận đó theo cách có thể được phân tích cú pháp và có thể tìm kiếm / lập chỉ mục. Vậy tại sao bạn muốn có một "khối bình luận tốt" nhưng không muốn nó ở định dạng chuẩn, dễ đọc và dễ đọc?
Graham

Việc sử dụng một tiêu chuẩn nhận xét như JSDoc, JavaDoc và Doxygen có nghĩa là để cung cấp tài liệu có thể tìm kiếm và có thể đọc được của con người, như @Graham nói. Dòng mã được đề cập trong câu trả lời này không liên quan gì đến Doxygen. Tôi thậm chí không thể tưởng tượng được một bộ quy tắc được đặt ra để phân tích nhận xét đó và tạo ra một mục trong tài liệu xuất ra. Khi bạn xem Tài liệu cho JMI, Thư viện tiêu chuẩn Java, v.v ... tất cả chúng đều được sản xuất bằng một công cụ rất giống với Doxygen. Đó là mục đích của nó. Không phải những gì đã nói ở đây
Andrew T Finnell

Tôi không làm điều này - để đáp ứng yêu cầu của Canada, một công ty tôi làm việc đã yêu cầu các nhà phát triển viết một bộ xử lý trước có thêm nhận xét CHÍNH XÁC như ví dụ của OP. Tôi nghĩ rằng chúng tôi là "C THÊM 1 CHO TÔI" hoặc một số như vậy. Đó là FORTRAN, vì vậy các vòng lặp cũng được khen ngợi tương tự "C LOOP TỪ 1 ĐẾN 10". Các mã đã được LOADED với ý kiến ​​vô dụng. Tôi đã xóa tất cả những thứ nhảm nhí khi tôi duy trì mã. Không ai nói gì với tôi.
Tony Enni

2

Đã đến lúc đưa biểu đồ dòng chảy trở lại! (không thực sự nhưng chờ một phút)

Hôm trước tôi tìm thấy mẫu sơ đồ cũ của tôi. Tôi chỉ sử dụng nó cho bài tập về nhà và những trò đùa (bạn phải yêu một sơ đồ ngớ ngẩn tốt). Nhưng ngay cả vào thời điểm này, hầu hết các lập trình viên thương mại vẫn đang sử dụng biểu đồ luồng đều tự động tạo ra chúng từ mã (điều này hoàn toàn làm suy yếu mục đích ban đầu của sơ đồ, vốn là một trợ lý trong việc viết mã tốt hơn và khá hữu ích trong mã máy. Tuy nhiên, với các ngôn ngữ cấp cao hơn, sơ đồ quy trình đã thay đổi từ một cái nạng thành một trò chơi khăm. Tại sao? Sự trừu tượng của lưu đồ giống như mã. Các ý kiến ​​cho thấy có một sự lúng túng ở chỗ chúng có cùng mức độ trừu tượng như mã. Nhận xét tốt ở một mức độ trừu tượng khác với mã. Cách dễ nhất để làm điều này là sử dụng các nhận xét tại sao trong khi mã xử lý những gì.


Tôi rất tiếc phải thông báo cho bạn rằng sơ đồ không bao giờ biến mất.
Ant P

Nhận xét tốt ở mức độ trừu tượng khác với mã . Nghe nghe!
candied_orange

1
Mặc dù đây có thể là lời khuyên đúng đắn, nhưng dường như nó không giải quyết được câu hỏi đã được hỏi, ngoại trừ có lẽ chỉ một câu.
Bryan Oakley

0

Tôi sẽ trả lời câu hỏi như đã nêu:

Với tất cả điều này là thậm chí có thể viết các tiêu chuẩn mã hóa tốt để nắm bắt ý tưởng này?

Đúng. WYSIWYG. Một tiêu chuẩn mã hóa tốt theo nghĩa đen là " rõ ràng cho người đọc biết đoạn mã sau đây làm gì và tại sao ".

Nói cách khác, mã của tôi xem xét nhận xét về khả năng đọc mã theo nghĩa đen, 1-1, phát sinh từ trạng thái tinh thần của tôi về

Tôi, với tư cách là một người đọc, (tốt hơn, là một tiêu chuẩn tối thiểu, một mô hình tinh thần của một người đọc ít kinh nghiệm nhưng hợp lý), sẽ không hiểu mục đích hoặc phương pháp làm việc của mã sau đây

Nói chung, mọi người dễ dàng tham gia "điều này cần dễ đọc hơn" khi họ nghe "Tôi, với tư cách là một nhà phát triển cấp cao, người mà bạn hy vọng không bị câm, lúc đầu họ không hiểu mã này hoặc tại sao nó lại ở đó hay tại sao không, vì vậy nó cần được giải thích ".

Điều này chuyển bài diễn văn từ "bạn không tuân theo tiêu chuẩn vô nghĩa" sang "mã của bạn có sự thiếu hụt về khả năng đọc cụ thể dẫn đến vấn đề thực tế ".

Một tiêu chuẩn thứ hai cần được làm rõ ràng là "thử nghiệm khẩn cấp 2 giờ sáng".

Sao lưu của bạn, người không có kinh nghiệm với mã này, có thể tìm ra vấn đề với mã khi gỡ lỗi trong cuộc gọi cầu khẩn cấp sản xuất 2 giờ sáng, khi bạn đang đi nghỉ ở Chile Andes không có điện thoại di động?

Điều này nghe có vẻ chủ quan nhưng thực tế rất dễ đo lường: gọi một thành viên nhóm thiếu niên ngẫu nhiên, người được cho là sẽ gỡ lỗi vào ban đêm trong trường hợp khẩn cấp sản xuất và yêu cầu họ giải thích cách mã không được bình luận cụ thể hoạt động và tại sao nó lại hoạt động ở đó


0

Câu trả lời này bao gồm hầu hết các vấn đề, tuy nhiên có một điều quan trọng.

Tôi muốn nắm bắt một ý tưởng dọc theo các dòng: xem xét một nhận xét cho mọi dòng, trình tự, câu lệnh, phần, cấu trúc, chức năng, phương thức, lớp, gói, thành phần, ... của mã.

Có các công cụ để tạo tài liệu từ mã, ví dụ như doxygen. Nếu bạn sử dụng các công cụ như vậy, sẽ rất hợp lý khi bình luận các tệp, hàm, lớp, v.v. Ngay cả khi tên của hàm là tự giải thích, tôi vẫn đang làm điều đó cho thống nhất, bởi vì mọi người đọc tài liệu sẽ rất biết ơn.


1
Nhưng "tài liệu" được tạo ra bởi các công cụ như vậy, ít nhất là theo kinh nghiệm của tôi, nói chung có giá trị ít hơn không có tài liệu nào, bởi vì nó không cung cấp cho người dùng thông tin hữu ích (và khiến họ lãng phí thời gian để cố gắng trích xuất phần không phải thông tin tồn tại), nhưng đánh lừa các nhà phát triển nghĩ rằng họ đã ghi lại đúng mã của họ.
jamesqf

@jamesqf Có, khi một nửa các chức năng không được ghi lại và nửa còn lại rất tệ. Tuy nhiên, doxygen có thể tạo tài liệu khá tốt, giả sử các nhà phát triển đã nhận xét đúng chức năng, lớp của họ, v.v.
Bовић

-1

Nhiều câu trả lời hiện có rất chi tiết, nhưng tôi cảm thấy cần phải trả lời:

... [Ý kiến] sẽ có liên quan trong đánh giá ngang hàng nhưng sẽ không biến thành hoạt động trong danh sách kiểm tra thiếu suy nghĩ ...

Đối với tôi, những bình luận duy nhất có thể là một tiêu chuẩn có thể được trả lời bằng cách hỏi những bình luận nào được chú ý khi chúng bị thiếu . Nói cách khác: các bình luận được sử dụng bởi IDE hoặc phần mềm tài liệu.

Điều đó đang được nói, điều này là chủ quan đối với những công cụ được sử dụng bởi các nhà phát triển và không phải tất cả các bình luận được sử dụng bởi các phần mềm như vậy đều hữu ích như nhau .

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.