jus*_*ike 44 language-agnostic naming-conventions
如果您正在编写一个简单的小循环,那么您应该为计数器命名什么?
提供示例循环!
Pau*_*son 40
我总是使用一个有意义的名字,除非它是一个单级循环,并且变量除了"我经历过这个循环的次数"之外没有任何意义,在这种情况下我使用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;
}
Run Code Online (Sandbox Code Playgroud)
而使用有意义的名称更容易:
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;
}
Run Code Online (Sandbox Code Playgroud)
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"一词唯一地指数组位置,除非应用程序的域位于数据库引擎设计,金融市场或类似领域.
我上面的例子就像我能做到的那样小,因此有些人可能没有看到描述性地命名变量的重点,因为他们可以一次性掌握整个函数.然而,在实际代码中,函数会更大,逻辑更复杂,因此正确的名称对于提高可读性和避免错误变得更加重要.
总之,我对所有变量命名(不仅仅是循环)的目标是完全明确的.如果有人读取我的代码的任何部分并且无法立即计算变量是什么,那么我就失败了.
m_p*_*tor 36
1)对于普通的旧式小循环 - i,j,k - 如果你需要3级以上的嵌套循环,这意味着算法非常具体和复杂,要么你应该考虑重构代码.
Java示例:
for(int i = 0; i < ElementsList.size(); i++) {
Element element = ElementsList.get(i);
someProcessing(element);
....
}
Run Code Online (Sandbox Code Playgroud)
2)对于新风格的java循环for(Element element: ElementsList),最好使用普通的meanigful名称
Java示例:
for(Element element: ElementsList) {
someProcessing(element);
....
}
Run Code Online (Sandbox Code Playgroud)
3)如果可以使用您使用的语言,请将循环转换为使用迭代器
Java Iterator示例:单击此处
And*_*NER 12
非嵌套循环:...指数是一个值.
...使用
i,就像在代数,是最常见的做法...
for (int i = 0; i < LOOP_LENGTH; i++) {
// LOOP_BODY
}
Run Code Online (Sandbox Code Playgroud)
嵌套循环:...区分指数有助于理解.
...使用描述性后缀...
for (int iRow = 0; iRow < ROWS; iRow++) {
for (int iColumn = 0; iColumn < COLUMNS; iColumn++) {
// LOOP_BODY
}
}
Run Code Online (Sandbox Code Playgroud)
foreach循环:...一个Object需要一个名字.
...使用描述性名称...
for (Object something : somethings) {
// LOOP_BODY
}
Run Code Online (Sandbox Code Playgroud)
for循环:...迭代器引用对象.迭代器它既不是; 索引,也不是指数.
...
iter减少迭代器的目的...
for (Iterator iter = collection.iterator(); iter.hasNext(); /* N/A */) {
Object object = iter.next();
// LOOP_BODY
}
Run Code Online (Sandbox Code Playgroud)
while循环:...限制迭代器的范围.
...评论循环的目的...
/* LOOP_DESCRIPTION */ {
Iterator iter = collection.iterator();
while (iter.hasNext()) {
// LOOP_BODY
}
}
Run Code Online (Sandbox Code Playgroud)
最后一个例子没有评论就读得很糟糕,从而鼓励他们. 它可能很冗长,但在C中的范围限制循环中很有用.
jus*_*ike 11
我的经验是,大多数人使用单个字母,如:
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;
} ● }
} ● }Run Code Online (Sandbox Code Playgroud)
如果利益不是很明显:在代码中搜索任何单个字母会发现许多不是您正在寻找的东西.这封信i经常出现在代码中,它不是您正在寻找的变量.