Чи існує метод відмежування інформативних коментарів від коментованого коду?


38

Протягом усього програмування ви закінчите кілька коментарів, що пояснюють код, та деякі коментарі, які видаляють код:

// A concise description 
const a = Boolean(obj);
//b = false;

Чи є хороший метод швидкого розбору, який є?

Я розігрувався з використанням 3 /-х та /** */для описових коментарів.

Я також використовував плагін VSCode для виділення //TODO:та//FIXME:


2
Як зауваження, ///і /** ... */коментарі також використовуються деякі генератори документації, такі як Doxygen або JSDoc. Якщо ви використовуєте їх чи подібні інструменти, можливо, ви не зможете використовувати такий коментар для описових коментарів, які не мають бути частиною документації.
Джастін Час 2 Відновіть Моніку

1
У JavaScript більшість рядків коду, ймовірно, закінчуються крапкою з комою. Якщо ви не зробите ваші коментарі, це здається досить простим, і ви можете написати сценарій, щоб це також легко перевірити;
Артеміда Фаул

Відповіді:


189

Для цього є дуже просте рішення: видаліть коментований код.

Дійсно, для коментування коду є лише дві вагомі причини: перевірити щось / зробити виправлення або зберегти код, який ви можете використати пізніше. Якщо ви тестуєте чи виправляєте щось, видаліть коментований код, як тільки закінчите тест чи виправлення. Якщо ви зберігаєте код, який ви зможете використовувати пізніше, зробіть його першокласним кодом і покладіть його десь, наприклад, у бібліотеку, де він може бути корисним.


108
Крім того, якщо код був зареєстрований: просто видаліть його. Якщо ви коли - небудь знадобиться його назад, контроль джерело ви охоплені
marstato

38
Коли код видалено, ніхто не помічає, що він колись існував. Це ускладнює відновлення. Цінність залишається в коментованому коді, особливо якщо здається, що він буде використаний у майбутньому.
usr

76
@usr: Коли код видалено, ніхто не помічає, що він колись існував - і на мій досвід, у 99% випадків реального світу це правильна річ. У 1% може бути якесь значення в залишених коментарях рядках, однак, якщо коментований код залишається протягом декількох тижнів чи місяців (або довше), шанси високі, він навіть не збирається більше через рефакторинг активного рядки коду. Аргумент "потенційне значення для майбутніх застосувань" часто використовується як помилковий привід людей, у яких виникає емоційна проблема позбавлення речей із бази коду, на яку вони вклали кілька годин мозкової роботи.
Док Браун

21
Я ніколи не здійснюю коментований код без додаткових пояснювальних коментарів. Є рідкісні ситуації, коли ви можете повернути код найближчим часом, але кожен з них є винятковим і вимагає пояснення для майбутніх розробників (або майбутніх вас). 90% моїх коментарів "Видалено, тому що воно видається невикористаним. Видаліть після листопада 2021 року, якщо проблем немає"
Джеймс Бенінгер

31
Колись мій колега поставив "Тут був код, який зробив X, але я його видалив", коли ми видалили якусь функцію. Це спрацювало дуже добре; ви знали, що це було в історії джерела цього файлу, але це вас не турбувало.
Ерік

45

Додаючи до відмінної відповіді @ RobertHarvey, я вважаю, що є лише одна законна причина, з якою я коли-небудь стикався, щоб зберегти коментований код у керуванні джерелом, навіть тимчасово: у випадку неочевидного коду заміни, який не повинен або не може бути використаний зараз з якихось причин . Навіть тоді більшість коментарів має бути поясненням, а не кодом заміни. Це може бути помилка або особливості мови, яка ще не вважається стабільною. Це може виглядати приблизно так:

# TODO: Replace with `foo = frobnicate(bar)` once <link.to/bug> is fixed
foo = [some complex workaround]

У цьому випадку робота вже була виконана, але ви поки не можете скористатися нею, тому видалення означає, що комусь доведеться її знову відкрити. Те ж саме стосується і неоптимальних рішень, які можуть здатися вищими на обличчі, або свідомих компромісів щодо подібних рішень .

