2010-05-21 50 views
11

可能重复:
Is a variable named i unacceptable?
What is an ideal variable naming convention for loop variables?int i vs int index等哪一个更好?

从C背景我一直使用int i为通用的循环变量来了。当然,在大的嵌套循环或其他复杂的东西中,我可能会使用一个描述性名称,但是您最喜欢看哪一个?

int i; 
for(i=0;i<Controls.Count;i++){ 
    DoStuff(Controls[i]); 
} 

int index; 
for(index=0;index<Controls.Count;index++){ 
    DoStuff(Controls[index]); 
} 

在当前项目中,我的工作也有这两种风格和指数ndx所取代。

哪一个更好? i变量是否通用?那么其他C风格的名字呢? i, j, k这些都应该被实际的描述性变量替代吗?

+3

ndx是否真的比我或索引更具描述性?或者它只是对输入字符数量的妥协? ;) – 2010-05-22 00:06:52

+0

我觉得'ind'比'ndx'更直接,即使它只有相同数量的字符。 – Ponkadoodle 2010-05-22 00:09:02

+0

@Tuzo不问我。一个人是Delphi程序员,所以也许在那里更正常?我相信我已经看到'idx'和'ndx'。 – Earlz 2010-05-22 00:11:34

回答

14

i然而,在第一个循环方面是相当标准的,其次是内部循环的j和内部循环的k,依此类推。

就像几乎所有的命名规则一样,只要它在项目中是标准的,并且对所有成员都适用,那就没问题。

+0

我不知道“等等”一点。进入四个级别可能需要重新考虑设计。另外,'l'在任何情况下都是一个可怕的变量名称(一种天然屏障:-)。 – 2010-05-22 00:24:46

+0

@Marcelo:当然。我实际上是用'k'开始循环,然后进入'm'和'n',我从来不需要第四个:如果你的矩阵是列主要的,那么不需要第四个:P – 2010-05-22 01:06:05

+0

。在线性代数世界中,m和n对于维度来说非常标准,而不是运行变量(它们是i,j,k)。 – Anycorn 2010-05-22 01:59:54

8

如果可能,我喜欢描述性名称,因为我们应该争取可读的代码。

对于在紧密代码块中使用的临时变量,可以使用短变量名称。

但是,如果循环或代码块非常长,最好有一个更长的描述性变量名称,如果没有其他原因,它会使文本搜索更容易。

+1

'i'是一个标准索引变量,在任何循环结构中都应该可以识别。 – Jason 2010-05-22 03:13:59

1

如果它是小块,并且没有嵌套for循环,我很好,它几乎是不成文的规则,我是一个循环增量变量,只要它出现。在一切更复杂的情况下,好的命名至关重要。

2

说到命名,这都是关于清晰度。我认为大多数看代码的人都知道“int i”是某种索引,但他们可能认为这是一种普通的旧式香草用法。所以如果它做了一些聪明的事情(即不仅仅是简单的计数),你应该把它叫做事实清楚。

1

就我个人而言,我使用i,j,而不是循环变量,我倾向于尝试和当语言允许它 - 我发现,甚至更好。

+0

当然可以,但这与我在C和C#中的编码有关,甚至可能与Ruby – Earlz 2010-05-22 00:07:25

+0

+1有关。如果不需要索引并且语言支持集合迭代,那么即使速度较慢,我也更喜欢它。 – Anurag 2010-05-22 00:20:42

5

如果您正在执行嵌套循环以访问多维数组元素,则描述性迭代器名称是创建自我评论代码的必备条件。 例如,

for(int i=0;i<someMax;i++){ 
    for(int j=0;j<someOtherMax;j++){ 
    DoStuff(someArray[i,j]); 
    } 
} 

for(int row=0;row<someMax;row++){ 
    for(int column=0;column<someOtherMax;column++){ 
    DoStuff(someArray[row,column]); 
    } 
} 
+0

你的意思是像“行,列”? – Earlz 2010-05-22 00:07:54

+1

伪代码遵循您希望的任何约定 - 仅将它切换为逗号就是因为。 – jball 2010-05-22 00:10:07

+0

如果您有三维数组或三个嵌套循环(矩阵矩阵乘),该怎么办?我认为i,j,k是一样的描述性,你可以是 – Anycorn 2010-05-22 02:01:30

