Một ngôn ngữ không cho phép bình luận mang lại mã dễ đọc hơn? [đóng cửa]


15

Vì tò mò, tôi bắt đầu tự hỏi liệu một ngôn ngữ không cho phép bình luận sẽ mang lại mã dễ đọc hơn vì bạn sẽ bị buộc phải viết mã tự nhận xét.

Sau đó, một lần nữa, bạn có thể viết mã xấu như trước vì bạn không quan tâm. Nhưng ý kiến ​​của bạn là gì?


44
Bạn có nghĩ rằng có một sự khác biệt giữa một ngôn ngữ không cho phép nhận xét và nhà phát triển không sử dụng chúng không?
Jeremy Heiler

21
Ý tưởng không cho phép bình luận sẽ buộc các nhà phát triển viết thêm mã tự viết tài liệu là vô lý.
Adam Crossland

2
@Jeff đó là một tính năng IDE / trình soạn thảo không phải là tính năng langugae IMHO
jk.

4
Tôi không chắc có thể buộc các nhà phát triển làm bất cứ điều gì
jk.

2
@Adam @ jk01: họ thậm chí có một ngôn ngữ buộc các nhà phát triển phải thụt mã theo một cách cụ thể ;-)
Joris Meys

Câu trả lời:


61

Tôi nghĩ rằng các lập trình viên sẽ tìm ra một cách khác để thêm ý kiến ​​...

string aComment = "This is a kludge.";

7
Tôi thích cách "bình luận" này có nhiều lớp
Logan Capaldo

29
Một lợi ích bổ sung là nó sẽ đi trong nhị phân, vì vậy bạn cũng có thể thấy các bình luận ở đó! Làm cho kỹ thuật đảo ngược đơn giản hơn nhiều.

1
Bạn đúng. Thay vào đó, chúng tôi phải sử dụng các câu lệnh #ifdef.
James

9
Đây có lẽ là ví dụ tốt nhất về "lập trình thành ngôn ngữ" trái ngược với "lập trình bằng ngôn ngữ" mà tôi từng thấy. =)
gablin

2
Trong MOO có hỗ trợ cho các bình luận, nhưng tất cả các chương trình được phân tích cú pháp để lưu trữ và không được hiển thị để hiển thị để các bình luận bị mất. Thành ngữ cho những bình luận dai dẳng là chuỗi ký tự ala"this is a comment";
Ben Jackson

44

Tôi không nghĩ nó đơn giản:

ngay cả trong mã được viết tốt, tự viết tài liệu, có những tình huống hợp pháp mà bạn nên viết bình luận.


13
+1 cho các bình luận không chỉ là lời tường thuật đơn giản về những gì mã đang làm. Ngay cả "mã tự viết tài liệu" tốt nhất cũng cần phải có ý kiến ​​để xây dựng nhiều thứ. Thông thường, mã sẽ có các phụ thuộc bên ngoài, các giả định đầu vào, cảnh báo, các khu vực có thể ứng biến, các lỗ hổng đã biết và vô số điều khác không bao giờ được thừa nhận. Bình luận có nhiều công dụng.
Adam Crossland

3
Chính xác. Làm thế nào để bạn đăng ký "ý định" hoặc "tại sao" hoặc "bằng chứng chính xác" mà không có ý kiến?
S.Lott

2
Đồng ý, ý kiến ​​nên là "Tại sao" chứ không phải "Cái gì". Bất cứ ai không thể nhận được những gì từ mã không nên đọc nó.
Matthew Đọc

3
@Matthew: Để công bằng, bạn có thể dễ dàng viết mã không dễ giải mã. Nhưng vâng, mã có thể đọc được là nguồn tốt nhất cho "cái gì".

14

Giả sử bạn là một lập trình viên hoàn hảo (mà bạn thì không, nhưng hãy giả sử) ...

