Если вы пишете простой маленький цикл, что вы должны назвать счетчиком?
Приведите примеры циклов!
Если вы пишете простой маленький цикл, что вы должны назвать счетчиком?
Приведите примеры циклов!
1) Для обычных маленьких стилей старого стиля - i, j, k - Если вам требуется более трех уровней вложенных циклов, это означает, что либо алгоритм очень специфичен и сложный, либо вы должны рассмотреть возможность реорганизации кода.
Пример Java:
for(int i = 0; i < ElementsList.size(); i++) {
Element element = ElementsList.get(i);
someProcessing(element);
....
}
2) Для новых java-циклов стиля, подобных for(Element element: ElementsList)
, лучше использовать нормальное значащее имя
Пример Java:
for(Element element: ElementsList) {
someProcessing(element);
....
}
3) Если это возможно с использованием используемого вами языка, преобразуйте цикл для использования iterator
Пример Java Iterator: нажмите здесь
Я всегда использую значимое имя, если только одноуровневый цикл и переменная не имеют никакого значения, кроме "количества раз, когда я прошел через этот цикл", и в этом случае я использую 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
. Это выглядит странно для меня, но я не привык к шаблону переменной с двумя буквами. Если бы это было стандартом в моей организации, то я предполагаю, что это будет немного лучше, чем r
и c
.row
и col
. На первый взгляд это кажется более кратким, чем row_num
и col_num
, и так же описательно. Тем не менее, я ожидал бы, что голые существительные типа "строка" и "столбец" будут ссылаться на структуры, объекты или указатели на них. Если row
может означать либо сама структура строки, либо номер строки, тогда возникает путаница.iRow
и iCol
. Это передает дополнительную информацию, так как i
может означать, что это счетчик цикла, в то время как row
и col
сообщают вам что он считает. Тем не менее, я предпочитаю читать код почти на английском языке:
row_num < MAX_COLS
читается как " строка num ber меньше max imum (число) col strong > итп s";iRow < MAX_COLS
в лучшем случае читает как "счетчик целых чисел для строки меньше max > imum (число) col umn s".Альтернативой row_num
я бы принял: row_idx
: слово "index" однозначно ссылается на позицию массива, если домен приложения не находится в дизайне базы данных, финансовых рынках и т.д.
Мой пример выше настолько мал, насколько я мог это сделать, и, как таковые, некоторые люди могут не видеть смысла в описании переменных описательно, поскольку они могут удерживать целую функцию в голове за один раз. Однако в реальном коде функции будут больше, а логика более сложная, поэтому достойные имена становятся более важными для обеспечения удобочитаемости и предотвращения ошибок.
Таким образом, моя цель с использованием всех имен переменных (а не только циклов) должна быть полностью однозначной. Если кто-либо читает какую-либо часть моего кода и не может решить, для чего нужна переменная, то я потерпел неудачу.
Не вложенные петли:., Индекс - это значение.
., использование
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
Циклы:., Итераторы ссылаются на объекты. Итератором это не так; Индекса или Индекса.
.,
iter
устраняет цель итераторов.,.
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.
Мой опыт в том, что большинство людей используют отдельные буквы, например:
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
встречается довольно часто в коде, где это не переменная, которую вы ищете.
Всегда пытайтесь назвать переменную чем-то значимым и в контексте.
Если вы не можете решить, тогда используйте "index", если только для того, чтобы кто-то еще (может быть, вы!) более легко щелкнул по нему для рефакторинга позже.
Пол Стивенсон См. этот ответ для примера.
Я использую i, j, k (или r и c для циклического цикла строк). Если вам нужен более трех переменных цикла в методе, этот метод, вероятно, слишком длинный и сложный, и ваш код, скорее всего, получит выгоду от разделения метода вверх на большее количество методов и присвоить имена им правильно.
i
если у меня есть вложенный цикл, а затем j
.
Это соглашение настолько распространено, что если вам удастся встретить переменную i
в блоке кода, который вы не можете видеть в начале, вы все равно мгновенно узнаете его, что это такое.
Я использую i, ii, iii, iv, v... Никогда не получал выше, чем iii.
Я использую одиночные буквы, только когда счетчик циклов является индексом. Мне нравится думать о двойной букве, но это делает код довольно нечитаемым.
Если счетчик должен использоваться как индекс для контейнера, я использую i
, j
, k
.
Если он используется для итерации по диапазону (или выполнения заданного количества итераций), я часто использую n
. Хотя, если требуется вложение, я обычно вернусь к i
, j
, k
.
В языках, которые предоставляют конструкцию foreach
-style, я обычно пишу так:
foreach widget in widgets do
foo(widget)
end
Я думаю, что некоторые люди скажут мне про именование widget
так же, как и widgets
, но я считаю его вполне читаемым.
Как и предыдущий плакат, я также использую ii, jj,.. главным образом потому, что во многих шрифтах один элемент я очень похож на 1.
Стив Макконнелл Code Complete имеет, как обычно, отличный совет в этом отношении. Соответствующие страницы (в первом издании в любом случае) равны 340 и 341. Определенно советуйте всем, кто заинтересован в улучшении их кодирования в цикле, чтобы придать этому вид. McConnell рекомендует значащие имена счетчиков циклов, но люди должны читать то, что он получил, чтобы сказать сами, а не полагаться на мое слабое резюме.
Я использую "counter" или "loop" как имя переменной. Современные IDE обычно выполняют завершение слова, поэтому более длинные имена переменных не так утомительны в использовании. Кроме того, чтобы назвать переменную своей функциональностью, она дает понять программисту, который будет поддерживать ваш код в отношении ваших намерений.
Я давно использовал схему именования i/j/k. Но в последнее время я начал адаптировать более последовательный метод именования.
Я все уже назвал все мои переменные по его значению, поэтому почему бы не назвать переменную цикла одним и тем же детерминированным способом.
В соответствии с запросом несколько примеров:
Если вам нужна петля через коллекцию элементов.
for (int currentItemIndex = 0; currentItemIndex < list.Length; currentItemIndex++)
{
...
}
Но я стараюсь избегать нормальных циклов, потому что я предпочитаю, чтобы реальный элемент в списке и использовал его, а не фактическую позицию в списке. поэтому вместо начала для блока с:
Item currentItem = list[currentItemIndex];
Я пытаюсь использовать конструкцию foreach для языка. который преобразует.
for (int currentItemIndex = 0; currentItemIndex < list.Length; currentItemIndex++)
{
Item currentItem = list[currentItemIndex];
...
}
в
foreach (Item currentItem in list)
{
...
}
Это облегчает чтение, потому что выражается только реальный смысл кода (обрабатываются элементы в списке), а не то, как мы хотим обрабатывать элементы (сохраняйте индекс текущего элемента en, увеличивайте его до тех пор, пока он не будет достигает длины списка и, следовательно, означает конец коллекции предметов).
Единственный раз, когда я по-прежнему использую однобуквенные переменные, - это когда я занимаюсь измерениями прорубей. Но тогда я буду использовать x, y и иногда z.
В Perl стандартное имя переменной для внутреннего цикла $_. Операторы для, foreach и while по умолчанию используют эту переменную, поэтому вам не нужно ее объявлять. Обычно $_ может читаться как родовое местоимение "it". Итак, довольно стандартный цикл может выглядеть так:
foreach (@item){
$item_count{$_}++;
}
На английском языке это означает:
Тем не менее, более распространенным является не использование переменной вообще. Многие функции и операторы Perl по умолчанию имеют значение $_:Для каждого элемента добавьте его item_count.
for (@item){
print;
}
На английском языке:
Для пункта [each] напечатайте [it].
Это также стандарт для счетчиков. (Но счетчики используются гораздо реже в Perl, чем на других языках, таких как C). Поэтому для печати квадратов целых чисел от 1 до 100:
for (1..100){
print "$_*$_\n";
}
Поскольку только один цикл может использовать переменную $_, обычно она используется во внутреннем цикле. Это использование соответствует тому, как обычно работает английский:
Для каждого автомобиля посмотрите на каждую шину и проверьте ее давление.
В Perl:
foreach $car (@cars){
for (@{$car->{tires}}){
check_pressure($_);
}
}
Как и выше, лучше использовать более длинные описательные имена во внешних циклах, так как в длинном блоке кода трудно запомнить, что действительно означает общее имя переменной цикла.
Иногда имеет смысл использовать более короткие, не описательные, общие имена, такие как $i, $j и $k, а не $_ или описательное имя. Например, полезно использовать переменные в опубликованном алгоритме, например cross product.
@JustMike., НЕПРАВИЛЬНЫЕ ПРИМЕРЫ:., для сопровождения Java.
Цикл NON-NESTED:., ограничение по возможности
/*LOOP_DESCRIPTION*/ {
int i;
for (i = 0; i < LOOP_LENGTH; i++) {
// loop body
}
}
Цикл NESTED:., то же самое
/*LOOP_DESCRIPTION*/ {
int row, column;
for (row = 0; row < ROWS; row++) {
for (column = 0; column < COLUMNS; column++) {
// loop body
}
}
}
Одна хорошая вещь в этом макете - это плохо читать без комментариев, тем самым поощряя их.
Это может быть, возможно, но лично это то, как я делаю петли на C.
Кроме того: когда я начал, я использовал "index" и "idx", но это обычно менялось на "i" моими сверстниками.
Первое правило состоит в том, что длина имени переменной должна соответствовать области действия переменной. Второе правило заключается в том, что значимые имена делают ошибки более мелкими. Третье правило состоит в том, что если вы хотите добавить комментарий к имени переменной, вы выбрали неправильное имя переменной. Окончательное правило выполняется, как это делают ваши товарищи по команде, если оно не противодействует прежним правилам.
Независимо от того, что вы выбираете, последовательно используйте один и тот же индекс в своем коде везде, где он имеет то же значение. Например, чтобы пройти через массив, вы можете использовать i
, jj
, kappa
, что угодно, но всегда делайте это одинаково везде:
for (i = 0; i < count; i++) ...
Лучшая практика заключается в том, чтобы эта часть цикла выглядела одинаково во всем вашем коде (в том числе последовательно используя count
как предел), так что это становится идиомой, которую вы можете пропустить мысленно, чтобы сосредоточиться на мясо кода, тело цикла.
Аналогично, если вы просматриваете 2d-массив пикселей, например, вы можете написать
for (y = 0; y < height; y++)
for (x = 0; x < width; x++)
...
Просто сделайте то же самое в каждом месте, где вы пишете этот тип цикла.
Вы хотите, чтобы ваши читатели могли игнорировать настройку бурения и видеть блеск того, что вы делаете в фактическом цикле.
Я также использую соглашение с двумя буквами. ii, jj, kk. вы можете grep те, и не придумать кучу нежелательных матчей.
Я думаю, что использование этих букв, даже если они удваиваются, - лучший способ пойти. это привычная конвенция, даже с удвоением.
есть много, чтобы сказать, чтобы придерживаться конвенций. это делает вещи намного более удобочитаемыми.
Я начал использовать perlisms в php.
если его особая итерация $_
является хорошим именем для тех, кто знает ее использование.
Моя привычка состоит в том, чтобы использовать 't' - близко к 'r', поэтому он легко следует после ввода 'for'
Если это простой счетчик, я придерживаюсь использования 'i' в противном случае, имеет имя, которое обозначает контекст. Я склонен сохранить переменную длину до 4. Это в основном с точки зрения чтения кода, запись не считается, поскольку у нас есть функция автоматического завершения.
Я начал использовать контекстно-зависимые имена переменных цикла, смешанные с hungarian.
При переходе по строкам я использую iRow
. При переходе по столбцам я использую iCol
. При переходе через автомобили я буду использовать iCar
. Вы получаете идею.
для численных вычислений, matlab и подобных ему, не используйте i, j
это зарезервированные константы, но Matlab не будет жаловаться.
Мои личные favs
индекс первая секунда счетчик кол
Мое любимое соглашение для петли над матричным набором - использовать x + y, поскольку они используются в декартовых координатах:
for x in width:
for y in height:
do_something_interesting(x,y)
Я обычно использую:
for(lcObject = 0; lcObject < Collection.length(); lcObject++)
{
//do stuff
}
Для целых чисел я использую int index, если он не вложен, тогда я использую индексный суффикс над тем, что повторяется как int groupIndex и int userIndex.
В Python я использую i, j и k, если я только время подсчитываю. Я использую x, y и z, если счетчик итераций используется в качестве индекса. Однако, если я действительно создаю ряд аргументов, я буду использовать значащее имя.