Làm thế nào để giải quyết vấn đề bình luận lồng nhau


23

Nó xuất hiện không chỉ trong một ngôn ngữ mà các bình luận không thể được lồng vào nhau. Bạn có một giải pháp tốt cho vấn đề này? Một cách giải quyết khác trong C / C ++ và Java là chỉ sử dụng nhận xét một dòng nhưng sau đó không thể nhận xét một khối lớn hơn. Tôi đang đối mặt với một cái gì đó như thế này:

</li><!--
                <li><!-- Save -->

Vì vậy, tôi phải tự đi qua và chỉnh sửa các ý kiến. Bạn có thể tư vấn làm thế nào chúng ta nên xử lý việc này, bằng nhiều ngôn ngữ? Tôi không chắc chắn nhưng có lẽ python có một giải pháp cho vấn đề này với '''cách có thể bao gồm một #nhận xét trong python? `


4
Tôi nghĩ rằng chỉ có biên tập viên có thể giúp bạn ở đó. IDLE sẽ chặn bình luận cho bạn trên Python IIRC.
Erik Reppen

7
Python không có bình luận khối . Các '''"""chuỗi literals . Điều xảy ra là trình thông dịch sẽ đánh giá chúng trong quá trình biên dịch (sang mã byte) và nhận ra chuỗi ký tự là không có op (do đó chúng không làm chậm thời gian thực hiện / tải mã byte). Các tài liệu, nghĩa là chuỗi ký tự ngay sau một defnhưng trước phần thân, không bị tước đi vì trình thông dịch giả định rằng họ cung cấp tài liệu cho hàm.
Bakuriu

7
Trong C / C ++ nếu bạn muốn xóa các phần lớn bạn sử dụng #if 0<code> #endif. Vì vậy, đây không thực sự là một vấn đề. Sử dụng ý kiến ​​để làm điều này là công cụ sai.
Martin York

1
Tôi đã chuyển sang sử dụng chỉ nhận xét dòng từ lâu (miễn là tôi không bị ép buộc, ví dụ Javadoc). Tất nhiên, bạn cần hỗ trợ biên tập viên (hoặc ít nhất là chế độ cột).
ziggystar

Câu trả lời:


46

Rõ ràng, giải pháp tốt nhất là không lồng ý kiến ​​của bạn. Bình luận lồng nhau thường là một dấu hiệu cho thấy bạn đang sử dụng bình luận sai. Ví dụ phổ biến nhất là mã nhận xét có chứa chính nhận xét và cách khắc phục là xóa mã thay vì nhận xét.

Điều đó nói rằng, nhiều ngôn ngữ lập trình có nhiều hơn một loại cú pháp nhận xét và bạn có thể sử dụng thực tế này để lồng sâu ít nhất một cấp độ. Ví dụ: trong Java:

/* This is commented out!
Foo.bar.baz();
// And now for something completely different...
Quux.runWith(theMoney);
*/

Ngoài ra, trong nhiều ngôn ngữ, ít nhất một loại bình luận là loại có thể lồng nhau; trong các ngôn ngữ giống như C, các bình luận dòng bên trong các bình luận dòng bị bỏ qua:

// some_commented_out(code);
// // This is a comment inside the comment!
// // Still inside the nested comment.
// some_more_code_in(outer_comment);

Hầu hết các IDE đều hỗ trợ bình luận toàn bộ các khối mã với các bình luận dòng trong một hành động và chúng xử lý kiểu nhận xét này một cách chính xác. Ví dụ tương tự trong Python:

# some_commented_out(code)
# # This is a comment inside the comment!
# # Still inside the nested comment.
# some_more_code_in(outer_comment)

Thông thường, các tiêu chuẩn mã hóa cho một dự án cụ thể có các quy tắc về việc sử dụng kiểu bình luận nào khi nào; một quy ước chung là sử dụng các nhận xét khối ( /* */) cho tài liệu phương thức và lớp và nhận xét nội tuyến ( //) cho các nhận xét bên trong các thân phương thức và như vậy, ví dụ:

/**
 * Helper class to store Foo objects inside a bar.
 */
public class Foobar {
    /**
     * Stores a Foo in this Foobar's bar, unless the bar already contains
     * an equivalent Foo.
     * Returns the number of Foos added (always 0 or 1).
     */
    public int storeFoo(Foo foo) {
        // Don't add a foo we already have!
        if (this.bar.contains(foo)) {
            return 0;
        }
        // OK, we don't have this foo yet, so we'll add it.
        this.bar.append(foo);
        return 1;
    }
}

Với phong cách như vậy, chắc chắn bạn sẽ không cần phải lồng /* */ý kiến ​​(nếu bạn phải tạm thời vô hiệu hóa toàn bộ phương thức hoặc lớp, đổi tên chúng hoạt động tốt như vậy, nếu không tốt hơn); và các //bình luận làm tổ, ít nhất là với một chút trợ giúp từ IDE của bạn.

Cuối cùng, để vô hiệu hóa mã, bạn có các tùy chọn khác trong nhiều ngôn ngữ lập trình; ví dụ, trong C, bạn có thể tận dụng bộ tiền xử lý:

this_is(activated);
#if 0
this_is(!activated);
/* Comments inside this block don't really nest, they are simply removed
   along with the rest of the block! */
#endif

Trong các ngôn ngữ động, bạn thường chỉ có thể sử dụng các ifcâu lệnh thông thường thay thế:

<?php

if (0) {
   // This should never run... 
   some_stuff_that_should_never_run();
}

Tuy nhiên, không giống như ví dụ CPP, chiến lược này yêu cầu toàn bộ tệp nguồn phải có giá trị về mặt cú pháp, do đó, cho đến nay nó không linh hoạt.

Và cuối cùng, có ít nhất một số ngôn ngữ cho phép bình luận lồng nhau. Trong trường hợp bạn quan tâm, wikipedia có một biểu đồ so sánh đẹp .


2
một số biến thể của SQL cho phép bình luận lồng nhau?
Xavier Combelle

3
+1 cho// And now for something completely different...
Vorac

1
@Vorac: rất vui vì bạn thích tài liệu tham khảo: D
tdammers

18

C và C ++ có một bình luận khối lồng nhau:

#if 0
#endif

Nhiều biên tập viên nổi bật hiểu điều này như một bình luận và nhiều người khác ít nhất sẽ làm nổi bật nó như bất kỳ mã bị vô hiệu hóa có điều kiện nào khác.

Trong nhiều ngôn ngữ khác, bạn phải dựa vào hỗ trợ biên tập viên. Đối với các ngôn ngữ chỉ có nhận xét dựa trên dòng (perl, python, ruby, shell ...) khá đơn giản để thêm ký tự nhận xét cho tất cả các dòng trong một phạm vi, vì vậy hầu hết các biên tập viên có thể làm điều này. Bạn vẫn có thể cho biết những gì đã được bình luận trước khi bình luận toàn bộ khối vì nhân vật bình luận được nhân đôi - làm điều đó đơn giản là lợi thế ở đây.

XML và SGML có lẽ là nỗi đau lớn nhất, định nghĩa nhận xét của nó chỉ là ngu ngốc. Các bình luận sẽ là tầm thường để làm tổ, nhưng chúng không chỉ không, nó hoàn toàn bị cấm để có --bình luận bên trong. Thật không may, tôi không biết trình soạn thảo nào có hỗ trợ tốt để bình luận trong SGML / XML.


2
Không bao giờ nghĩ về việc sử dụng các chỉ thị tiền xử lý như là ý kiến ​​thực tế. Thật thú vị, cũng cho C #, nhưng trong trường hợp đó, bạn sẽ phải làm một cái gì đó giống như #if _hoạt động tốt và bị mờ đi trong VS của tôi với Re #. Mẹo hay!
Nỗi sợ hãi tuyệt vọng

2

Mặc dù không phải là một giải pháp chung và chắc chắn không lý tưởng, một cách để giải quyết vấn đề cụ thể này là sử dụng ngôn ngữ xử lý mẫu phía máy chủ để thực hiện chặn nhận xét cho các thành phần nhận xét mã lồng nhau. Điều này về cơ bản giữ nguyên nội dung, nhưng ngăn việc gửi nó đến trình duyệt máy khách.

Điều đó không giúp được gì nhiều nếu tập tin là nội dung thẳng và thuần túy không yêu cầu xử lý phía máy chủ nào khác. Trong trường hợp đó và trường hợp chung hơn của các bình luận lồng nhau, hãy hỏi tại sao bạn muốn làm điều đó. Trong hầu hết các trường hợp đó, người ta có thể thấy rằng cách tốt nhất để xử lý nó là không xử lý tất cả. Nói cách khác, nếu bạn muốn loại bỏ một phần, sau đó loại bỏ nó và để cho kiểm soát phiên bản xử lý việc ghi nhớ sự khác biệt nếu phần đó như một vật phẩm cần phải được phục hồi.


0

Trong trường hợp HTML / XML, bạn có thể sử dụng một hướng dẫn xử lý không tồn tại: xem câu trả lời của tôi về SO

<?ignore
  <band height="20">
    <staticText>
      <reportElement x="180" y="0" width="200" height="20"/>
      <text><![CDATA[Hello World!]]></text>
    </staticText>
  </band>
?>
</detail>

0

Swift hỗ trợ các bình luận lồng nhau để "nó xuất hiện không chỉ trong một ngôn ngữ mà các bình luận không thể được lồng" không còn là một tuyên bố đúng. Nếu bạn không hài lòng với việc thiếu hỗ trợ cho các nhận xét lồng nhau trong ngôn ngữ lập trình của mình, tôi khuyên bạn nên thử Swift.

/* This is the start of the first multiline comment.
 /* This is the second, nested multiline comment. */
 This is the end of the first multiline comment. */

Ngôn ngữ lập trình Swift: Khái niệm cơ bản


0

Ngôn ngữ lập trình D có các bình luận lồng nhau được xây dựng trong:

/+ This is a nested comment 
  /+ This is part of that a comment +/
  /* So is this */
+/
/+ /* This is another nested comment */ +/
/* /* This is not a nested comment */

Nói cách khác, /++/ý kiến ​​tổ.

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.