0

我从来不是一个简单的原因使用单字母的变量名 - 你曾经试过搜索某个变量中出现的所有文件,或在多个文件?最好使用一些不太模糊,更容易搜索的东西。

+3

如果您的单字母标识符总是被限定范围,那么搜索它们的所有事件都没有意义。 :) – 2010-05-22 01:55:35

1

我经常使用xy作为当我解析像位图一样的二维对象时的情况。

for (int (y = 0; y < height; y++) 
{ 
    for (int x = 0; x < width; x++) 
    { 
     // work 
    } 
} 
3

我使用单字母变量作为计数器很多。 这里是我怎么循环,详尽地使用字母在字母表:

for (int i = 0, l = array.length; i < l; i ++) { 
    for (int j = 0, m = array[i].length; j < m; j ++) { 
    for (int k = 0, n = array[i][j].length; k < n; k ++) { 
     for (int o = 0, p = array[i][j][k].length; o < p; o ++) { 
     for (int q = 0, r = array[i][j][k][o].length; q < r; q ++) { 
      for (int s = 0, t = array[i][j][k][o][q].length; s < t; s ++) { 
      for (int u = 0, v = array[i][j][k][o][q][s].length; u < v; u ++) { 
       for (int w = 0, x = array[i][j][k][o][q][s][u].length; w < x; w ++) { 
       for (int y = 0, z = array[i][j][k][o][q][s][u][w].length; y < z; y ++) { 
        f(array[i][j][k][o][q][s][u][w][y]); 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+8

真棒+1现在,如果这将是'阵列[国家] [州] [县] [城镇] [街道] [建筑物] [家] [居民] [0] [名称]',我会被困住。 – Anurag 2010-05-22 00:18:20

+3

哦,我的上帝是恐怖! – Earlz 2010-05-22 00:22:48

+2

更不用说,l,m,n,p,r,t,v和x吸取为循环变量的事实。 – Anurag 2010-05-22 00:24:03

4

短变量名是伟大的,但他们应该有小的范围。他们应该遵守该语言的惯例。直到有一天我一天,我的Haskell和ML代码将函数值的变量fgh和一元计算m,unnknown型ab的变量,并列出了未知的元素类型asbs的。但这些变量的范围将局限于短函数或where子句。

我的C代码将有变量称为ijpqst。但是这些变量的范围将局限于单个循环(所有赞扬C99和C++ backports!)或简短函数。无论是循环索引还是其他变量,出现在大范围内的东西都会获得更长的名称。

+0

怎么没有'r'变量? – Anycorn 2010-05-22 02:03:16

3

项目的可见性的范围应该说明名称需要是如何描述的。

如果你真的有一个小循环,i,j和k是很好的典型指标计数器。有时候一个更具描述性的名字可以帮助说明意图,但是如果for循环的设置类似于以下内容,那么更具描述性的名称并不重要。

for (int i = 0; i < totalCount; ++i) 
{ 
    Thing& myThing = things[i]; 

    // do stuff with myThing, never refer to i again 
} 

这就是说,缩写不应该被使用,除非他们一贯使用。我个人认为ndx是一个可怕的标识符,因为它很难打字;我可以很好地输入英文,而且编程速度不受我输入速度的限制。如果你想说indexindex

我相信这是在语用程序员,他们说你不应该使用缩写,因为那样人们永远不会知道使用什么缩写。我知道我想要一个名为index的东西,所以我键入index但我得到一个编译器错误。怎么办? (通过代码寻找,发现它写ndx会打扰我。)

当我试图想一想,关于我使用的唯一不是游戏特定的缩写是'num'来代表' numberOf”。除此之外,我使用'npc'表示非玩家角色,'ai'表示人工智能等等,有时我使用小块的缩写,例如在摄像头上操作的10线功能可能只是称其为“凸轮”,但范围很小,因此很容易看出发生了什么,并且混淆的可能性有限。

所以 - 小范围 - >做任何你喜欢的事情(只要有一定的一致性)。大范围 - >让你的名字毫不含糊,有意义且易于输入。 (通过“易于输入”我的意思是“容易记住如何拼写”以及“不要过度”)。