Каково золотое соотношение кода и комментариев?

Есть ли соотношение код/комментарии, которое вы считаете признаком хорошего (плохого) состояния кода?

Можете ли вы привести примеры проектов с открытым исходным кодом, которые считаются хорошо закодированными, и их соответствующее количество комментариев?

(Я понимаю, что ни одно соотношение не является «верным» для каждого проекта, и вполне могут быть дрянные проекты, демонстрирующие это теоретическое золотое сечение. Тем не менее...)


person Community    schedule 21.09.2008    source источник


Ответы (26)


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

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

У нас почти нет комментариев, кроме комментариев XML в нашем проекте xUnit.net, но некоторым код кажется понятным и легко читаемым. :)

person Brad Wilson    schedule 21.09.2008
comment
+1 почему! Однако что делать с комментариями, представляющими собой псевдокод, который вы пишете до написания кода? Удалить их или оставить? - person Daniel Mošmondor; 02.11.2010
comment
Конечно, когда вы написали код, псевдокод будет избыточным, поэтому его следует удалить. - person David Neale; 07.02.2011
comment
Это рецепт катастрофы. Комментарии должны быть частыми и вопиющими. Цель комментариев — показать почему. Сам код показывает, что происходит. Но никогда не показывает, почему. Незакомментированный код — мертвый код. - person Erik Aronesty; 21.05.2014
comment
-1. Для тех, кто пытается читать чужой код, а комментарии в коде, который они пытаются прочитать, редки и ценны, потратит больше времени на то, чтобы понять код, а не на чтение комментариев и получение хорошего представления о том, что делают определенные вещи. - person Ethan Bierlein; 19.05.2015
comment
Не согласен на 100%. Комментарий устареет, если изменится код, а если это произойдет, просто не поленитесь и обновите комментарии. Тот, кто думает, что легче понять, что происходит, читая код, а не читая фактические предложения, описывающие, что происходит, должен попытаться просмотреть страницы устаревшего кода на Фортране. - person Gabriel; 03.08.2015
comment
У нас почти нет комментариев, кроме комментариев XML... - Комментарии XML остаются комментариями. - person Brandin; 14.12.2015
comment
Извините, что не согласен, но комментарии чрезвычайно полезны для объяснения смысла реализации. Чтобы объяснить, что вы пытаетесь сделать и почему вы сделали это определенным образом. Они делают код более удобным для сопровождения. Всегда думайте о парне, застрявшем на техническом обслуживании. Не комментировать свой код, потому что вы думаете, что он просто безупречен и сверхпрост, скорее всего, просто высокомерие. Так что комментарии не должны быть редкостью. Вы должны быть щедры, когда комментируете свой код. - person Mig82; 20.12.2017

Тот, кто должен исправить код другого программиста, скажет как можно больше комментариев. Большая проблема со старым кодом заключается в следующем: «Вы видите, что делает этот код. Вы видите, что проблема в этом. Но вы не знаете, почему программист так написал».

Чтобы понять ошибку, вам нужно знать:

  • что должен делать код (не что код делает) и почему.
  • Контракт каждой функции. Например, если есть исключение NullPointerException, то где ошибка? В функции или в вызывающей функции?
  • На каждом взломе должно быть описано, как проблема может быть воспроизведена (языковая версия, ОС, версия ОС). Например, у нас есть много хаков для старой виртуальной машины Java, которая больше не поддерживается. Но мы не уверены, сможем ли мы удалить его, потому что не знаем, как их воспроизвести.

У нас соотношение 2-3%, что очень мало. Я думаю, что 10% хороши для больших или долгоживущих проектов.

person Horcrux7    schedule 21.09.2008

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

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

С уважением

person marcospereira    schedule 21.09.2008

Комментарии не просто объясняют код — они также направляют отладчик, который ищет фрагмент кода, который что-то делает.

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

person DJClayworth    schedule 08.10.2008

Я комментирую все, что считаю двусмысленным или требующим объяснения. Часто я слишком комментирую. Почему? Потому что вы никогда не знаете, кто будет работать над вашим кодом. Мне нравится представлять ситуацию, когда они заменяют половину команды обезьянами, которые понимают только то, что когда они нажимают ввод в строке, они получают банан. Так что, если они хотя бы научатся читать, они не изменят мою логику, не прочитав предварительно комментарии.