Có rất nhiều hiệu ứng không rõ ràng có thể xảy ra trong mã khi bạn can thiệp vào nội dung bạn không viết. Ví dụ: có thể có lỗi thiết kế thư viện của người khác hoặc (nếu bạn là nhà phát triển nhân) trong phần cứng của người khác. Có ý kiến ​​để giải thích lý do tại sao bạn sử dụng loại bùn cụ thể ở một nơi cụ thể có thể là điều cần thiết để hiểu mã và đảm bảo rằng loại bỏ bùn không bị loại bỏ (phá vỡ mọi thứ).


11

Thật khó cho tôi để bao bọc tâm trí của tôi xung quanh ý tưởng rằng việc loại bỏ các tùy chọn khỏi một ngôn ngữ bằng cách nào đó sẽ làm cho các chương trình được viết bằng ngôn ngữ nói tốt hơn. Nhận xét là không bắt buộc, và viết mã tài liệu tự cũng không phải là tốt.

Không có thay thế cho thực hành phát triển tốt.


6

Về lý thuyết, ban đầu , COBOL được thiết kế theo cách nó có nghĩa là tự ghi chép đủ để ngay cả những người không phải là nhà phát triển (tức là người giám sát) có thể xem lại mã được viết và xác định điều gì đang xảy ra. Tuy nhiên, trong thực tế, khi một chương trình phát triển phức tạp hơn, thật khó để hiểu mọi thứ đang diễn ra chỉ thông qua mã.

Trong khi loại bỏ ý kiến có thể buộc một số nhà phát triển để viết mã đó là tốt hơn ở bản thân tài liệu, vẫn còn phát triển ra khỏi đó mà viết giấy tờ kém mã (tức là tên biến của a, b, c, vv) và nó là những thói quen mà mọi người cần phải được đào tạo ra của Trong những trường hợp đó, việc xóa các bình luận sẽ không ảnh hưởng đến các nhà phát triển đó và có thể cản trở nỗ lực của các nhà phát triển khác để giải thích các đoạn mã phức tạp.


1
Bây giờ tôi đang đọc một số mã với điều này: argument = 3.0; aa = sqrt( argument ); bb = f( aa ); Thở dài.
S.Lott

Cobol là một ngôn ngữ đặc biệt. Nhưng "." Toán tử là ác !!! Nó loại phá vỡ cú pháp của một câu.
Loïc Faure-Lacroix

3

Mỗi chương trình được viết để thực hiện các yêu cầu chức năng nằm ngoài chương trình, cho dù được viết ra hoặc chỉ trong đầu của ai đó.

Tôi nghĩ rằng chức năng thiết yếu nhất của các bình luận là thiết lập ánh xạ giữa các yêu cầu và mã. Lý do ánh xạ là cần thiết để cho phép thay đổi gia tăng. Khi một sự thay đổi đối với các yêu cầu xảy ra, cần phải thực hiện các thay đổi tương ứng với mã, nếu mã đó vẫn là một giải pháp cho các yêu cầu. Các ý kiến ​​phục vụ như một lộ trình cho những thay đổi.

Nếu ngôn ngữ là ngôn ngữ lý tưởng dành riêng cho miền (DSL) lý tưởng phù hợp hoàn hảo với vấn đề đang được giải quyết, thì ánh xạ phải là một đẳng cấu đơn giản và không cần thiết phải bình luận. Mã nguồn chỉ đơn giản là nêu vấn đề, và không có gì khác cần phải nói. Giải pháp của vấn đề sẽ bị chôn vùi trong việc thực hiện ngôn ngữ.

Vì các ngôn ngữ chúng tôi làm việc không phải là DSL như vậy và sẽ duy trì như vậy trong một thời gian, chúng tôi vẫn cần nhận xét . Đó là vấn đề bằng cấp. Đôi khi vấn đề là một kết hợp tốt với ngôn ngữ trong tay, nhưng thường thì không.

Xem thêm...


2

