Что такое идеальное переменное соглашение о присвоении имен для переменных цикла? [закрытый]

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

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

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

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

44
задан Wesley Murch 25 February 2013 в 16:20
поделиться

28 ответов

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

При использовании понятных имен:

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

Пример - определяет ошибку

, Это может быть хитро для нахождения ошибки в этом вложенном цикле с помощью одних букв:

int values[MAX_ROWS][MAX_COLS];

int sum_of_all_values()
{
    int i, j, total;

    total = 0;
    for (i = 0; i < MAX_COLS; i++)
        for (j = 0; j < MAX_ROWS; j++)
             total += values[i][j];
    return total;
}

, тогда как это легче при использовании понятных имен:

int values[MAX_ROWS][MAX_COLS];

int sum_of_all_values()
{
    int row_num, col_num, total;

    total = 0;
    for (row_num = 0; row_num < MAX_COLS; row_num++)
        for (col_num = 0; col_num < MAX_ROWS; col_num++)
             total += values[row_num][col_num];
    return total;
}

, Почему row_num? - отклоненные альтернативы

В ответ на некоторые другие ответы и комментарии, это некоторые альтернативные предложения к использованию row_num и col_num и почему я принимаю решение не использовать их:

  • r и c : Это немного лучше, чем i и j. Я только рассмотрел бы использование их, если бы стандарт моей организации был для однобуквенных переменных, чтобы быть целыми числами, и также всегда быть первой буквой эквивалентного описательного имени. Система падала бы, если бы у меня было две переменные в функции, имя которой началось с "r", и удобочитаемость пострадала бы, даже если бы другие объекты, начинающиеся "r", появились где-нибудь в коде.
  • rr и cc : Это выглядит странным мне, но я не привык к стилю переменной цикла двойной буквы. Если бы это был стандарт в моей организации тогда, я предполагаю, что это было бы немного лучше, чем [1 112] и c.
  • row и col : На первый взгляд это кажется более сжатым, чем [1 116] и col_num, и столь же описательный. Однако я ожидал бы, что пустые существительные как "строка" и "столбец" будут относиться к структурам, объектам или указателям на них. Если row мог бы означать или сама структура строки, или номер строки, то беспорядок закончится.
  • iRow и iCol : Это передает дополнительную информацию, так как i может означать, что это - счетчик цикла, в то время как Row и Col говорят Вам, что это считает. Однако я предпочитаю быть в состоянии считать код почти на английском языке:
    • row_num < MAX_COLS чтения как " цифра строки частота ошибок по битам [меньше чем 1 163] макс. imum (количество) седло umn s";
    • iRow < MAX_COLS в лучшем случае чтения как " целочисленный счетчик цикла для строка [меньше чем 1 168] макс. imum (количество) седло umn s".
    • Это может быть персональная вещь, но я предпочитаю первое чтение.

альтернатива [1 126], который я принял бы, row_idx: слово "индекс" исключительно относится к положению массива, если домен приложения не находится в дизайне механизма базы данных, финансовых рынках или подобен.

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

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

40
ответ дан Paul Stephenson 26 November 2019 в 21:40
поделиться

В Python я использую i, j, и k, если я только считаю времена через. Я использую x, y, и z, если итеративное количество используется в качестве индекса. Если я на самом деле генерирую серию аргументов, однако, я буду использовать понятное имя.

0
ответ дан J.T. Hurley 26 November 2019 в 21:40
поделиться

Для целых чисел я использую международный индекс, если он не вкладывается тогда, я использую Индексный суффикс по тому, что выполняется с помощью итераций как интервал groupIndex и интервал userIndex.

0
ответ дан loudej 26 November 2019 в 21:40
поделиться

Я обычно использую:

for(lcObject = 0; lcObject < Collection.length(); lcObject++)
{
   //do stuff
}
0
ответ дан Riddari 26 November 2019 в 21:40
поделиться

Мое любимое соглашение для цикличного выполнения по подобному матрице набору состоит в том, чтобы использовать x+y, как они используются в декартовых координатах:

for x in width:
    for y in height:
        do_something_interesting(x,y)
0
ответ дан Ed L 26 November 2019 в 21:40
поделиться

для числовых вычислений matlab, и подобных ему, не используют i, j

, это зарезервированные константы, но matlab привычка, жалуется.

Мои персональные favs

индекс первое, второе встречное количество

0
ответ дан Midhat 26 November 2019 в 21:40
поделиться

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

, Когда цикличное выполнение через строки, я буду использовать iRow. Когда цикличное выполнение через столбцы я буду использовать iCol. Когда цикличное выполнение через автомобили я буду использовать iCar. Вы получаете идею.

0
ответ дан Tim Gradwell 26 November 2019 в 21:40
поделиться

Если это - простой счетчик, я придерживаюсь использования 'я' иначе, имею имя, которое обозначает контекст. Я склонен сохранять переменную длину до 4. Это главным образом с точки зрения чтения кода, запись, не рассчитывает, поскольку у нас есть автоматическая полная функция.

