如果您正在编写一个简单的小循环,那么您应该为计数器命名什么?
提供示例循环!
我总是使用一个有意义的名字,除非它是一个单级循环,并且变量除了"我经历过这个循环的次数"之外没有任何意义,在这种情况下我使用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是小于的最大 imum(数)山口 UMN 小号 ";
iRow < MAX_COLS
充其量读作"的整数循环计数器为行是小于的最大 imum(数)山口 UMN 小号 ".
这可能是个人的事情,但我更喜欢第一次阅读.
row_num
我接受的另一种选择是row_idx
:"index"一词唯一地指数组位置,除非应用程序的域位于数据库引擎设计,金融市场或类似领域.
我上面的例子就像我能做到的那样小,因此有些人可能没有看到描述性地命名变量的重点,因为他们可以一次性掌握整个函数.然而,在实际代码中,函数会更大,逻辑更复杂,因此正确的名称对于提高可读性和避免错误变得更加重要.
总之,我对所有变量命名(不仅仅是循环)的目标是完全明确的.如果有人读取我的代码的任何部分并且无法立即计算变量是什么,那么我就失败了.
1)对于普通的旧式小循环 - i,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 Iterator示例:单击此处
非嵌套循环:...指数是一个值.
...使用
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
经常出现在代码中,它不是您正在寻找的变量.
总是尝试将变量命名为有意义且在上下文中.
如果你不能决定,那么使用"索引",如果只是为了让其他人(也许你!)可以更容易点击它以便以后进行重构.
Paul Stephenson以一个例子来看这个答案.
我使用i,j,k(或r&c用于行列循环).如果在方法中需要三个以上的循环变量,则该方法可能太长且复杂,并且您的代码可能会从将方法拆分为更多方法并正确命名它们中获益.
i
如果我有一个嵌套循环然后也j
.
这个惯例是如此常见,如果你设法遇到i
代码块中的变量,你看不到你的开始仍然立即识别它是什么.
我使用i,ii,iii,iv,v ......但是,从来没有比iii更高.