Tôi làm việc ở đâu đó không cho phép nhận xét nội tuyến (nghĩa là bạn chỉ có thể có nhận xét ở đầu chức năng). Không, nó không làm cho mã dễ đọc hơn. Nó làm cho nó trật tự cường độ tồi tệ hơn.


Giả sử không có giới hạn về số lượng phương thức, tại sao bạn không cấu trúc lại các khối mã của mình thành các phương thức áp dụng và sau đó đưa ra các phương thức mô tả tên (hoặc nhiều nhận xét hơn, trong trường hợp của bạn)? Trong hầu hết các mã "tốt" mà tôi đã thấy, các phương thức hiếm khi dài hơn khoảng 10 dòng và nó khá rõ ràng về những gì nó làm.
Scott Whitlock

@Scott - Tôi là một người ủng hộ chắc chắn rằng mã nên được tự ghi lại và những bình luận nội tuyến cần phải tránh, nhưng rõ ràng cấm chúng là quá mức cần thiết.
Jason Baker

@Jason - Tôi đồng ý với bạn, nhưng tôi không đồng ý với ý kiến ​​cho rằng nếu không có bình luận nội tuyến thì đó là "đơn đặt hàng có cường độ tồi tệ hơn".
Scott Whitlock

@Scott: Bạn nhận được rất nhiều bình luận như "lý do chúng tôi thực hiện kiểm tra null kỳ lạ trên dòng 37 là ..." và sau đó bạn phải đảo mắt giữa mã và các bình luận. Sẽ dễ dàng hơn nhiều nếu chỉ có nhận xét đó ở trên dòng 37.
Xodarap

2

Tôi tránh nhận xét mã, và nó hoạt động.

Tôi tránh tất cả các nhận xét trong mã (nội tuyến hoặc luồng) có lợi cho docblock + varables có ý nghĩa + lập trình spartan và nó hoạt động.

Và vâng, tôi biết docblocks là các bình luận về mặt kỹ thuật, tuy nhiên, chúng thực sự bổ sung cho mã, không xâm phạm và "chuẩn hóa" ... tất cả mọi thứ mà một bình luận chung không có.

Những gì tôi nghĩ có thể làm việc thay thế cho các bình luận: một ngôn ngữ / cú pháp / thành ngữ docblock được tiêu chuẩn hóa, một cái gì đó giống như các chú thích trong java.


"một ngôn ngữ / cú pháp / thành ngữ docblock được chuẩn hóa": Sẽ không doxygenhoạt động cho việc này? vi.wikipedia.org/wiki/Doxygen
sleske

Doxygen là một công cụ tài liệu, giống như phpdocumentor và là thứ tạo ra tài liệu Java từ javadoc (homonim?). Ý tôi là ngôn ngữ / cú pháp / thành ngữ là một phần của chính ngôn ngữ lập trình và không phải là một nhận xét phải được phân tích cú pháp cho các thẻ / thuộc tính.
dukeofgaming

4
Vì vậy, bạn tránh bình luận bằng cách gọi cho họ một cái gì đó khác.
Nate CK

2

Nó không chỉ không ảnh hưởng đến chất lượng - như những người khác đã quan sát, nó thực sự sẽ gây phiền nhiễu.

Tôi chắc chắn rằng hầu hết chúng ta thỉnh thoảng đã làm một cái gì đó như thế này:

foreach ( myObject obj in SomeList )
 {
    Debug.Writeline( obj.Name );
//  for some reason this isn't working
//  obj.SetArielPotency( setting );
//  obj.DoSomeProcess();       
 }

Sẽ khó chịu đến mức nào nếu bạn không thể bình luận một vài dòng mã để tìm ra lỗi đó đến từ đâu?

Bất kể ý kiến ​​về cách mã hoạt động, những điều thực tế đơn giản như thế hoặc bỏ vào một TODOghi chú thuận tiện là những điều giúp dễ dàng khắc phục các vấn đề nhỏ hơn và nhớ những gì chúng tôi đã làm khi bắt đầu viết mã.


1