Случай и точка:

// Delete the helloworld file
exec("rm -f helloworld.txt")

Не изменится на:

exec("rm -rf /")

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

person willasaywhat    schedule 08.10.2008
comment
Чтобы добавить к вашему последнему замечанию: иногда разработчик хорош в том, что он делает, потому что он так привередлив в том, чтобы делать что-то определенным образом... но попросите его поддерживать проект, который еще не написан к их запутанным стандартам и смотреть, как они вносят ряд изменений, вводя ошибки слева, справа и по центру только для того, чтобы удовлетворить их собственное представление о хорошем коде! - person Corin; 23.04.2016

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

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

person Assaf Lavie    schedule 21.09.2008

У меня есть очень простое эмпирическое правило: если вам нужно остановиться и подумать более ~15 секунд при кодировании какого-то фрагмента кода (скажем, функции или сложного цикла и т. д.), то этот фрагмент кода нуждается в комментарии. .

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

person Milan Babuškov    schedule 21.09.2008

Там должны быть комментарии там, где вы считаете их необходимыми. Не больше и не меньше.

Прокомментируйте части, которые, по вашему мнению, вы могли не понять после 6+ недель перерыва, когда снова смотрите на код.

person Sebastian Hoitz    schedule 21.09.2008

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

Если вы будете следовать этому правилу, то ваш код будет нуждаться в комментариях только тогда, когда он имеет дело с какой-то неочевидной проблемой в оборудовании или операционной системе, или когда самый очевидный алгоритм — не лучший выбор. Это комментарии типа «это странно, потому что», и на самом деле это всего лишь механизм решения проблемы. В большинстве случаев комментарии в коде на самом деле просто извинения за то, что они не написаны более очевидным образом, и такие комментарии следует избегать, а затем удалять.

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

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

person Tim Ottinger    schedule 21.09.2008
comment
Мой идеальный коэффициент равен нулю. Вы имеете в виду бесконечность, верно? Если вы не имеете в виду язык DWIM, который переводит ваши комментарии в код... :) - person sundar - Remember Monica; 08.10.2008
comment
Дело не только в том, МОЖЕТ ли код представлять идею: если комментарии могут представлять ее более кратко, тогда комментарии должны быть. - person DJClayworth; 08.10.2008

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

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

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

person Mark Baker    schedule 08.10.2008

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

person Dror Helper    schedule 21.09.2008

Золотое соотношение код/комментарий — это пересечение

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

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

person Thorsten79    schedule 21.09.2008

В книге Стива МакКоннелла () "Code Complete" есть отличное обсуждение комментариев к коду (у меня есть первое издание, но я думаю, что теперь второе издание текст ссылки)

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

person Richard    schedule 21.09.2008

Золотого сечения нет. Количество комментариев сильно зависит от внутренней сложности кода. Если вы просто пишете CRUD-приложения, вам, вероятно, не нужно много комментариев. Если вы пишете операционную систему или РСУБД, вам, вероятно, потребуется больше комментариев, так как вы будете выполнять более сложный код, и вам нужно будет немного более явно объяснить, почему вы делаете то, что делаете.

person Kibbee    schedule 21.09.2008

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

В качестве примера вы можете просмотреть различные показатели для исходного кода ядра Linux. .

person Dan Dyer    schedule 24.09.2008
comment
Интересно, похоже, что многие проекты (более 100 000 кодов) имеют от 10 до 40% комментариев к коду. - person Jason D; 14.07.2011

от 3% до 9,5%, более или менее

person Community    schedule 15.04.2010
comment
Это буквально единственный ответ, который ответил на вопрос. OP запросил числовые примеры и получил абстрактные размышления о золотых пропорциях и т. Д. В качестве одной точки данных у нас есть 24-летнее приложение Windows, которое выпускается ежегодно, написанное на C (и немного C++) со следующими показателями: 232 868 строк код 90 953 строки комментариев. 90 953 / (90 953 + 232 868) = 28% - person Clay Dreslough; 07.05.2020
comment
К вашему сведению, 22% нашего кода исходит от третьих лиц (jpeg, agg, png, steam и zlib). Многие комментарии описывают, почему мы вызываем эти функции и как они работают. Сведение к минимуму комментариев и принуждение программистов копаться в стороннем коде в этом контексте не имеет смысла. - person Clay Dreslough; 07.05.2020
comment
Наконец, как указал Майкл Стёрн, код, используемый третьими сторонами, нуждается в дополнительных комментариях. Мы неоднократно лицензировали этот код (или его части) за последние 19 лет, и одной компании потребовалось добавить около 30 000 строк комментариев. - person Clay Dreslough; 07.05.2020

