如果你正在写一个简单的小环,你应该怎么命名柜台?
提供了示例循环!
如果你正在写一个简单的小环,你应该怎么命名柜台?
提供了示例循环!
我总是用一个有意义的名字 ,除非它是一个单级循环和变量没有比“的时候,我已经通过这个循环的数量”,在这种情况下,我用其他的意思i
。
当使用有意义的名称:
它可以是比较难找到,在使用单字母此嵌套循环的bug:
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
:单词“索引”唯一指向一个数组位置,除非应用程序的域是数据库引擎的设计,金融市场或类似的。
我上面的例子是小我可以使它的,因此有些人可能看不到描述性的命名变量的地步,因为他们可以在一个去在他们的头保持整体功能。 在实际的代码,但是,功能将更大,逻辑更复杂,所以体面的名字成为提高可读性和避免错误更重要。
总之,我所有的变量命名(不只是循环)的目标是完全明确的 。 如果有人读我的代码的任何部分,不能制定出一个变量是什么,立即,然后我失败了。
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的迭代器例子: 点击这里
非嵌套循环。 。 。 该指数是一个值。
。 。 。 使用
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
循环。 。 。 迭代器参考对象。 一个Iterator它既不; 索引,也不是指数之。
。 。 。
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.范围限制环路
我的经验是,大多数人使用单个字母,如: 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
在那里是不是你要找的变量经常出现在代码。
应尽量将命名变量一些有意义的事情,并在上下文中。
如果你不能决定,然后用“指数”,如果只让别人(也许你!)可以更轻松地点击它,供以后重构。
保罗·斯蒂芬森看到这个答案的一个例子。
我用I,J,K(或R c表示行-列循环)。 如果你需要在一个方法三个以上的循环变量 ,该方法可能过于漫长和复杂,你的代码可能会从分裂法成多种方法和正确 命名 受益 。
i
如果我有一个嵌套的循环然后也j
。
该公约是如此普遍,如果你设法遇到一个变量i
在一个代码块,你不能看到你开始还是一眼就能认出它是什么。
我用I,II,III,IV,V ...从来没有高于III,虽然。
我用单个字母,只有当循环计数器是一个索引。 我喜欢的双字母背后的思想,但它使代码不可读相当。
如果计数器将被用作索引到一个容器中,我使用的i
, j
, k
。
如果它是被用于迭代的范围内(或执行的迭代的一组数),所以经常使用n
。 不过,如果需要嵌套我通常会恢复到i
, j
, k
。
在其提供语言foreach
式的结构,我通常这样写:
foreach widget in widgets do
foo(widget)
end
我想有些人会告诉我关闭命名widget
等等类似widgets
,但我觉得相当的可读性。
像以前的海报,我也用II,JJ ..主要是因为在许多字体的单我看起来非常相似,1。
史蒂夫·麦康奈尔的代码完成了,像往常一样,在这方面的一些优秀建议。 相关网页(反正第一版)是340和341.当然建议任何人谁是有意提高循环编码给这个看看。 麦康奈尔建议有意义的循环计数器的名字,但人们应该先了解他有什么要说的,而不是依赖于我的弱点总结。
我用“计数器”或“循环”作为变量名。 现代IDE通常做的字完成,所以不再变量名是不繁琐的使用。 此外,它的功能使得它清楚谁去维护你的代码对你的意图是什么程序员来命名变量。
在Perl,对于内环标准变量名是$ _。 该对 , 的foreach,和while语句默认这个变量,所以你不需要申报。 通常情况下,$ _可读取喜欢中性通用代词“它”。 因此,一个相当标准的循环可能是这样的:
foreach (@item){
$item_count{$_}++;
}
在英语中,翻译为:
对于每个项目,增加它的ITEM_COUNT。
更常见的,但是,是不使用的变量都没有。 许多Perl的功能和运营商默认为$ _:
for (@item){
print;
}
用英语讲:
对于[各个]项,打印[它]。
这也是为了柜台的标准。 (但是,计数器比在其它语言如C通常远不如使用在Perl)。 所以,从1到100的整数打印的平方:
for (1..100){
print "$_*$_\n";
}
由于只有一个回路可以使用$ _变量,通常它是在最内层的循环使用。 这种用法相匹配的英语通常的工作方式:
对于每一辆汽车,看看每个轮胎并检查它的压力。
在Perl:
foreach $car (@cars){
for (@{$car->{tires}}){
check_pressure($_);
}
}
如上所述,这是最好的外循环使用的时间越长,描述性的名称,因为它很难在一个代码块长什么通用的循环变量名的真正含义记住。
偶尔,是有意义的使用更短的,非描述性,通用名称,如$ I,$ j和$ K,而不是$ _或描述性的名称。 举例来说,是非常有用的匹配变量发布的算法使用,如交叉产品 。
第一条规则是变量名的长度应该匹配变量的范围。 第二条规则是有意义的名字,让虫子更浅。 第三条规则是,如果你觉得自己添加注释,以一个变量名,你选择了错误的变量名。 最终规则是做作为你的队友,只要不抵消之前的规则。
@JustMike。 。 。 甲FEW 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
, jj
, kappa
,什么的,但总是做它无处不在,以同样的方式:
for (i = 0; i < count; i++) ...
最好的做法是使循环的这一部分看在你的代码相同的(包括持续使用count
为限),使之成为可以跳过精神,以专注于代码的肉的成语,体内循环。
同样,如果你通过像素的二维阵列走,比如,你可以写
for (y = 0; y < height; y++)
for (x = 0; x < width; x++)
...
只要做到这一点在每一个你写这种类型的循环的地方以同样的方式。
您希望您的读者可以忽略枯燥的设置和看到你在实际的循环做什么光彩。
我一直使用的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,有时ž。
我还使用双字母约定。 II,JJ,KK。 你可以grep的,而不是拿出了一堆不需要的比赛。
我想用这些字母,尽管他们增加了一倍,是最好的一段路要走。 这是一个熟悉的惯例,甚至翻倍。
有很多与公约坚持说。 这让事情变得更具有可读性。
我在PHP中使用perlisms开始。
如果它是一个单一的迭代, $_
是为那些谁知道它的用途一个好名字。
我的习惯是用“T” - 贴近“R”,所以它遵循容易“的” aftewr打字
如果它是一个简单的计数器,我坚持使用,否则“我”,有一个表示上下文名称。 我倾向于保持可变长度为4。这主要是从视图代码点读,写的不算,因为我们有自动完成功能。
我已经开始使用上下文相关的循环变量名与混合匈牙利 。
当通过行循环,我将使用iRow
。 当通过列循环,我将使用iCol
。 当通过汽车循环,我将使用iCar
。 你的想法。
用于数值计算,MATLAB,和它的喜欢,不使用I,J
这些被保留的常数,但MATLAB不会抱怨。
我个人的收藏是
指数的第一,第二计数器的计数
我最喜欢的遍历矩阵状集约定使用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索引,除非它是嵌套然后我用了什么东西被迭代如int对groupIndex和int userIndex索引后缀。
在Python中,我使用I,J和K,如果我只能通过计数倍。 我用x,y和z如果迭代计数被用来作为指标。 如果我确实产生了一系列的争论,但是,我会用一个有意义的名字。