Хорошие варианты использования комментариев

Я всегда ненавидел комментарии, которые заполняют половину экрана звездочками, просто чтобы сообщить вам, что функция возвращает строку, я никогда не читал эти комментарии.

Однако я все же читаю комментарии, в которых описывается, почему что-то делается и как это делается (обычно это однострочные комментарии в коде); они действительно пригодятся при попытке понять чужой код.

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

Примером может быть:

//loop though all the names from n to j - 1

Кроме этого, я не могу себе представить, зачем кому-то тратить драгоценное время на написание комментариев, если он мог писать код.

Я прав или нет? Я что-то упускаю? О каких еще хороших примерах использования комментариев я не знаю?


person Community    schedule 09.02.2010    source источник
comment
Дублировано несколько раз, перефразировано различными незначительными способами: stackoverflow.com/questions/   -  person    schedule 09.02.2010


Ответы (11)


Если вы используете что-то вроде Doxygen, вы можете полностью задокументировать свои возвращаемые типы, аргументы и т. Д. И сгенерировать приятный "Руководство по исходному коду". Я часто делаю это для клиентов, чтобы команда, наследующая мой код, не потерялась полностью (или не была вынуждена проверять каждый заголовок).

Блоки документации часто преувеличиваются, особенно это касается строго типизированных языков. Гораздо больше смысла говорить о подробностях вроде Python или PHP, чем о C ++ или Java. Тем не менее, это все еще хорошо делать для методов и членов, которые не говорят сами за себя (например, без имени update).

Я сэкономил много часов на размышления, просто комментируя то, что я хотел бы сказать себе, если бы впервые читал свой код. Больше повествования и меньше наблюдений. Комментарии должны помогать не только другим, но и себе ... особенно, если вы не прикасались к ним пять лет. У меня есть Perl десятилетней давности, который я написал, и я до сих пор не знаю, что он делает.

Что-то очень грязное, что я сделал в PHP и Python, - это использование отражения для извлечения блоков комментариев и меток элементов в пользовательском интерфейсе. Это вариант использования, хотя и неприятный.

Если вы используете трекер ошибок, я также оставлю идентификатор ошибки рядом с моими изменениями, чтобы у меня была обратная ссылка на трекер. Это дополнение к краткому описанию изменения (встроенные журналы изменений).

Я также нарушаю правило «только комментируйте, почему не что», когда делаю то, что мои коллеги редко видят ... или когда важна тонкость. Например:


for (int i = 50; i--; ) cout << i; // looping from 49..0 in reverse
for (int i = 50; --i; ) cout << i; // looping from 49..1 in reverse
person Community    schedule 09.02.2010
comment
Мне нравится часть о том, что вы хотели бы знать, если бы смотрели на нее впервые или впервые за долгое время. И, по моему опыту, это также имеет тенденцию к тому, что больше почему, чем что. - person GalacticCowboy; 09.02.2010

Комментарии должны выражать почему вы делаете что-то, а не то, что делаете.