Bình luận giống như một cuốn sách tóm tắt. Chắc chắn, bạn có thể hiểu mọi thứ bằng cách đọc mã, nhưng tại sao bạn muốn đọc cả một trang khi nó có thể được tóm tắt trong một dòng nhận xét?


3
Nếu bạn có thể tóm tắt nó trong một dòng, bạn có thể đặt tên cho một hàm hoặc phương thức đủ để mô tả những gì nó làm.
Scott Whitlock

1

Mặc dù tôi đồng ý với các câu trả lời khác mà ngay cả mã tự viết tài liệu cũng cần bình luận, nhưng điều đó chỉ phù hợp với các ngôn ngữ hiện tại .

Tôi nghĩ câu hỏi thực sự là "Có thể thiết kế một ngôn ngữ lập trình mới mà không cần bình luận không?" Nó sẽ cần phải ở mức khá cao với sự trừu tượng lớn. Mọi câu lệnh và hàm sẽ bị buộc phải đọc được thông qua cú pháp của ngôn ngữ.


1
Lập trình biết chữ cung cấp một ngôn ngữ không cần bình luận. Bạn viết tài liệu của bạn, bao gồm tất cả các giải thích cần thiết, hỗ trợ, bằng chứng, ý định, đánh đổi, loại bỏ, v.v., cũng như mã. Vì mã không có ý định đứng một mình, nó hoạt động độc đáo.
S.Lott

@DisgrunteldGoat: quên điều đó đi. Bạn sẽ phải bắt đầu từ một ngôn ngữ cụ thể và tôi chỉ nói 5. Tất cả các ngôn ngữ còn lại tôi sẽ bị mất như bạn sẽ nói bằng tiếng Hà Lan.
Joris Meys

Đoạn thứ hai: tất nhiên bạn có thể. Lấy tất cả các ngôn ngữ hiện tại cung cấp hỗ trợ bình luận và xóa hỗ trợ bình luận. Nếu những ngôn ngữ này cần bình luận, thì chúng sẽ nằm trong mã được biên dịch hoặc trình thông dịch sẽ làm một cái gì đó ngoài việc bỏ qua chúng.
Bộ

1

Lập trình viên vô kỷ luật sẽ viết mã xấu, bất kể ngôn ngữ.

Hấp dẫn rằng con trăn, vốn chỉ có quyền riêng tư theo quy ước (tiền tố _), không thực hiện bất kỳ nỗ lực nào để cảnh sát điều này, và nhiều mã tốt vẫn đang được viết.

Rant: Đôi khi tôi nghĩ rằng các langug dễ dãi hơn sẽ buộc nhiều người phải học cách viết mã đúng hơn là ngược lại (tức là chỉ có một chiều của Java và bạn sẽ bị nguyền rủa nếu bạn muốn nghĩ về các hàm như các đối tượng hạng nhất).


1

Tôi sẽ đoán: có lẽ là không. Tại sao? Bởi vì bạn phải mã hóa "tại sao" như một chủ nghĩa hình thức trong ngôn ngữ và bởi vì "tại sao", dù được mã hóa bằng ngôn ngữ hay nhận xét bằng ngôn ngữ đều bị các lập trình viên sử dụng.


1

Mã chắc chắn có thể tự nhận xét trong việc giải thích những gì nó đang làm, nhưng không phải lúc nào mã cũng có thể giải thích tại sao nó lại làm như vậy. Đó là nơi bình luận là cần thiết nhất.

Nếu, ví dụ, một phần của mã là cần thiết để tuân thủ một quy định cụ thể, làm thế nào để bạn giải thích điều đó mà không có nhận xét? Nếu thuật toán được sử dụng bởi một đoạn mã cụ thể được mô tả trong một bài báo được viết vào năm 1998 bởi M. Matsumoto và T. Nishimura, làm thế nào để bạn giải thích điều đó mà không có nhận xét? Nếu một thuật toán không cung cấp chính xác chức năng tối ưu nhưng tạo ra sự thỏa hiệp rất cụ thể có thể gây ra các vấn đề trong tương lai nếu mã khác bị thay đổi, làm thế nào để bạn giải thích điều đó mà không có nhận xét?

