Подтвердить что ты не робот

Где помещать комментарии в конструкцию IF THEN ELSE

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

Некоторые параметры:

а)

IF (blabla) { 
   // this comment explains what happens in the IF case
   dothis();
} else { 
  // this comment explains what happens in the ELSE case
   dosomethingelse();
}

Недостаток: в случае нескольких операторов dothis() мне нравится комментировать основные блоки, и в этом случае не всегда ясно, принадлежит ли IF-комментарий к первому блоку dothis() или ко всему IF случай

или b)

IF (blabla) { // this comment explains what happens in the IF case
   dothis();
} else { // this comment explains what happens in the ELSE case
   dosomethingelse();
}
Недостаток

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

или c)

// if the following happens
IF (blabla) { // then do this
   dothis();
} else { // or else do this
   dosomethingelse();
}

PS: Я знаю, что "код должен быть самоочевидным", но это не всегда так...

4b9b3361

Ответ 1

Для меня комментарий выше IF объясняет сам оператор IF. Например, если тестируемое условие является особенно сложным.

Комментарий в блоке ниже IF или ELSE описывает, что происходит после оценки условия и выбора.

Так вот так:

//Is this a favoured customer and do we have a promotion?
if customer.special() and monthly.hasOffer() {
  //Add discount
  invoice.addDiscount();
} 
else {
  //Add note about favoured customer scheme
  invoice.addNotes(JOIN_OUR_DISCOUNT_SCHEME);
}

Ответ 2

Я никогда не думал об этом; лично и по мере необходимости я поставил комментарии над заявлениями IF и ELSE. Это дает мне хорошее разделение между комментариями о операторах ветвей и комментариями о коде.

// comment about the if statement
if (expression)
{
    // comment about the code
    doSomething();
}
// comment about the else statement
else
{
    // comment about the code
    doSomethingElse();
}

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

Ответ 3

Я бы сделал случай a), но с дополнительным битом пробела:

if (blabla) {
   // This explains the whole if case

   // Can comment here for specific block comments
   doThis();
} else {
   // This explains the else case

   // Same again
   doSomethingElse();
}

Ответ 4

Лично я считаю, что лучше писать код, который не требует небольших комментариев, которые говорят "about do do x", а затем "DoX()". Если необходимо, вместо написания комментария, говорящего "делать x из-за y", я бы предпочел написать метод с именем "DoXBecauseOfY". Если позднее рефакторинг удаляет часть "FromOfY", тогда все же имеет смысл поставить комментарий перед оператором if, документируя общую логику.

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

Ответ 5

Используйте то, что имеет смысл для вас, я думаю (если вы не работаете под стандартом кодирования, который задает стиль комментариев). Лично я не использую (c), потому что это противоречит первому и следующему случаям. Я иногда использую (б), когда будет сделан короткий комментарий, но обычно я предпочитаю (а). Если я комментирую несколько подблоков в блоке if, я могу оставить пустую строку после комментария к корпусу:

if (blabla) {
    // here a comment about this case

    // comment about this bit of code
    bit_of_code();
    // comment about this other bit of code
    other_bit_of_code();
}

и т.д.

Ответ 6

// Not very much sure, but here is a snippet of my code

// tweak URL as per query params and hash index positions
if (hasQueryParams && hashPos > -1) {
    // both query params and hash available
    ...
    ...
} else if (hasQueryParams) {
    // only query params available
    ...
    ...
} else if (hashPos > -1) {
    // only hash available
    ...
    ...
} else {
    // neither query params nor hash available
    ...
    ...
}

Ответ 7

Из оракула java docs для условных обозначений кода

Комментарии для отдельной строки для if-else:

if (condition) {
 /* Here is a single line comment. */
 ...
}

Одиночная строка очень коротких комментариев для if-else:

if (a == 2) {
   return TRUE; /* special case */
} else {
 return isprime(a); /* works only for odd a */
}

Многострочные комментарии для if-else:

if (condition) {
 /*
  * Here is a block comment.
  */
}

Ответ 8

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

  • если комментарий помещен над другим, он прерывает непрерывность if-else
  • Если помещать внутри него, он может смешиваться с комментарием первого выражения внутри else


// match jth arc
if (j < Count)
{
     // arc matched
     if (arcs[j].IsBlue) List.Add(arcs[j])
}
else // all arcs were matched
{
     // check if there more arcs
     if (arcs[j + 1] != null) continue;
}

Это выглядит очень хорошо, если вы разрушаете блоки

// match jth arc
if (j < Count)|...|
else // all arcs were matched|...|

Ответ 9

Как насчет этого стиля? Используя комментарий // для описания описания целого if-else, и /* */ комментарий для внутреннего описания. Я использую комментарий /* */ для того, чтобы не путать с внутренним комментарием инструкции if-else.

    // Process1
    if (cond1-1) {
        /* Process1 > Process1-1 */
        Process1-1();
        // Process1-1 description...
        Process1-1();
        Process1-1();
        ... 

    } else if (cond1-2) {
        /* Process1 > Process1-2 */
        // Process1-2 description...
        Process1-2();
        Process1-2();
        Process1-2();
        ... 

        // Process1-2
        if (cond1-2-1) {
            /* Process1 > Process1-2 > Process1-2-1 */
            Process1-2-1();
            Process1-2-1();
            Process1-2-1();
            ...

        } else if (cond1-2-2) {
            /* Process1 > Process1-2 > Process1-2-2 */
            Process1-2-2();
            // Process1-2-2 description...
            Process1-2-2();
            // Process1-2-2 description...
            Process1-2-2();
            ...

        } else {
            /* Process1 > Process1-2 > Process1-2-else */
            Process1-2-else();
            Process1-2-else();
            Process1-2-else();
            ...
        }

    } else {
        /* Process1 > Process1-else */
        Process1-else();
        Process1-else();
        Process1-else();
        ...
    }