person Community    schedule 09.02.2010
comment
+1: любой может прочитать код, чтобы узнать, что вы делаете. Но почему может оставаться полной загадкой без каких-либо объяснений. - person S.Lott; 09.02.2010
comment
Зевота. Это заезженное клише повторяется каждый раз. Попробуйте прочитать большой кусок языка C или ассемблера без каких-либо комментариев и посмотрите, сможете ли вы понять, что он делает. Комментарии необходимы, чтобы объяснить, почему и что. - person ; 09.02.2010
comment
Другим также сложнее узнать, было ли какое-то поведение вашей функции намеренным или нет. Без комментариев другие могут «исправить» код, который не сломан, или они могут посчитать слишком рискованным исправлять что-то, что кажется неправильным, а на самом деле так и есть. - person Scott Smith; 09.02.2010
comment
Следует добавить, если не очевидно, почему. Я видел слишком много Incrementing i, поэтому могу считать комментарии - person pestilence669; 09.02.2010
comment
@Neil Я думаю, что смысл «не документировать что» относится к комментариям, в которых говорится: var ++; // увеличить var на 1. Полезно только для тех, кто совершенно не знаком с языком. Лучше сказать, что что-то вроде var основано на нуле, но массив основано на единице ... - person Scott Smith; 09.02.2010
comment
@Scott - я содрогаюсь от ваших массивов с нулевым отсчетом. - person Chris Lutz; 09.02.2010
comment
FWIW, я слышал термины стратегический и тактический, используемые для обозначения высокоуровневого почему и построчно какие комментарии. - person Scott Smith; 09.02.2010
comment
@Neil Butterworth: Единственный раз, когда у меня возникли проблемы с тем, что делает код, - это когда кто-то действительно занимается умопомрачительным код-гольфом. В остальном что всегда казалось довольно ясным. Может, мне просто везло последние несколько десятилетий. - person S.Lott; 09.02.2010
comment
@ S.Lott Может быть, вы бог кода, но мне нужна вся помощь, которую я могу получить. Если я встречу 10 строк ассемблера с комментарием, в котором говорится, что найдите длину строки, я счастлив, если нет комментария, я нет. - person ; 09.02.2010
comment
Почему также можно расширить, чтобы объяснить, почему этот метод, а не любой другой, который может подойти - person Peter M; 09.02.2010
comment
@Neil Butterworth: 10 строк ассемблера с комментарием, в котором говорится, что найти длину строки - это отличный пример комментария почему. - person S.Lott; 09.02.2010
comment
@ S.Lott Конечно, нет. Он говорит, ЧТО делает код. В комментарии «ПОЧЕМУ» будет сказано, почему был использован именно этот алгоритм или почему он использовался на данном этапе программы. - person ; 09.02.2010
comment
@ Нил Баттерворт: Я согласен с вами по большей части. Вы не должны сообщать кому-либо через комментарий, что делает цикл for или что вы собираетесь вызвать метод. Однако вам может потребоваться указать, ЧТО делает ваш код, чтобы удовлетворить бизнес-правилу; это может быть неочевидно, и не все разработчики являются экспертами в данной области. - person Phil; 10.02.2010
comment
@Phil Я бы сказал, что бизнес-правила - это комментарии ПОЧЕМУ - регулирующие органы говорят, что мы не можем предоставлять кредиты, если существует более трех факторов риска, например, в верхней части функции OKToLend (). - person ; 10.02.2010
comment
Итак, / * я поместил эту функцию сюда, потому что программа не работала без нее. / предпочтительнее / эта функция считает, что она вычисляет длину строки * /. Хорошо, понял. Мои коллеги полюбят меня сейчас! - person Tim Schaeffer; 10.02.2010

Это старая пословица, но хороший показатель для использования:

Прокомментируйте почему вы что-то делаете, а не как вы это делаете.

Сказание «перебрать все имена от n до j-1» должно быть сразу понятно даже начинающему программисту, исходя только из кода. Объяснение причины, по которой вы это делаете, может улучшить читаемость.

person Community    schedule 09.02.2010
comment
@TIm LOL Нет, вы должны комментировать код. Здравый смысл, здравый смысл, здравый смысл. - person JeremyDWill; 10.02.2010

Я использую комментарии в следующих ситуациях:

  1. Комментарии к высокоуровневой документации по API, т.е. для чего нужен этот класс или функция?
  2. Комментируя «почему».
  3. Краткое высокоуровневое резюме того, что делает гораздо более длинный блок кода. Ключевое слово здесь - резюме. Если кому-то нужны более подробные сведения, код должен быть достаточно ясным, чтобы они могли получить это из кода. Смысл здесь в том, чтобы облегчить кому-то, просматривающему код, выяснить, где находится какая-то часть логики, без необходимости углубляться в детали того, как она выполняется. В идеале эти случаи должны быть выделены в отдельные функции, но иногда это просто невозможно, потому что функция будет иметь 15 параметров и / или не будет именоваться.
  4. Выявление тонкостей, которые видны при чтении кода, если вы действительно обращаете внимание, но не выделяйтесь так сильно, как должны, учитывая их важность.
  5. Когда у меня есть веская причина, почему мне нужно делать что-то хакерским способом (производительность и т. Д.) И я не могу писать код более четко вместо использования комментария.