Điều gì xảy ra nếu một phần mã được kiểm toán bởi một kiểm toán viên độc lập để nó không thể được sửa đổi mà không làm mất hiệu lực kiểm toán đó và mã được sử dụng để xây dựng một sản phẩm có sự tuân thủ với kiểm toán đó được yêu cầu bởi khách hàng của bạn. Làm thế nào để bạn chỉ ra rằng không có bình luận?


0

Tôi đã luôn nghĩ rằng thật tuyệt khi có một bình luận một từ để nếu bạn đặt trước một từ có ký hiệu (giả sử là dấu hai chấm), từ đó sẽ bị bỏ qua. Bằng cách đó, bạn có thể nói một điều khó hiểu là nó chỉ cho phép nhận xét một từ trong một biểu thức s. Chẳng hạn, bạn có thể biến điều này:

(if (= x y)
    x
    y)

... vào đây:

(if (= x y)
    :then x
    :else y)

Nếu bạn hoàn toàn phải làm, bạn có thể xâu chuỗi nhiều bình luận một từ để tạo thành một bình luận nội tuyến:

(if x :Remember, :x :could :be :nil!
    ...)

Tất nhiên, đây là một nỗi đau để loại. Trong thực tế, đó là điểm. Nó khuyến khích bạn sử dụng các bình luận nội tuyến một cách tiết kiệm và giữ cho chúng ngắn gọn và đi vào điểm chính. Nhưng tôi có cảm giác rằng tôi có một thời gian khó thuyết phục bất cứ ai sử dụng ngôn ngữ.


Nó cũng làm cho nó khó đọc, đánh bại việc sử dụng các bình luận để làm cho mã dễ đọc hơn.
Nate CK

0

Đây là hai hoặc không có gì. Một số lập trình viên không làm gì để mã có thể đọc được. Không cho phép bình luận sẽ củng cố điều này. Một số lập trình viên viết bình luận tốt, ngay cả khi họ thậm chí còn tốt hơn nếu họ tái cấu trúc mã thay vì nhận xét - xóa bình luận có thể buộc họ thực hiện tái cấu trúc tốt hơn.

Lý do tại sao đây là một ý tưởng tốt: - Không

Lý do tại sao đây là một ý tưởng tồi: - Có nhiều lập trình viên tàn bạo hơn các lập trình viên giỏi nhưng không tuyệt vời - Hầu như luôn luôn có một số nhận xét cho các vấn đề kỳ lạ, tóm tắt, v.v. - Ngay cả khi bạn tránh nhận xét, bạn có thể sẽ sử dụng nhận xét như một giai đoạn trên đường: gửi bình luận khi bạn đang viết một cái gì đó, và sau đó quay lại và tái cấu trúc nó đi. Nhưng bạn không thể luôn làm điều đó ngay lập tức vì bạn vẫn đang học. - Nó sẽ khuyến khích mọi người làm việc quanh nó - Ai sẽ sử dụng nó? Những người viết mã không thể đọc được và muốn một cái cớ (xấu) và những người đã say mê ý tưởng (những người chỉ có thể "không viết bình luận" để bắt đầu). Nếu đây là những gì bạn muốn, chỉ cần viết một tiêu chuẩn mã hóa cho thấy bạn muốn mọi người làm điều đó như thế nào.

Những lý do mà điều này có thể có liên quan - Trường hợp có thể hữu ích là một phần của hệ thống để làm cho "không bình luận" tốt hơn, ví dụ: một ngôn ngữ hoặc IDE có sự hỗ trợ tốt cho một cái gì đó tốt hơn bình luận và là một phần của bình luận, eschews bình luận. Tôi không biết nó sẽ hoạt động như thế nào, nhưng đó là một điểm tốt đáng để suy nghĩ.

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.