Каков ваш личный подход / принимать комментарии? - PullRequest
13 голосов
/ 01 февраля 2009

Дублирование

Каковы ваши жесткие правила комментирования?

Разработчик, с которым я работаю, хотел кое-что сказать по поводу комментариев, которые были мне интересны (см. Ниже). Каков твой персональный подход к комментированию?

"Я не добавляю комментарии к коду, если только это простой заголовок или есть
платформа-баг или необходимый Обходной путь, который не очевиден. Код может измениться, и комментарии могут стать вводит в заблуждение. Код должен быть
самодокументирование в его использовании описательные имена и их логические
организация - и ее решения должен быть самый чистый / простой способ
выполнить задание. Если программист не может сказать, что такое программа
делает только чтение кода, то он не готов изменить это.
Комментирование имеет тенденцию быть опорой для написать что-то сложное или
неочевидно - моя цель всегда напишите чистый и простой код. "

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

Ответы [ 26 ]

29 голосов
/ 01 февраля 2009

Существует трагический недостаток теории «самодокументируемого кода». Да, чтение кода скажет вам точно, что делает . Тем не менее, код неспособен сказать вам, что он должен делать.

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

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

Я нашел регулярные комментарии наиболее полезными в следующих местах:

1) Краткое описание вверху файла .h или .cpp для класса, объясняющее назначение класса. Это помогает специалистам по техническому обслуживанию получить быстрый обзор, не разбирая весь код.

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

Кроме этого, я склонен комментировать все, что может показаться кому-то непонятным или странным. Например: «Этот массив основан на 1, а не на 0 из-за бла-бла».

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

17 голосов
/ 01 февраля 2009

Мне всегда нравилось Рефакторинг Взять комментарии:

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

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

Как спорным, так как это, это звучит правдоподобно для кода я прочитал. Честно говоря, Фаулер не говорит никогда не комментировать, а думать о состоянии вашего кода, прежде чем вы это сделаете.

12 голосов
/ 01 февраля 2009

Вам нужна документация (в некоторой форме; не всегда комментарии) для локального понимания кода. Код сам по себе говорит вам, что он делает, если вы прочитали все этого и можете помнить все это. (Подробнее об этом ниже.) Комментарии лучше всего подходят для неформальной или полуформальной документации.

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

Документирует контракт каждой функции и, для каждого типа объекта, что он представляет, и любые ограничения на допустимое представление (технически, функция абстракции и инвариант представления ). Используйте исполняемую тестируемую документацию, где это целесообразно (doctests, модульные тесты, утверждения), а также пишите короткие комментарии, дающие суть, где это полезно. (Там, где тесты принимают форму примеров, они неполны; там, где они полны, точные контракты, они могут потребовать столько же усилий, сколько и сам код.) Пишите комментарии верхнего уровня для каждого модуля и каждого проекта; они могут объяснить соглашения, которые делают все ваши другие комментарии (и код) короткими. (Это поддерживает именование как документацию: с установленными соглашениями и местом, где мы можем ожидать, чтобы найти тонкости, мы можем быть более уверены, что имена говорят все, что нам нужно знать.) Более длинные, стилизованные , раздражающе избыточные Javadocs имеют свое применение, но помогли создать обратную реакцию.

(Например, это:

Выполнить n-кратную фробуляцию.
@ param n количество раз, чтобы заморозить
@ param x x-координата центра вспышки
@ param y y-координата центра вспышки
@ param z z-координата центра вспышки

может быть похоже на «Раздувать n раз вокруг центра (x, y, z)». Комментарии не должны быть рутиной, чтобы читать и писать.)

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

Вернемся к утверждению, что мы документируем ради локального понимания: что делает эта функция?

def is_even(n): return is_odd(n-1)

Проверяет, является ли целое число четным? Если is_odd() проверяет, является ли целое число нечетным, тогда да, это работает. Предположим, у нас было это:

def is_odd(n): return is_even(n-1)

