Як вирішити проблему вкладених коментарів


23

Здається, що не лише однією мовою коментарі не можуть бути вкладені. У вас є гарне рішення цієї проблеми? Одне з вирішень C / C ++ та Java - це використовувати лише однорядковий коментар, але тоді неможливо коментувати більший блок. Я стикаюся з чимось таким:

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

Тому я повинен вручну пройти і відредагувати коментарі. Чи можете ви порадити, як нам впоратися з цим багатьма мовами? Я не впевнений, але, можливо, у python є рішення для цього з '''можливістю включити #коментар у python? `


4
Я думаю, що лише редактори можуть вам тут допомогти. Хоча IDLE заблокує для вас коментар на Python IIRC.
Ерік Реппен

7
Python це НЕ має блок коментарів . '''І """є рядкові літерали . Буває, що інтерпретатор буде оцінювати їх під час компіляції (для байт-коду) і розпізнає рядкові літерали як відсутності (отже, вони не сповільнюють час виконання / завантаження байт-коду). Документи, тобто рядкові букви відразу після, 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);
*/

Крім того, у багатьох мовах принаймні один тип коментарів є своєрідним-нестабільним; у мовах, подібних С, ігнорування рядків у коментарях до рядків ігнорується:

// 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, ця стратегія вимагає, щоб вихідний файл у цілому був синтаксично дійсним, тому далеко не такий гнучкий.

І нарешті, є хоча б деякі мови, які дозволяють вкладати вкладені коментарі. Якщо ви зацікавлені, у wikipedia є хороша діаграма порівняння .


2
чи дозволяє якийсь варіант SQL вкладені коментарі?
Xavier Combelle

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

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

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

Мова швидкого програмування: основи


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.