Я должен сказать, что пришел сюда в поисках ответа примерно на 2 комментария на 1 строку кода. Даже если это преувеличение, оно в правильном направлении! Вместо этого я вижу, как люди рекомендуют относиться к комментариям как к трюфелям или другому редкому товару. Глядя со специфической точки зрения академических кругов, если качество кода низкое, а контроль версий используется даже реже, чем трюфели, я призываю всех писать как можно больше комментариев, даже вопреки вашему собственному суждению о том, являются ли комментарии на 100% необходимыми.

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

person Community    schedule 24.10.2016

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

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

person Matt Hanson    schedule 21.09.2008

Не существует такой вещи, как хорошее соотношение комментариев к коду. Раньше некоторые считали, что в начале каждой функции должен быть комментарий, объясняющий, что она делает.

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

person NotMe    schedule 21.09.2008

Нет никакого «золотого сечения». Это зависит от языка и того, как вы его пишете. Чем выразительнее ваш код, тем больше он может быть самодокументированным — и, следовательно, тем меньше комментариев вам нужно. Это одно из преимуществ плавных интерфейсов.

person Nate Kohari    schedule 21.09.2008

Вы не можете указать фиксированное соотношение код/комментарии, иначе вы получите код, пронизанный шумом, например:

// Add one to i
i++;

который просто затуманивает код.

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

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

ХТН.

ваше здоровье,

Роб

person Rob Wells    schedule 21.09.2008

Комментарии имеют 3 использования, ИМО:

  • Объясните, почему код делает то, что он делает.
  • Задокументируйте интерфейс для модуля
  • Объясните, почему другие подходы к фрагменту логики не использовались

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

person Tim    schedule 21.09.2008
comment
Комментарии в коде могут быть оправданно полезны в тех случаях, когда они документируют локализованные временные инварианты (это означает, что каждый раз, когда эта строка кода выполняется, всегда будут применяться определенные условия). Например, при использовании вычислений с масштабированными целыми числами может быть полезно документировать на различных этапах вычислений, каковы будут диапазоны различных переменных, что позволяет продемонстрировать, что вычисления никогда не приведут к переполнению. Такие комментарии не говорят, что код делает (для этого и нужен код), а вместо этого представляют то, что знает программист, но не знает компьютер. - person supercat; 24.12.2013

0/0 ; zero divided by zero
Runtime error (func=(main), adr=3): Divide by zero

подразумеваемая команда «Делай, что я имею в виду» с комментарием «без комментариев»?

person Mark Stock    schedule 21.09.2008

Нет такого соотношения.

Обычно комментарии должны быть только в ситуациях, когда что-то может быть действительно неясным, например

// Do not Dispose!
SPSite site = properties.Feature.Parent as SPSite;

С другой стороны, если вы продаете код кому-то, ему потребуется как можно больше комментариев. Изображение, продающее 3D Engine или какое-либо другое промежуточное программное обеспечение для игр, не имеющее комментариев. Конечно, API-документация и т. д. также являются важной частью такого промежуточного программного обеспечения, но хороший код с комментариями также окупается. Такие вещи, как «Добавить 1 к i», по-прежнему слишком спамны, но что-то вроде «CreateDevice() сначала проверит, доступен ли DirectX 10, и, если нет, вернется к устройству DirectX 9», может быть действительно полезным, даже если это тривиально для смотри из кода.

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

person Michael Stum    schedule 08.10.2008

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

person Robert Elwell    schedule 08.10.2008

person    schedule
comment
На самом деле я думаю, что это кусочная функция, где yearsofexp ‹ 2, LOC = 0 - person 1800 INFORMATION; 22.09.2008
comment
справа (: Пожалуйста, введите не менее 10 символов. - person Serhat Ozgel; 22.09.2008
comment
Я слишком долго смотрел на лолкотов. Я какое-то время не мог это прочитать. - person Sam Hasler; 24.09.2008