Int я vs int index и т.д. Какой из них лучше?

Возможные дубликаты:
Является ли переменная с именем я неприемлемой?
Что такое идеальное соглашение об именах имен для переменных цикла?

Исходя из фона C, я всегда использовал int i для общих переменных цикла. Конечно, в больших вложенных циклах или других сложных вещах я могу использовать описательное имя, но какое из них вы видели?

int i;
for(i=0;i<Controls.Count;i++){
  DoStuff(Controls[i]);
}

или

int index;
for(index=0;index<Controls.Count;index++){
  DoStuff(Controls[index]);
}

В текущем проекте, над которым я работаю, есть оба этих стиля и индекс заменяется на ndx.

Какой из них лучше? Является ли переменная i слишком общей? Также как насчет других имен стиля C? i, j, k Должны ли все они быть заменены фактическими описательными переменными?

Ответ 1

i, однако, довольно стандартный в терминах первого цикла, за которым следует j для внутреннего цикла и k для внутреннего внутреннего цикла и т.д.

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

Ответ 2

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

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

Но если цикл или блок кода очень длинный, лучше иметь более длинное описательное имя переменной, если только по той причине, что это упростит поиск текста.

Ответ 3

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

for(int i=0;i<someMax;i++){ 
  for(int j=0;j<someOtherMax;j++){ 
    DoStuff(someArray[i,j]); 
  }
} 

против.

for(int row=0;row<someMax;row++){ 
  for(int column=0;column<someOtherMax;column++){ 
    DoStuff(someArray[row,column]); 
  }
} 

Ответ 4

Короткими именами переменных являются большие, но они должны иметь небольшие области. И они должны соблюдать конвенции языка. До сегодняшнего дня мой код Haskell и ML будет иметь переменные функции f, g и h и монадические вычисления m, переменные неизвестного типа a и b, а также списки неизвестных типов элементов as и bs. Но области этих переменных будут ограничены короткими функциями или предложениями where.

Мой код C будет иметь переменные, называемые i, j, p, q, s и t. Но области этих переменных будут ограничены отдельными циклами (все похвалы C99 и С++ backports!) Или короткие функции. Является ли это индексом цикла или другой переменной, то, что появляется в большой области, получает более длинное имя.

Ответ 5

Я использую однобуквенные переменные в качестве счетчиков. Вот как я петлю, исчерпывающе использую буквы в алфавите:

for (int i = 0, l = array.length; i < l; i ++) {
  for (int j = 0, m = array[i].length; j < m; j ++) {
    for (int k = 0, n = array[i][j].length; k < n; k ++) {
      for (int o = 0, p = array[i][j][k].length; o < p; o ++) {
        for (int q = 0, r = array[i][j][k][o].length; q < r; q ++) {
          for (int s = 0, t = array[i][j][k][o][q].length; s < t; s ++) {
            for (int u = 0, v = array[i][j][k][o][q][s].length; u < v; u ++) {
              for (int w = 0, x = array[i][j][k][o][q][s][u].length; w < x; w ++) {
                for (int y = 0, z = array[i][j][k][o][q][s][u][w].length; y < z; y ++) {
                  f(array[i][j][k][o][q][s][u][w][y]);
                }
              }
            }
          }
        }
      }
    }
  }
}

Ответ 6

Область видимости элемента должна определять, как описательно это имя должно быть.

Если вы буквально имеете крошечный цикл, i, j и k являются точными и типичными счетчиками индексов. Иногда более описательное имя может помочь осветить намерение, но если цикл for настроен следующим образом, тогда более описательное имя не имеет большого значения.

for (int i = 0; i < totalCount; ++i)
{
   Thing& myThing = things[i];

   // do stuff with myThing, never refer to i again
}

Тем не менее, аббревиатуры никогда не должны использоваться, если они не используются последовательно. Я лично считаю, что ndx - ужасный идентификатор, потому что его трудно печатать; Я хорошо набираю английский, и скорость программирования не ограничивается скоростью ввода. Если вы хотите сказать index сказать index.

Я считаю, что именно в The Pragmatic Programmer они сказали, что вы не должны использовать аббревиатуры, потому что тогда люди никогда не узнают, какую аббревиатуру использовать. Я знаю, что мне нужна вещь под названием index, поэтому я набираю index, но получаю ошибку компилятора. Что теперь? (Охота через код, чтобы найти, что он написал ndx, меня беспокоит.)

Как я пытаюсь думать об этом, о единственном сокращении, которое я использую, не является специфичным для игры, это "num", чтобы стоять за "numberOf". Помимо этого я использую "npc" для обозначения не-игрового персонажа, "ai" означает искусственный интеллект и т.д. И т.д., И иногда я использую сокращения в небольших блоках, например. 10-строчная функция, работающая на Камере, может просто называть ее "кулачком", но область мала, поэтому легко увидеть, что происходит, и возможность путаницы ограничена.

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

for (int (y = 0; y < height; y++)
{
    for (int x = 0; x < width; x++)
    {
        // work
    }
}

Ответ 11

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