Те же рассуждения говорят, что is_odd() проверяет, является ли целое число нечетным. Разложите их вместе, конечно, и ни один из них не работает, хотя каждый из них работает, если другой работает. Измените его немного, и у нас будет код, который работает, но только для натуральных чисел, и в то же время локально выглядит так, как будто он работает для целых чисел. В микромире это то, на что похоже понимание кодовой базы: отслеживание зависимостей в кругах, чтобы попытаться пересмотреть предположения, которые автор мог бы объяснить в одной или двух строках, если бы они беспокоились. Я ненавижу за счет духовных бездумных кодеров, которые привели меня к этому в течение последних нескольких десятилетий: о, этот метод выглядит так, как будто он имеет побочный эффект, чтобы подавить варпкор ... всегда? Ну, если странные кробункулы обесцвечивают, по крайней мере; они? Лучше проверь весь код обработки crobuncle ... который создаст свои собственные проблемы для понимания. Хорошая документация сокращает эту погрешность указателя O (n) до O (1): например, зная контракт функции и контракты вещей, которые она явно использует, код функции должен иметь смысл без дальнейшего знания системы. (Здесь контракты о том, что is_even() и is_odd() работают с натуральными числами, говорят нам, что обе функции должны проверяться на n==0.)

11 голосов
/ 01 февраля 2009

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

9 голосов
/ 01 февраля 2009

цель комментариев - объяснить контекст - причину кода; это, программист не может знать из простой проверки кода. Например:

strangeSingleton.MoveLeft(1.06);
badlyNamedGroup.Ignite();

кто знает, какого черта это? но с простым комментарием все раскрывается:

//when under attack, sidestep and retaliate with rocket bundles
strangeSingleton.MoveLeft(1.06);
badlyNamedGroup.Ignite();

серьезно, комментарии относятся к почему , а не к how , если только как не интуитивно понятно.

8 голосов
/ 01 февраля 2009

Хотя я согласен с тем, что код должен быть читабельным, я все же вижу большую ценность в добавлении обширных блоков комментариев для объяснения проектных решений. Например, «я сделал xyz вместо обычной практики abc из-за этого caveot ...» с URL-адресом отчета об ошибке или чем-то подобным.

Я пытаюсь посмотреть на это так: если я мертв и ушел, и кто-то из колледжа должен исправить ошибку здесь, что им нужно будет знать?

6 голосов
/ 01 февраля 2009

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

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

Так, например, если вы использовали какую-то арифметику указателей в стиле C в небезопасном блоке кода C #, вы не должны ожидать, что программисты C # легко переключатся с чтения кода C # (которое, вероятно, обычно более декларативно или по крайней мере меньше о манипуляции указателями более низкого уровня), чтобы понять, что делает ваш небезопасный код.

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

6 голосов
/ 01 февраля 2009

В общем, я вижу комментарии, используемые для объяснения плохо написанного кода. Большая часть кода может быть написана таким образом, чтобы комментарии были избыточными. Сказав, что я оставляю комментарии в коде, где семантика не интуитивна, например, вызов API, который имеет странное или неожиданное поведение и т. Д. *

5 голосов
/ 01 февраля 2009

Если код не понятен без комментариев, сначала сделает код более четким заявлением о намерениях, затем добавляйте комментарии только по мере необходимости.

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

Требование комментариев и «измерения производительности» в строках кода может привести к таким барахлам, как:

/*****
 *
 * Increase the value of variable i,
 * but only up to the value of variable j.
 *
 *****/

if (i < j) {
    ++i;
} else {
    i = j;
}

, а не лаконичный (и понятный для квалифицированного программиста):

i = Math.min(j, i + 1);

YMMV

5 голосов
/ 01 февраля 2009

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

РЕДАКТИРОВАТЬ: Это звучало немного помпезно, но я думаю, что слишком многие люди забывают, что даже имена переменных, или структуры, которые мы используем в коде, все это просто «теги» - они имеют для нас значение, потому что наш мозг видит строку символов, таких как customerNumber, и понимает, что это номер клиента. И хотя это правда, что в комментариях отсутствует какое-либо «принудительное исполнение» компилятором, они не так уж и удалены. Они предназначены для передачи смысла другому человеку, человеку-программисту, который читает текст программы.

...