person Community    schedule 09.02.2010

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

person Community    schedule 09.02.2010
comment
На самом деле это один из способов, которыми я комментирую свой собственный код. Иногда мне приходится проделывать необычные трюки из-за причуд, и другие могут не уловить их автоматически, поэтому я пишу их в комментариях. - person Phil; 10.02.2010

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

person Community    schedule 09.02.2010
comment
Если код не интуитивно понятен, я бы прокомментировал, что и как в важных и запутанных частях, просто чтобы специалисты по сопровождению понимали, что происходит. Я также прокомментирую почему, чтобы они знали, чего ожидать, но это тот случай, когда важно задокументировать ИМХО. - person Chris Lutz; 09.02.2010

Я всегда ненавидел комментарии, которые заполняют половину экрана звездочками, просто чтобы сообщить вам, что функция возвращает строку, я никогда не читал эти комментарии.

Некоторые комментарии в этом ключе, обычно не с таким экстремальным форматированием, на самом деле существуют, чтобы помочь таким инструментам, как JavaDoc и Doxygen, создать документацию для вашего кода. Я думаю, что это хорошая форма комментария, потому что он имеет как человеко-, так и машиночитаемый формат документации (чтобы машина могла переводить ее в другие, более полезные форматы, такие как HTML), помещает документацию близко к коду что он документирует (так что, если код изменяется, документация, скорее всего, будет обновлена, чтобы отразить эти изменения), и, как правило, дает хорошее (и немедленное) объяснение тому, кто плохо знаком с большой базой кода, почему существует конкретная функция.

В остальном я согласен со всем остальным, что было сказано. Комментируйте, почему, и комментируйте только тогда, когда это не очевидно. Помимо комментариев Doxygen, в моем коде обычно очень мало комментариев.

person Community    schedule 09.02.2010
comment
Я говорю именно о таких комментариях, взгляните на комментарий и функцию в строке 98 здесь: code.google.com/p/google-web- toolkit / source / browse / trunk / user / Это исходный текст TextBox от GWT (написанный Google). - person Leo Jweda; 09.02.2010
comment
@Laith - я ненавижу любой формат документации-комментариев, который использует встроенный XML или HTML для форматирования, но обычно Doxygen не так уж и плох. Этот конкретный фрагмент имеет высокое соотношение комментариев к коду, но он также демонстрирует ненавистный i++; // post-increment i by 1 стиль комментирования, так что не обращайте на это внимания. Кроме того, я преимущественно использую C, поэтому большая часть этого кода была бы немного более подробной для моего среднего варианта использования. - person Chris Lutz; 10.02.2010

Другой тип комментария, который обычно бесполезен:

// Commented out by Lumpy Cheetosian on 1/17/2009

... ну, хорошо, система контроля версий сказала бы мне это. Чего он мне не скажет, так это ПОЧЕМУ Lumpy закомментировал этот, казалось бы, необходимый фрагмент кода. Поскольку Лампи находится в Эльбонии, я не смогу узнать до понедельника, когда все они вернутся с праздничного фестиваля Снеркрумф.

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

Кстати: Javadoc (или Doxygen, или эквивалент) - это хорошая вещь (тм), ИМХО.

person Community    schedule 09.02.2010
comment
Должен сказать, мне нравятся имена, которые вы придумали. - person Leo Jweda; 22.03.2010

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

person Community    schedule 09.02.2010

Напоминает мне о

Настоящие программисты не пишут документацию

person Community    schedule 09.02.2010

Я написал этот комментарий некоторое время назад, и он сэкономил мне часы с тех пор:

// NOTE: the close-bracket above is NOT the class Items.
// There are multiple classes in this file.
// I've already wasted lots of time wondering,
// "why does this new method I added at the end of the class not exist?".
person Community    schedule 28.09.2010