就变量命名约定而言,迭代器应该命名为i
还是更像count
这样的语义?如果您不使用i
,为什么不呢?如果您认为i
是可接受的,是否存在不应使用迭代的情况?
答案 0 :(得分:35)
取决于我想的背景。如果你在某些环境中循环一组对象 然后从上下文中你应该做的很明显。
for(int i = 0; i < 10; i++)
{
// i is well known here to be the index
objectCollection[i].SomeProperty = someValue;
}
但是,如果从上下文中不能立即清楚它正在做什么,或者如果您正在对索引进行修改,则应使用更能说明用法的变量名称。
for(int currentRow = 0; currentRow < numRows; currentRow++)
{
for(int currentCol = 0; currentCol < numCols; currentCol++)
{
someTable[currentRow][currentCol] = someValue;
}
}
答案 1 :(得分:15)
“i”表示“循环计数器”给程序员。它没有错。
答案 2 :(得分:6)
这是另一个完全没问题的例子:
foreach (Product p in ProductList)
{
// Do something with p
}
答案 3 :(得分:5)
我倾向于使用i,j,k进行非常局部化的循环(仅在源行数量方面存在很短的时间)。对于存在于较大源区域的变量,我倾向于使用更详细的名称,因此我可以在不回溯代码的情况下查看它们的用途。
顺便说一句,我认为这些命名约定来自早期的Fortran语言,我是第一个整数变量(A - H是浮点数)?
答案 4 :(得分:3)
我很普遍,即使对喜欢描述性变量名的人也是可以接受的。
绝对不可接受的(在我的书中犯了罪)在任何其他环境中使用i,j或k而不是循环中的整数索引....例如
foreach(Input i in inputs)
{
Process(i);
}
答案 5 :(得分:3)
i
是可以接受的。但是,我从一位C ++老师那里学到了一个巨大的学期,这位老师拒绝了每个变量都没有描述性名称的代码。描述性地命名一切的简单行为迫使我更加努力地思考我的代码,并且在课程之后编写了更好的程序,而不是学习C ++,而是学习命名一切。 代码完成在同一主题上有一些好词。
答案 6 :(得分:3)
我很好,但是这样的事情不是:
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
string s = datarow[i][j].ToString(); // or worse
}
}
程序员无意中交换代码中的i和j非常常见,特别是如果他们的视力不好或者他们的Windows主题是“热狗”。这对我来说总是一个“代码味道” - 如果不搞砸的话,这种情况很少见。
答案 7 :(得分:2)
我绝对可以接受。不知道我需要做出什么样的理由 - 但我一直都在使用它,而其他非常受尊敬的程序员也会这样做。
社交验证,我猜:)
答案 8 :(得分:2)
是的,实际上它是首选,因为任何阅读代码的程序员都会理解它只是一个迭代器。
答案 9 :(得分:2)
使用i而不是更具体的变量名称有什么价值?要节省1秒或10秒,或者可能,甚至30秒的思考和打字?
使用i的费用是多少?也许没什么。也许代码很简单,使用我很好。但也许,也许,使用i将迫使未来使用此代码的开发人员不得不思考一下“我的意思是什么?”他们将不得不思考:“它是一个指数,一个计数,一个偏移,一个标志?”他们将不得不思考:“这种变化是否安全,是否正确,我会在1岁之前离开吗?”
使用i在编写代码时节省了时间和智力,但最终可能会花费更多的智力,或者甚至可能导致由于误解代码而无意中引入缺陷。
一般来说,大多数软件开发都是维护和扩展,因此阅读代码所花费的时间将大大超过编写代码所花费的时间。
很容易养成在任何地方使用有意义的名字的习惯,一旦你有这种习惯,用有意义的名字编写代码只需要几秒钟,但是你的代码更容易阅读,更容易理解,更明显是正确的。
答案 10 :(得分:2)
我用i做短循环。
之所以可以,我发现有人可以看到迭代器类型的声明,使用初始化器,然后三行后来声称不清楚变量代表什么是完全不可信的。他们只是假装,因为他们认为“有意义的变量名称”必须意味着“长变量名称”。
我实际上这样做的原因是,我发现使用与手头的特定任务无关的东西,并且我只会在小范围内使用,这让我担心我可能会使用一个误导性的名称,或者有些模糊,或者有一天会对更大范围内的其他东西有用。它是“我”而不是“q”或“伯爵”的原因只是从数学中借用的惯例。
我不使用i:
只要增量一致且清晰,我不一定要以1为增量,当然可能在迭代符结束之前停止,但是如果它改变了方向,或者没有通过迭代修改循环(包括在前进循环中使用iterator.insertAfter()的恶魔),我试着记住使用不同的东西。这表示“这不仅仅是一个简单的循环变量,因此这可能不是一个简单的循环”。
答案 11 :(得分:1)
如果“更多语义”是“迭代器”,那么就没有理由不使用i;这是一个很好理解的习语。
答案 12 :(得分:1)
我认为我在for循环情况下完全可以接受。我总是发现这是非常标准的,并且在我在这个实例中使用时从未真正遇到过解释问题。 foreach-loops变得有点棘手,我认为真的取决于你的情况。我很少在foreach中使用i,只在for循环中,因为我发现在这些情况下我的描述性太强。对于foreach,我尝试使用循环的对象类型的缩写。 e.g:
foreach(DataRow dr in datatable.Rows)
{
//do stuff to/with datarow dr here
}
无论如何,只需我0.02美元。
答案 13 :(得分:0)
只要您在一个简单的循环中暂时使用它,并且显然您正在做什么,当然。那就是说,你可以使用其他简短的词吗?
i
被广泛称为循环迭代器,因此如果你在循环之外使用它,你实际上更容易混淆维护程序员,但是如果你使用更具描述性的东西(比如filecounter
),它使代码更好。
答案 14 :(得分:0)
我的感觉是,使用单个字母的概念对于“简单”循环来说是好的,但是,我学会了很久以前使用双字母而且效果很好。< / p>
上周我问过similar question,以下是my own answer的一部分:
// 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
经常出现在代码中,而不是您正在寻找的变量。
我已经这样做了至少10年。
请注意,很多人评论说,上述任何一个/两个都是“丑陋的”......
答案 15 :(得分:0)
对INTEGER循环计数器使用i,j,k可以追溯到FORTRAN的早期阶段 就个人而言,只要他们是INTEGER计数,我就没有问题 但后来我在FORTRAN长大了!
答案 16 :(得分:0)
这取决于。
如果您正在迭代某些特定的数据集,那么我认为使用描述性名称更有意义。 (例如,Dan建议的filecounter
)。
但是,如果您正在执行任意循环,则可以接受i
。正如一位工作伙伴向我描述的那样 - i
是一种惯例,意味着“这个变量只能被for
循环结构修改过。如果不是这样,请不要使用i
“
答案 17 :(得分:0)
如果您将其命名为描述循环内容的内容,则会有所帮助。但我通常只使用i。
答案 18 :(得分:0)
我应该指出,i和j也是矩阵指数的数学符号。通常,你是在一个数组上循环。所以这很有道理。
答案 19 :(得分:0)
只要您使用i来计算循环,或者将索引的一部分从0(或1取决于PL)变为n,那么我会说我很好。
否则它可能很容易为我命名一些有意义的东西,它不仅仅是一个索引。
答案 20 :(得分:-1)
我会反对这种说法并拒绝。
对于那些说“我被理解为迭代器”的人群,这可能是真的,但对我来说,这相当于像将值5赋值给变量Y这样的变量。像注释这样的变量名称应该解释为什么/什么不是如何。
使用上一个答案中的示例:
for(int i = 0; i < 10; i++)
{
// i is well known here to be the index
objectCollection[i].SomeProperty = someValue;
}
使用像这样有意义的名字会难得多吗?
for(int objectCollectionIndex = 0; objectCollectionIndex < 10; objectCollectionIndex ++)
{
objectCollection[objectCollectionIndex].SomeProperty = someValue;
}
当然,(借来的)变量名称objectCollection的命名也非常糟糕。