Ответ 1
Только типичные комментарии Comp Sci 101:
$i = 0; //set i to 0
$i++; //use sneaky trick to add 1 to i!
if ($i==$j) { // I made sure to use == rather than = here to avoid a bug
Вот что.
Мы все знаем, что комментирование нашего кода является важной частью стиля кодирования для того, чтобы сделать наш код понятным для следующего человека, который приходит или даже через 6 месяцев или около того.
Однако иногда комментарий просто не разрезает горчицу. Я не говорю о очевидных шуточках или отстраненном отчаянии, я говорю о комментариях, которые, кажется, делают попытку объяснения, но делайте это так плохо, что они, возможно, тоже не будут там. Комментарии, которые слишком короткие, слишком зашифрованы, или просто неправильно.
Как рассказ cautonary, вы могли бы поделиться чем-то, что вы видели, который был действительно просто , что плохой, и если это не очевидно, покажите код, на который он ссылался, и укажите, что с ним не так.? Что должно отправиться туда?
См. также:
Только типичные комментарии Comp Sci 101:
$i = 0; //set i to 0
$i++; //use sneaky trick to add 1 to i!
if ($i==$j) { // I made sure to use == rather than = here to avoid a bug
Вот что.
Незавершенные комментарии шаблона javadoc особенно бесполезны. Они потребляют много экранной недвижимости, не внося ничего полезного. И хуже всего то, что, когда появляется один такой комментарий, сотни других, несомненно, скрываются.
/**
* Method declaration
*
*
* @param table
* @param row
*
* @throws SQLException
*/
void addTransactionDelete(Table table, Object row[]) throws SQLException {
Я обнаружил, что пишу эту маленькую жемчужину раньше:
//@TODO: Rewrite this, it sucks. Seriously.
Обычно это хороший признак того, что я дошел до конца сеанса кодирования на ночь.
// remember to comment code
WTF?: D
Что-то вроде этого:
// This method takes two integer values and adds them together via the built-in
// .NET functionality. It would be possible to code the arithmetic function
// by hand, but since .NET provides it, that would be a waste of time
private int Add(int i, int j) // i is the first value, j is the second value
{
// add the numbers together using the .NET "+" operator
int z = i + j;
// return the value to the calling function
// return z;
// this code was updated to simplify the return statement, eliminating the need
// for a separate variable.
// this statement performs the add functionality using the + operator on the two
// parameter values, and then returns the result to the calling function
return i + j;
}
И так далее.
Каждый комментарий, который просто повторяет то, что говорит код, бесполезен. Комментарии не должны сообщать мне, что делает код. Если я недостаточно хорошо знаю язык программирования, чтобы понять, что происходит, просто прочитав код, я не должен читать этот код вообще. Комментарии, похожие на
// Increase i by one
i++;
абсолютно бесполезны. Я вижу, что я увеличен на один, вот что говорит код, мне не нужен комментарий для этого! Комментарии должны использоваться для объяснения почему что-то сделано (в случае, если это далеко не очевидно) или почему что-то сделано таким образом, а не каким-либо другим способом (так что я могу понять некоторые дизайнерские решения, сделанные другим программистом, которые явно не очевидны сразу). Дальнейшие комментарии полезны для объяснения сложного кода, где абсолютно невозможно определить, что происходит, быстро просмотрев код (например, есть сложные алгоритмы для подсчета количества бит, установленных в числе, если вы не знаете, что делает этот код, у вас нет никаких шансов угадать, что там происходит).
Thread.Sleep(1000); // this will fix .NET crappy threading implementation
Я когда-то работал над проектом со странным компилятором C. Это дало ошибку в действительном фрагменте кода, если не было добавлено комментарий между двумя утверждениями. Поэтому я изменил комментарий на:
// Do not remove this comment else compilation will fail.
И он отлично работал.
Я не верю. Я пришел к этому вопросу после того, как у него было 22 ответа, и никто не указал наименее возможно полезный тип комментария:
комментарии неправильные.
Это плохо, что люди пишут лишние комментарии, которые мешают понимать код, но когда кто-то пишет подробный комментарий, объясняющий, как что-то работает, и это либо неправильно, либо неправильно, после того, как код был изменен без изменения комментарий (гораздо более вероятный сценарий), это, безусловно, самый худший комментарий.
GhostDoc сам по себе предлагает некоторые интересные.
/// <summary>
/// Toes the foo.
/// </summary>
/// <returns></returns>
public Foo ToFoo()
// secret sauce
// Don't know why we have to do this
try
{
...some code...
}
catch
{
// Just don't crash, it wasn't that important anyway.
}
* Вздох
Один раз в один файл. Тысячи строк кода, большая часть из которых довольно ужасающая. Неверно названные переменные, сложные контуры на циклах и один комментарий, похороненный в середине файла.
/* Hmmm. A bit tricky. */
//' OOOO oooo that smell!! Can't you smell that smell!??!??!!!!11!??/!!!!!1!!!!!!1
If Not Me.CurrentMenuItem.Parent Is Nothing Then
For Each childMenuItem As MenuItem In aMenuItem.Children
do something
Next
If Not Me.CurrentMenuItem.Parent.Parent Is Nothing Then
//'item is at least a grand child
For Each childMenuItem As MenuItem In aMenuItem.Children
For Each grandchildMenuItem As MenuItem In childMenuItem.Children
do something
Next
Next
If Not Me.CurrentMenuItem.Parent.Parent.Parent Is Nothing Then
//'item is at least a grand grand child
For Each childMenuItem As MenuItem In aMenuItem.Children
For Each grandchildMenuItem As MenuItem In childMenuItem.Children
For Each grandgrandchildMenuItem As MenuItem In grandchildMenuItem.Children
do something
Next
Next
Next
End If
End If
End If
Комментарии по умолчанию, вставленные IDE.
В последнем проекте, над которым я работал, в котором использовался WebSphere Application Developer, было много разработчиков и подрядчиков по обслуживанию, которые, похоже, не беспокоились сотнями, если не тысячами классов Java, которые содержали подобные:
/**
* @author SomeUserWhoShouldKnowBetter
*
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
* To enable and disable the creation of type comments go to
* Window>Preferences>Java>Code Generation.
*/
Всегда существовала эта сплит-секунда между мыслью, что вы действительно нашли хорошо прокомментированный исходный файл и понимаете, что yup, это еще один комментарий по умолчанию, который заставил вас использовать SWEAR_WORD_OF_CHOICE
.
Я видел этот комментарий вчера в приложении С#:
//TODO: Remove this comment.
Мой любимый комментарий во все времена.
/* our second do loop */
do {
Тот, кто написал это, вы знаете, кто вы.
очень большой проект ядра базы данных в C много лет назад - тысячи строк кода с короткими именами с ошибками и ошибками и без комментариев... до тех пор, пока не будет глубоко вложенных if-conditions в несколько тысяч строк в модуль. появился следующий комментарий:
//if you get here then you really f**ked
к тому времени, я думаю, мы уже это знали!
В огромном приложении VB5
dim J
J = 0 'magic
J = J 'more magic
for J=1 to 100
...do stuff...
Ссылка, очевидно, ЭТО... и да, приложение без этих двух строк выходит из строя во время выполнения с неизвестным кодом ошибки. Мы все еще не знаем почему.
Взято из одного из сообщений в блогах:
В процессе очистки некоторого исходного кода для одного из проектов, которые я управляю, я наткнулся на следующие комментарии:
/*
MAB 08-05-2004: Who wrote this routine? When did they do it? Who should
I call if I have questions about it? It worth it to have a good header
here. It should helps to set context, it should identify the author
(hero or culprit!), including contact information, so that anyone who has
questions can call or email. It useful to have the date noted, and a
brief statement of intention. On the other hand, this isn't meant to be
busy work; it meant to make maintenance easier--so don't go overboard.
One other good reason to put your name on it: take credit! This is your
craft
*/
а затем немного ниже:
#include "xxxMsg.h" // xxx messages
/*
MAB 08-05-2004: With respect to the comment above, I gathered that
from the filename. I think I need either more or less here. For one
thing, xxxMsg.h is automatically generated from the .mc file. That might
be interesting information. Another thing is that xxxMsg.h should NOT be
added to source control, because it auto-generated. Alternatively,
don't bother with a comment at all.
*/
а затем еще раз:
/*
MAB 08-05-2004: Defining a keyword?? This seems problemmatic [sic],
in principle if not in practice. Is this a common idiom?
*/
AHHHRRRGGHHH Просто нашел это в каком-то древнем коде, поставил парня, что он был довольно забавным.
private
//PRIVATE means PRIVATE so no comments for you
function LoadIt(IntID: Integer): Integer;
Худший комментарий - это тот, который дает неправильное объяснение того, что делает код. Это хуже, чем вообще никаких комментариев.
Я видел такую вещь в коде с слишком большим количеством комментариев (этого не должно быть, потому что код достаточно ясен сам по себе), и это происходит в основном при обновлении кода (рефакторинг, изменение, и т.д.), но комментарии не обновляются вместе с ним.
Хорошее эмпирическое правило: писать только комментарии, чтобы объяснить , почему код что-то делает, а не , что он делает.
Обязательно должны быть комментарии, стоящие вместо обработки ошибок.
if(some_condition){
do_stuff();
}
else{
//An error occurred!
}
Я только что нашел этот, написанный на линии перед прокомментированной строкой кода:
//This causes a crash for some reason. I know the real reason but it doesn't fit on this line.
100k LOC-приложение, перенесенное с vb6 на vb.net. Похоже, что предыдущий разработчик помещал заголовок комментария на один метод, а затем копировал и вставлял точный комментарий на каждый использованный им метод. Сотни методов и каждый из них некорректно прокомментировали...
Когда я впервые увидел это, я засмеялся... Через 6 месяцев шутка носит тонкий цвет.
Это абсолютно реальный пример из триггера базы данных:
/******************************************************************************
NAME: (repeat the trigger name)
PURPOSE: To perform work as each row is inserted or updated.
REVISIONS:
Ver Date Author Description
--------- ---------- --------------- ------------------------------------
1.0 27.6.2000 1. Created this trigger.
PARAMETERS:
INPUT:
OUTPUT:
RETURNED VALUE:
CALLED BY:
CALLS:
EXAMPLE USE:
ASSUMPTIONS:
LIMITATIONS:
ALGORITHM:
NOTES:
******************************************************************************/
/** function header comments required to pass checkstyle */
Два самых бесполезных комментария, которые я когда-либо видел...
try
{
...
}
catch
{
// TODO: something catchy
}
Я также разместил этот файл в Daily WTF, поэтому я отрежу его только до комментария...
// TODO: The following if block should be reduced to one return statememt:
// return Regex.IsMatch(strTest, NAME_CHARS);
if (!Regex.IsMatch(strTest, NAME_CHARS))
return false;
else
return true;
Один, которого я никогда не находил очень полезным:
<!--- Lasciate ogne speranza, voi ch'intrate --->