Застереження: Не заливайте свій код альтернативними рішеннями. Кожне завдання можна виконати нескінченно багатьма різними способами, і нецінно вивчити цей простір протягом тривалого часу для кожної зміни. Огляди коду можуть бути хорошим місцем для виявлення таких відсутніх коментарів, коли ваш колега пропонує покращення, яке ви вже виявили як неоптимальне.


2
Зворотний бік цього полягає в тому, що іноді вам потрібно пояснити, чому ви не використовуєте frobnicate(bar), щоб ніхто не прийшов і намагався "виправити" ваш "неелегантний" код. Отже, ви показуєте їм, що знаєте, що в ідеальному світі frobnicateфункція була б шляхом, але ви знаєте, що з болісного досвіду це працює не правильно. Можливо, не очікується, що третя сторона навіть вважає це помилкою, і тим більше варто виправити; вам все одно потрібно залишити коментар майбутнім програмістам (у тому числі і собі) про те, чому ви не застосували очевидного підходу.
Monty Harder

3
Пов'язана ситуація полягає в тому, що можуть бути два способи зробити щось, один з яких обробляє дійсні дані набагато швидше, ніж інший, і один з них запропонує більш корисну діагностику, якщо з будь-якої причини він отримає недійсні дані. Якщо програма є частиною процесу, який повинен подавати лише ті дані, які "гарантовано" є дійсними, але щось у процесі не працює належним чином, наявна версія, яка повільніше, але пропонує кращу діагностику, може зробити це набагато простіше визначити, що йде не так.
supercat

20

Хм, я читав це питання дещо інакше, ніж Роберт, який правильно стверджує, що коментований код слід видалити.

Якщо ви шукаєте конвенцію для позначення коду для подальшого вилучення, старий фаворит:

//b = false; //TODO: remove

Деякі прапорці IDE //TODO:коментують або до яких можна навчитись. Якщо ні, то це зазвичай рядок, який можна шукати. Найкраще дотримуватися будь-якої конвенції, яку встановив ваш магазин, оскільки це можна зробити декількома способами. Кожна база коду повинна робити це в один спосіб. Тримає його в пошуку.

швидкий розбір, який є?

Без цього позначки автоматизований спосіб зробити це за допомогою компілятора. Якщо відключення коментаря створює код, який компілюється, він повинен бути коментованим кодом. Написання плагіна IDE, який перевіряє, що це не буде складно. Але це залишить коментований код позаду.

Ось чому краще просто позначити коментований код як код в той момент, коли ви його коментуєте. Це дозволяє вам неруйнівно працювати, поки ви вирішите, чи дійсно хочете, щоб вона пішла. Оскільки нас усіх переривають і дещо забувають, не дивуйтеся, якщо деякі рядки заносяться, перебуваючи в такому стані. Якщо вони роблять, це приємно, що вони принаймні чітко позначені та можуть шукатись. Макроси клавіатури мені в цьому допомагали в минулому. В середині цього важко перерватися, якщо ви можете це зробити одним натисканням клавіші.

Ви можете взяти це за умови закріплення позначки у своїх тестах безперервної інтеграції. На жаль, я знову намагаюся зареєструватися із видатними TODO.


Замість того, щоб бачити, чи збираються коментарі для позначення їх як коду, ви можете запускати коментарі через природний мовний процесор і мітити ті, що розбирають фразу як пропозицію чи іменник мовою, якою говорить ваша команда.
TheHansans

3
@ TheHansans, що звучить добре, але мій досвід роботи з мобільними телефонами щодо правильних стосунків з моїм жаргоном кодера робить мене обережним.
candied_orange

Я гадаю, що NLP, який використовується для розбору коментарів до коду, був би набагато кращим, ніж NLP, який забезпечує автокорекцію, просто тому, що на комп’ютері є все речення, з яким можна працювати, і не намагається виправити орфографічні помилки. Не кажучи вже про те, що помилковий негатив тут теж кращий - доки людина може переглядати коментар перед видаленням, він може просто переписати коментар, на відміну від того, щоб не попередити про марну гоблеру.
TheHansans

