Как решить проблему вложенных комментариев


23

По-видимому, не на одном языке комментарии не могут быть вложенными. У вас есть хорошее решение этой проблемы? Одним из обходных путей в C / C ++ и Java является использование только однострочного комментария, но тогда становится невозможным закомментировать больший блок. Я сталкиваюсь с чем-то вроде этого:

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

Поэтому я должен вручную пройти и отредактировать комментарии. Можете ли вы посоветовать, как мы должны справиться с этим, на многих языках? Я не уверен, но, возможно, у python есть решение для этого '''путем, который мог бы включать #комментарий в python? `


4
Я думаю, что только редакторы могут помочь вам там. IDLE будет блокировать комментарии для вас на Python IIRC, хотя.
Эрик Реппен

7
Python не имеет блочных комментариев . Символы '''и """являются строковыми литералами . Бывает, что интерпретатор оценивает их во время компиляции (для байт-кода) и распознает строковые литералы как no-ops (следовательно, они не замедляют время выполнения / загрузки байт-кода). Строки документов, то есть строковые литералы сразу после, defно перед телом, не удаляются, поскольку интерпретатор предполагает, что они предоставляют документацию для функции.
Бакуриу

7
В C / C ++, если вы хотите удалить большие разделы, вы используете #if 0<code> #endif. Так что это на самом деле не проблема. Использование комментариев для этого - неправильный инструмент.
Мартин Йорк

1
Я давно перешел на использование только строковых комментариев (до тех пор, пока меня не принуждают, например, Javadoc). Конечно, вам нужна поддержка редактора (или хотя бы режим колонок).
Ziggystar

Ответы:


46

Лучшее решение, очевидно, просто не вкладывать свои комментарии. Вложенные комментарии обычно являются признаком того, что вы используете комментарии неправильно. Наиболее распространенным примером является закомментированный код, который содержит сами комментарии, и исправление состоит в том, чтобы удалить код, а не комментировать его.

Тем не менее, многие языки программирования имеют более одного типа синтаксиса комментариев, и вы можете использовать этот факт для вложения как минимум на один уровень глубины. Например, в Java:

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

Кроме того, во многих языках по крайней мере один тип комментариев является своего рода вложенным; в C-подобных языках строчные комментарии внутри строчных комментариев игнорируются:

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

Большинство IDE поддерживают комментирование целых блоков кода строковыми комментариями в одном действии, и они правильно обрабатывают этот стиль комментирования. Тот же пример в Python:

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

Часто стандарты кодирования для конкретного проекта имеют правила о том, какой стиль комментариев использовать, когда; Общепринятым условием является использование блочных комментариев ( /* */) для документации методов и классов и встроенных комментариев ( //) для замечаний внутри тел методов и таких, например:

/**
 * 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;
    }
}

При таком стиле маловероятно, что вам когда-либо понадобится вкладывать /* */комментарии (если вам нужно временно отключить целые методы или классы, переименование их работает так же хорошо, если не лучше); и //комментарии делают гнездо, по крайней мере , с небольшой помощью интегрированной среды.

Наконец, чтобы отключить код, у вас есть другие варианты во многих языках программирования; например, в C вы можете использовать препроцессор:

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

В динамических языках вы можете ifвместо этого просто использовать регулярные операторы:

<?php

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

Однако, в отличие от примера CPP, эта стратегия требует, чтобы исходный файл в целом был синтаксически верным, поэтому он далеко не такой гибкий.

И, наконец, есть, по крайней мере, некоторые языки, которые допускают вложенные комментарии. Если вам интересно, в Википедии есть хорошая сравнительная таблица .


2
какой-то вариант SQL допускает вложенные комментарии?
Ксавье Комбель

3
+1 за// And now for something completely different...
Ворак

1
@Vorac: рад, что вам понравилась ссылка: D
tdammers

18

C и C ++ имеют вложенный блок комментариев:

#if 0
#endif

Многие редакторы с подсветкой понимают это как комментарий, а многие другие, по крайней мере, выделяют его как любой другой условно отключенный код.

Во многих других языках вы должны полагаться на поддержку редактора. Для языков, которые имеют только строчные комментарии (perl, python, ruby, shell ...), достаточно просто добавить символ комментария ко всем строкам в диапазоне, поэтому большинство редакторов могут это сделать. Вы все еще можете сказать, что было комментариями, прежде чем комментировать весь блок, потому что символ комментария удваивается - здесь это просто преимущество.

XML и SGML, вероятно, самая большая боль, это определение комментариев просто глупо. Комментарии были бы тривиальными для вложения, но они не только не имеют, это полностью запрещено иметь --внутренний комментарий. К сожалению, я не знаю, какие редакторы имеют хорошую поддержку для комментирования в SGML / XML.


2
Никогда не думал об использовании этих директив препроцессора в качестве реальных комментариев. Интересно, что и для C #, но в этом случае вам придется делать что-то вроде этого, #if _что тоже хорошо работает и становится серым в моем VS с Re #. Хороший совет!
Гримаса Отчаяния

2

Хотя это не является общим решением и, конечно, не идеальным, один из способов решения этой конкретной проблемы состоит в использовании языка обработки шаблонов на стороне сервера для создания блочных комментариев для элементов комментариев вложенного кода. Это оставляет содержимое практически без изменений, но не позволяет отправить его в браузер клиента.

Это не очень помогает, если файл представляет собой простой и чистый контент, не требующий обработки на стороне сервера. В этом случае и в более общем случае вложенных комментариев спросите, почему вы хотите это сделать. В большинстве этих случаев можно обнаружить, что лучший способ справиться с этим - не справиться со всем этим. Другими словами, если вы хотите исключить раздел, то удалите его, и пусть управление версиями обрабатывает запоминание различий, если этот раздел как артефакт необходимо когда-либо воскресить.


0

В случае HTML / XML вы можете использовать несуществующую инструкцию обработки: см. Мой ответ по 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 поддерживает вложенные комментарии, поэтому «кажется, что комментарии не могут быть вложены не на одном языке» больше не является верным утверждением. Если вы недовольны отсутствием поддержки вложенных комментариев на вашем языке программирования, я бы предложил попробовать 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. */

Язык программирования Swift: основы


0

Язык программирования D имеет встроенные комментарии:

/+ 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 */

Другими словами /+и +/комментарии гнездятся.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.