0
ответ дан Karthi 26 November 2019 в 21:40
поделиться

Моя привычка состоит в том, чтобы использовать 't' - близко к 'r', таким образом, это следует легко aftewr вводящий 'для'

0
ответ дан Simon Munro 26 November 2019 в 21:40
поделиться

я также использую соглашение двойной буквы. ii, jj, kk. Вы может grep те и не придумывать набор нежелательных соответствий.

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

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

1
ответ дан the0ther 26 November 2019 в 21:40
поделиться

Я имею длительно используемый i/j/k схема именования. Но недавно я начал адаптировать более последовательный метод именования.

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

Согласно просьбе несколько примеров:

, Если необходимо циклично выполнить канавку набор элементов.

for (int currentItemIndex = 0; currentItemIndex < list.Length; currentItemIndex++)
{
    ...
}

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

Item currentItem = list[currentItemIndex];

я пытаюсь использовать конструкцию foreach языка. который преобразовывает.

for (int currentItemIndex = 0; currentItemIndex < list.Length; currentItemIndex++)
{
    Item currentItem = list[currentItemIndex];
    ...
}

в [1 110]

foreach (Item currentItem in list)
{
   ...
}

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

единственное время я все еще использую переменные буквы, когда я - размеры канавки цикличного выполнения. Но тогда я буду использовать x, y и иногда z.

1
ответ дан Davy Landman 26 November 2019 в 21:40
поделиться

Независимо от того, что Вы выбираете, используйте тот же индекс последовательно в Вашем коде везде, где это имеет то же значение. Например, для обхода через массив можно использовать i, jj, kappa, безотносительно, но всегда делать это тот же путь везде:

for (i = 0; i < count; i++) ...

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

Точно так же, если Вы идете через 2-й массив пикселей, например, Вы могли бы записать

for (y = 0; y < height; y++)
  for (x = 0; x < width; x++)
    ...

, Просто делают это тот же путь в каждом месте, что Вы пишете этот тип цикла.

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

1
ответ дан Derek Clegg 26 November 2019 в 21:40
поделиться

@JustMike... НЕСКОЛЬКО ПРИМЕРОВ C: ... сопровождать Java.

НЕВЛОЖЕННЫЙ ЦИКЛ: ... ограничение объема, где возможный

/*LOOP_DESCRIPTION*/ {

    int i;

    for (i = 0; i < LOOP_LENGTH; i++) {

        // loop body
    }  
}


ВЛОЖЕННЫЙ ЦИКЛ: ... так же

/*LOOP_DESCRIPTION*/ {

    int row, column;

    for (row = 0; row < ROWS; row++) {

        for (column = 0; column < COLUMNS; column++) {

            // loop body
        }
    }  
}

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

Также: я действительно использовал "индекс" и "idx", когда я запустил, но это обычно изменялось на "i" моими коллегами.

1
ответ дан Ande TURNER 26 November 2019 в 21:40
поделиться

Первое правило состоит в том, что длина имени переменной должна соответствовать объему переменной. Второе правило состоит в том, что понятные имена делают ошибки более мелкими. Третье правило состоит в том, что, если Вы испытываете желание добавлять комментарий к имени переменной, Вы выбрали неправильное имя переменной. Заключительное правило, делают, как Ваши товарищи по команде делают, пока оно не противодействует предшествующим правилам.

1
ответ дан Tim Ottinger 26 November 2019 в 21:40
поделиться

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

1
ответ дан Learning 26 November 2019 в 21:40
поделиться

У Steve McConnell Код, Завершенный , есть, как обычно, некоторый превосходный совет в этом отношении. Соответствующие страницы (в первом выпуске так или иначе) 340 и 341. Определенно советуйте любому, кто интересуется улучшением их кодирования цикла, чтобы посмотреть на это. McConnell рекомендует значимые имена счетчика цикла, но люди должны считать то, что он получен для высказывания себя вместо того, чтобы полагаться на мою слабую сводку.

1
ответ дан Onorio Catenacci 26 November 2019 в 21:40
поделиться

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

2
ответ дан Emile 26 November 2019 в 21:40
поделиться

Если счетчик должен использоваться в качестве индекса к контейнеру, я использую i, j, k.

, Если это должно использоваться, чтобы выполнить итерации по диапазону (или выполнить количество набора повторений), я часто использую n. Хотя, если вложение требуется, я буду обычно возвращаться к i, j, k.

На языках, которые обеспечивают foreach - конструкция стиля, я обычно пишу как это:

foreach widget in widgets do
  foo(widget)
end

я думаю, что некоторые люди отчитают меня для именования widget так так же к [1 110], но я нахожу его довольно читаемым.

3
ответ дан Jez 26 November 2019 в 21:40
поделиться

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

4
ответ дан Vaibhav 26 November 2019 в 21:40
поделиться

Я использую i, ii, iii, iv, v.. Никогда не становился выше, чем iii, все же.

5
ответ дан Oddmund 26 November 2019 в 21:40
поделиться

i

, если у меня есть вложенный цикл тогда также j.

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