3
wrt розбір: double buffer (flip on)-> Прототип C або надто короткий англійський? не можу сказати без контексту, не є правильною цілою конструкцією на будь-якій мові. Деякі помилкові позитиви та негативи неминучі, коли коментарі за своєю природою не обмежують форму їх змісту в будь-якому напрямку.
Левшенко

8

Я використовую директиви препроцесора для видалення коду, а не коментарів:

//comment
active_code();
#if FALSE
inactive_code();
#endif

Це робить дуже легку річ для пошуку, і мій підсвічувач синтаксису розглядає це як коментар. Я навіть можу згорнути його в один рядок:#if FALSE(...)

Ви можете розширити цю ідею, щоб мати кілька варіантів:

#if OPTION == 0
code_for_option_0();
#elif OPTION == 1
code_for_option_1();
#else
code_for_all_other_options();
#endif

І перевірка помилок під час компіляції:

#if FOO >= 5
#error FOO should be less than 5!
#endif

Звичайно, ви не хочете перебирати це за борт, або вам стає важко сказати, що насправді складається, а що ні. Але ви отримуєте ідею, і це та сама проблема, що і для коментованого коду в будь-якому випадку ... до тих пір, поки ви використовуєте лише статично. Якщо ваші умови динамічні, це гірше.


Щоб визначити, що є в існуючій кодовій базі, яка взагалі не розглядала цю проблему, я не думаю, що існує універсальне рішення. Вам доведеться самостійно знайти шаблони і, ймовірно, кодувати регулярний вираз, щоб їх знайти.


Для чого на світі це було б корисно? Чи потрібно складати кілька версій?
Tvde1

@ Tvde1 Це одна можливість і потенційний кошмар, якщо ти не дуже добре впораєшся . Але альтернатива можливо гірша. Якщо у вас є кілька копій майже одного і того ж коду, по одному для кожної зміни на загальній темі, вам доведеться підтримувати їх окремо і тримати їх у синхронізації.
AaronD

Існує кілька способів зробити це, але всі вони мають певну різницю як зі складною проблемою конфігурації, так і з проблемою незалежної копії: Ви впевнені, що помилка потрапила до всіх незалежних копій? Що робити, якщо ні, і додається ще одна функція, яка потім порушується помилкою, яка була відома до цієї функції, але не перенесена дотепер?
AaronD

3
Це працює лише в тому випадку, якщо у вас є крок попередньої обробки, як C. Питання про те javascript. Ви можете зробити попередню обробку, але це розширить можливості системи побудови, і це також нестандартно. Якщо у вас немає системи складання або система збірки зовсім не підтримує розбір та виконання коду, ви не зможете реалізувати це рішення. Нарешті, він навіть не вирішує питання - коментований код не є строго еквівалентним коду, який умовно активується. Це може бути залишок, який не передбачається ввімкнути.
ВЛАЗ

Умовна активація - це лише розширення відповіді, а не сама відповідь. Інакше я би змінив його, щоб включити коментарі, які поширюють його ще більше.
AaronD

4

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

(Моя основа - C #, але це може бути застосоване до будь-якої мови синтаксису C, наприклад, java)

// An explanatory comment has a space between the comment marker and the content.

// The following lines are commented out code so do not have the space (except where indented).
//var a = something();
//if(a==2) {
//   doSomethingElse();
//}

2
Це повністю залежить від стилю: коли я коментую код, я, як правило, додаю //до першого стовпця, і оскільки практично весь код є відступом, результат практично завжди є, що коментар починається з деяких вкладок. Звичайні коментарі не отримують від мене провідного простору, якщо тільки немає інших коментарів із провідним простором поблизу. Отже, ваш метод не зможе зазнати невдач у коментарях, які я випустив, і будь-який метод, розроблений для розпізнавання моїх моделей коментарів, невдало зазнав би вашої.
cmaster

@cmaster Ах бачу, я думаю, що я неправильно зрозумів питання. Я запропонував простий спосіб форматування коментарів таким чином, щоб їх можна було легко проаналізувати на тип, що не те, що просили.
IanF1

2

Я все-таки тлумачу запитання по-різному, думаю, що ви хочете знайти коментований код.

Код у стилі С повинен містити напівколонки, хоча коментар навряд чи матиме напівколонки. Отже, для коментованого коду з одного рядка ви можете використовувати цей регулярний вираз:

\s*\/\/[\s\S]*;

Для коду, що коментується багато рядків, це може бути

\/\*[^\;]*;[^\;]*\*\/

Примітка: Visual Studio трохи властивий щодо розривів рядків у регулярних виразах, вони не враховуються як пробіли, вам потрібно вказати явний \ n.


2

Якщо ви використовуєте редактор із компілятором, який працює у фоновому режимі (наприклад, Xcode та Clang), ви можете просто спробувати скласти текст коментаря. Наприклад, "стислий опис" дає помилки, "b = false;" не означає. Потім можна використовувати різні підсвічування синтаксису.

Більш простим методом буде плагін IDE, який використовує деякі евристики, як-от кілька слів підряд, окрім ключових слів, вказує на коментарі, збігається з фігурною точкою з кодом тощо.


1

Інші відповіді охоплюють варіанти теми "не коментувати код". Але іноді ти все-таки хочеш це зробити для довідок.

Якщо вам справді потрібен код, щоб залишатись навколо, краще рішення - оточити його кодом "#if 0 ... #endif", в ідеалі з коментарем, щоб сказати, чому. Це рекомендована стратегія з різних стандартів кодування, включаючи MISRA.


-3

Просте, принаймні для мене - і в C / C ++. Коментарі, додані до / * * /, є інформативними. Тимчасово видалений код тесту коментується //

І є вагомі підстави залишити тестовий код у файлі, але прокоментував його, принаймні, у такій роботі, яку я виконую. Рано чи пізно хтось захоче внести зміни, які знадобляться цьому коду. Коментування блоку вимагає однієї команди редактора, як і повторне коментування його там, де ви закінчили.


Існує також #ifdef __DEBUG ... #endifабо будь-яке спеціальне визначення, яке ви хочете використовувати. __DEBUGЦе приємно, адже вам часто потрібно лише змінити конфігурацію проекту, щоб отримати його. Але більшість IDE дозволяють вам також визначати власні конфігурації, які можуть давати вам що-небудь у цьому місці.
AaronD

Що ви маєте на увазі під тестовим кодом? Одиничні тести? Їх взагалі не слід коментувати, а зберігати в тестовому наборі та працювати якомога частіше, незалежно від того, чи хтось вважає це необхідним. Звичайно, легко повторно коментувати фрагмент коду, але ще простіше не робити нічого взагалі і мати тестовий набір вже на місці, роблячи це ...
leftaround about

1
Арг, не роби цього. Коментуючи код "тестувати щось", вийде чудово 99 з 100 разів ... і в одному випадку ви забудете його видалити (якщо він більше не потрібен) або - ще гірше - забудете його прокоментувати ( якщо це потрібно) і речі можуть стати некрасивими.
CharonX

@leftaroundabout: Ні, я маю на увазі такі речі, як оператори printf, що вводяться для перевірки значень.
jamesqf

@jamesqf вам ніколи не потрібні такі речі, ось для чого налагоджувач. Але навіть якщо ви використовуєте printf/ coutабо подібне для отримання правильно написаного коду (що, я визнаю, я робив сам у минулому), залишати їх там дійсно не дуже ефективно. Якщо хтось хоче внести зміни і знає, про які змінні їм потрібна інформація, швидко і легко написати printfs s заново, тоді як якщо цей розробник не знає, що потрібно, і просто відміняє всі ці printfтвердження, то величезна кількість тексту термінал, ймовірно, теж не допоможе їм.
близько
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.