Một điều chưa ai đề cập đến, vì vậy tôi sẽ đề cập đến nó: Mong muốn lồng ý kiến thường chỉ ra rằng lập trình viên đang làm sai.
Đầu tiên, chúng ta hãy đồng ý rằng lần duy nhất "lồng" hoặc "không lồng" được hiển thị cho lập trình viên là khi lập trình viên viết một cái gì đó có cấu trúc như thế này:
do_something();
/* comment /* nested comment */ more comment */
do_something_else();
Bây giờ, khi một điều như vậy xuất hiện trong thực tế? Chắc chắn lập trình viên sẽ không viết những bình luận lồng nhau mà theo nghĩa đen giống như đoạn trích trên! Không, trong thực tế khi chúng ta lồng ý kiến (hoặc ước chúng ta có thể lồng chúng), đó là vì chúng ta muốn viết một cái gì đó như thế này:
do_something(); /* do a thing */
/* [ajo] 2017-12-03 this turned out to be unnecessary
do_something_else(); /* do another thing */
*/
Và đây là BAD. Đây không phải là một mô hình mà chúng tôi (như các nhà thiết kế ngôn ngữ) muốn khuyến khích! Cách chính xác để viết đoạn trích trên là:
do_something(); /* do a thing */
Mã "sai" đó, bắt đầu sai hoặc bất kể đó là gì, không thuộc về cơ sở mã. Nó thuộc về, tốt nhất, trong lịch sử kiểm soát nguồn. Lý tưởng nhất là bạn sẽ không bao giờ viết mã sai để bắt đầu, phải không? Và nếu mã sai đang phục vụ một mục đích ở đó, bằng cách cảnh báo các nhà bảo trì không khôi phục nó vì một lý do nào đó, thì đó có lẽ là một công việc cho một nhận xét mã được viết tốt và có chủ ý. Cố gắng diễn đạt "không làm X" bằng cách chỉ để lại một số mã cũ làm X, nhưng nhận xét, không phải là cách dễ đọc hoặc hiệu quả nhất để ngăn mọi người làm X.
Tất cả điều này rút ra một quy tắc đơn giản mà bạn có thể đã nghe trước đây: Đừng bình luận ra mã. (Đang tìm kiếm các cụm từ này sẽ bật lên một nhiều của ý kiến trong thỏa thuận .)
Trước khi bạn hỏi: có, các ngôn ngữ như C, C # và C ++ đã cung cấp cho lập trình viên một công cụ khác để "nhận xét" các khối mã lớn : #if 0
. Nhưng đây chỉ là một ứng dụng cụ thể của bộ tiền xử lý C, đây là một công cụ lớn và hữu ích theo đúng nghĩa của nó. Nó thực sự sẽ vô cùng khó khăn và đặc biệt đối với một ngôn ngữ để hỗ trợ biên dịch có điều kiện #if
mà không hỗ trợ #if 0
.
Vì vậy, chúng tôi đã thiết lập rằng các bình luận lồng nhau chỉ có liên quan khi lập trình viên đang bình luận ra mã; và chúng tôi đã thành lập (thông qua sự đồng thuận của rất nhiều lập trình viên có kinh nghiệm) rằng nhận xét mã là một điều xấu.
Để hoàn thành tam đoạn luận, chúng ta phải chấp nhận rằng các nhà thiết kế ngôn ngữ có mối quan tâm đến việc quảng bá những điều tốt và làm nản lòng những điều xấu (giả sử rằng tất cả những thứ khác đều bằng nhau).
Trong trường hợp các bình luận lồng nhau, tất cả các bình luận khác đều bằng nhau - bạn có thể bỏ qua các câu trả lời được bỏ phiếu thấp một cách an toàn cho rằng phân tích cú pháp lồng nhau /*
sẽ gây khó khăn cho trình phân tích cú pháp. (Lồng nhau /*
không khó hơn lồng nhau (
, điều mà gần như mọi trình phân tích cú pháp trên thế giới đã cần xử lý.)
Vì vậy, tất cả những thứ khác đều bằng nhau, một nhà thiết kế ngôn ngữ có thể dễ dàng lồng các bình luận (nghĩa là để nhận ra mã), hay khó? Hãy nhớ lại rằng bình luận ra mã là một điều xấu.
QED
Chú thích. Lưu ý rằng nếu bạn không cho phép các bình luận lồng nhau, thì
hello /* foo*/bar.txt */ world
là một "bình luận" sai lệch - nó tương đương với
hello bar.txt */ world
(có khả năng là một lỗi cú pháp). Nhưng nếu bạn làm phép bình luận lồng nhau, sau đó
hello /* foo/*.txt */ world
là một "bình luận" sai lệch - nó tương đương với
hello
nhưng để bình luận mở hết cỡ đến cuối tập tin (một lần nữa gần như chắc chắn là lỗi cú pháp). Vì vậy, không có cách nào đặc biệt ít bị lỗi cú pháp không chủ ý. Sự khác biệt duy nhất là cách họ xử lý các phản hạt có chủ ý của mã nhận xét.