6
ответ дан AnthonyWJones 26 November 2019 в 21:40
поделиться

Я использую я , j, k (или r & c для цикличного выполнения столбца строки). Если Вам нужно больше чем три переменные цикла в методе , метод является, вероятно, слишком длинным и сложным, и Ваш код был бы, вероятно преимущество от разделения метода в большее количество методов и именование их правильно .

7
ответ дан petr k. 26 November 2019 в 21:40
поделиться

Всегда пытайтесь назвать переменную чем-то значимым и в контексте.

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

Paul Stephenson См. этот ответ для примера.

9
ответ дан Community 26 November 2019 в 21:40
поделиться

Мой опыт состоит в том, что большинство людей использует одни буквы, например: i, j, k... или x, y, или r, c (для строки/столбец) или w, h (для ширины/высоты), и т.д.

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

// recommended style              ●    // "typical" single-letter style
                                  ●
for (ii=0; ii<10; ++ii) {         ●    for (i=0; i<10; ++i) {
    for (jj=0; jj<10; ++jj) {     ●        for (j=0; j<10; ++j) {
        mm[ii][jj] = ii * jj;     ●             m[i][j] = i * j;
    }                             ●        }
}                                 ●    }

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

11
ответ дан James Dunn 26 November 2019 в 21:40
поделиться

Примеры: ... В неитерационных циклах Java


:


Невложенные циклы: ... Индекс является значением.

... использование i, , как Вы были бы в Алгебре, является наиболее распространенной практикой ...

for (int i = 0; i < LOOP_LENGTH; i++) {

    // LOOP_BODY
}


Вложенные циклы: ... Дифференциация Индексов предоставляет пониманию.

... использование описательного суффикса ...

for (int iRow = 0; iRow < ROWS; iRow++) {

    for (int iColumn = 0; iColumn < COLUMNS; iColumn++) {

        // LOOP_BODY
    }
}


foreach Циклы: ... Object потребности имя.

... использование описательного имени...

for (Object something : somethings) {

    // LOOP_BODY
}


Итерационные циклы:


for Циклы: ... Ссылочные Объекты итераторов. Итератор это не ни один; Индекс, ни Indice.

... iter abreviates цель Итераторов ...

for (Iterator iter = collection.iterator(); iter.hasNext(); /* N/A */) {

    Object object = iter.next();

    // LOOP_BODY
}


while Циклы: ... Ограничьте объем Итератора.

... комментарий цели циклов ...

/* LOOP_DESCRIPTION */ {

    Iterator iter = collection.iterator();

    while (iter.hasNext()) {

        // LOOP_BODY
    }
}

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

12
ответ дан 12 revs 26 November 2019 в 21:40
поделиться

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

Пример Java:

for(int i = 0; i < ElementsList.size(); i++) {
  Element element = ElementsList.get(i);
  someProcessing(element);
  ....
}

2) Для модернизированных циклов Java как for(Element element: ElementsList) лучше использовать нормальное имя meanigful

Пример Java:

for(Element element: ElementsList) {
  someProcessing(element);
  ....
}

3), Если возможно с языком, что Вы используете, преобразовываете цикл для использования итератора

Пример Итератора Java: щелкают здесь

36
ответ дан Harry Potter 26 November 2019 в 21:40
поделиться

Я начал использовать perlisms в php.

если это - исключительное повторение, $_ хорошее имя тех, кто знает его использование.

0
ответ дан Kent Fredric 26 November 2019 в 21:40
поделиться

Стандарт Perl

В Perl стандартное имя переменной для внутреннего цикла является $ _. Для, foreach, и в то время как значение по умолчанию операторов к этой переменной, таким образом, Вы не должны объявлять это. Обычно, $ _ может быть считан как среднее универсальное местоимение "это". Таким образом, довольно стандартный цикл мог бы быть похожим:

foreach (@item){
    $item_count{$_}++;
}

На английском языке, который переводит в:

Для каждого объекта инкремент это - item_count.

Еще более распространенный, однако, не должен использовать переменную вообще. Много значений по умолчанию функций и операторов Perl к $ _:

for (@item){
    print;
}

На английском языке:

Для [каждого] объекта, печать [это].

Это также - стандарт для счетчиков. (Но счетчики используются намного менее часто в Perl, чем на других языках, таких как C). Таким образом распечатать квадраты целых чисел от 1 до 100:

for (1..100){
    print "$_*$_\n";
}

Так как только один цикл может использовать $ _ переменная, обычно это используется в самом внутреннем цикле. Это использование соответствует способу, которым обычно работает английский язык:

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

В Perl:

foreach $car (@cars){
    for (@{$car->{tires}}){
        check_pressure($_);
    }
}

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

Иногда, имеет смысл использовать короче, неописательные, родовые названия, такие как $i, $j, и $k, а не $ _ или описательное имя. Например, полезно соответствовать использованию переменных в опубликованном алгоритме, таком как векторное произведение.

1
ответ дан Jon Ericson 26 November 2019 в 21:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: