Должен ли я использовать идентификаторы блока ("end;") в моем коде? - PullRequest
6 голосов
/ 21 июля 2009

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

С тех пор, как я прочитал эту книгу, я занимался этим неукоснительно. Иногда это кажется чрезмерным, как в случае ниже.

Прав ли Стив Макконнелл настаивать на том, чтобы всегда использовать идентификаторы блоков? Какой из них вы бы использовали?

//naughty and brief
with myGrid do
  for currRow := FixedRows to RowCount - 1 do
    if RowChanged(currRow) then
      if not(RecordExists(currRow)) then
        InsertNewRecord(currRow)
      else
        UpdateExistingRecord(currRow);

//well behaved and verbose
with myGrid do begin
  for currRow := FixedRows to RowCount - 1 do begin
    if RowChanged(currRow) then begin
      if not(RecordExists(currRow)) then begin
        InsertNewRecord(currRow);
      end  //if it didn't exist, so insert it
      else begin
        UpdateExistingRecord(currRow);
      end;  //else it existed, so update it
    end;  //if any change
  end;  //for each row in the grid
end;  //with myGrid 

Ответы [ 15 ]

10 голосов
/ 21 июля 2009

Я всегда следовал стилю '1001 * с хорошим поведением и многословно , за исключением ненужных лишних комментариев в конечных блоках.

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

Совет : ярлык KB Visual Studio для начала и конца перехода на C #: Ctrl +]

Если вы используете Visual Studio, то наличие фигурных скобок для C # в начале и конце блока также помогает тем, что у вас есть ярлык в КБ для перехода к началу и концу

7 голосов
/ 21 июля 2009

Лично я предпочитаю первый, так как ИМХО "конец"; не говорите мне много, и как только все будет близко, я могу определить по тому, что происходит, когда.

Я считаю, что блоки более полезны при наличии больших операторов. Вы могли бы сделать смешанный подход, когда вы вставляете несколько символов «начало ... конец» и комментируете, чем они заканчиваются (например, используйте его для with и первого if).

ИМХО, вы также можете разбить это на несколько методов, например, часть

  if not(RecordExists(currRow)) then begin
    InsertNewRecord(currRow);
  end  //if it didn't exist, so insert it
  else begin
    UpdateExistingRecord(currRow);
  end;  //else it existed, so update it

может быть в отдельном методе.

7 голосов
/ 21 июля 2009

Я бы использовал то, что моя компания установила для своих стандартов кодирования.

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

5 голосов
/ 21 июля 2009

Я думаю, это в некоторой степени зависит от ситуации. Иногда у вас просто есть такой метод:

void Foo(bool state)
{
    if (state)
        TakeActionA();
    else
        TakeActionB();
}

Не понимаю, как это выглядит так:

void Foo(bool state)
{
    if (state)
    {
        TakeActionA();
    }
    else
    {
        TakeActionB();
    }
}

Улучшает читабельность вообще.

4 голосов
/ 21 июля 2009

Я разработчик Python, поэтому не вижу необходимости в идентификаторах блоков. Я вполне счастлив без них. Для меня достаточно отступа.

2 голосов
/ 21 июля 2009

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

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

Если это возможно, я использую checkstyle, чтобы убедиться, что используются скобки.

1 голос
/ 27 августа 2010

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

// clear and succinct
with myGrid do begin
  for currRow := FixedRows to RowCount - 1 do begin
    if RowChanged(currRow) then begin
      if not(RecordExists(currRow))
        InsertNewRecord(currRow);
      else
        UpdateExistingRecord(currRow);
    end;  // if RowChanged
  end;  // next currRow
end;  // with myGrid
1 голос
/ 27 августа 2010

Я с теми, кто предпочитает более лаконичный код.

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

Это похоже на чрезмерные скобки: некоторые люди предпочитают его как (F1 and F2) or ((not F2) and F3) или (A - (B * C)) < 0, и не обязательно, потому что они не знают о правилах предшествования. Просто так им понятнее.

1 голос
/ 21 июля 2009

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

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

1 голос
/ 21 июля 2009

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

...