【问题标题】:int i vs int index etc. Which one is better? [duplicate]int i vs int index 等。哪个更好? [复制]
【发布时间】:2010-05-21 23:55:58
【问题描述】:

可能的重复:
Is a variable named i unacceptable?
What is an ideal variable naming convention for loop variables?

来自 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所有这些都应该被实际的描述性变量代替吗?

【问题讨论】:

  • ndx 真的比 i 或 index 更具描述性吗?还是只是对输入字符数的妥协? ;)
  • 我认为indndx 更直接,尽管字符数相同。
  • @Tuzo 不要问我。一个人是德尔福程序员,所以也许那里更正常?我相信我已经看到 idxndx 都使用了。
  • 我讨厌ind——一个我共事过的人一直在使用它,但有时它意味着“索引”,而其他时候它意味着“指标”。指标有时是布尔值(标志),有时是整数(但不一定是任何事物的索引)。他的不良做法永远让我“觉得”模棱两可。我会使用普通的i 来处理简单的事情、迭代循环等,或者使用somethingIndex 来处理索引可能不一定会简单增加的更复杂的事情。

标签: variables coding-style iterator naming-conventions


【解决方案1】:

然而,i 就第一个循环而言是相当标准的,然后是 j 用于内部循环,k 用于内部循环,依此类推。

与几乎所有命名规则一样,只要它在项目中是标准的,并且适用于其中的所有成员,就可以了。

【讨论】:

  • 我不知道“等等”位。进入四个级别可能需要重新考虑设计。另外,l 在任何上下文中都是一个可怕的变量名称(一种天然屏障:-)。
  • @Marcelo:当然。我实际上用k 开始循环,然后继续mn,我从来不需要第四个:P
  • 如果您的矩阵是列专业的,则不会。在线性代数世界中,m 和 n 几乎是维度的标准,而不是运行变量(即 i、j、k)
【解决方案2】:

如果可能,我倾向于使用描述性的名称,因为我们应该努力获得可读的代码。

对于在紧凑代码块中使用的临时变量,短变量名是可以接受的。

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

【讨论】:

  • i 是一个标准的索引变量,几乎可以在任何循环结构中识别。
【解决方案3】:

如果您使用嵌套循环来访问多维数组元素,则必须使用描述性迭代器名称来创建自注释代码。 例如,

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]); 
  }
} 

【讨论】:

  • 你的意思是像row,column 吗?
  • 伪代码遵循您希望的任何约定 - 将其切换为逗号只是因为。
  • 如果你有三维数组或三个嵌套循环(矩阵矩阵乘法)怎么办?我认为 i,j,k 尽可能地具有描述性
  • @aaa,在某些情况下确实如此,但在大多数情况下,我认为可以选择描述性嵌套迭代器名称。
  • r,c 是两全其美的,恕我直言。几乎不言自明,但简短而甜蜜。
【解决方案4】:

短变量名很好,但它们的作用域应该很小。他们应该尊重语言的惯例。直到今天,我的 Haskell 和 ML 代码将包含函数值变量 fgh 和一元计算 m,未知类型的变量 ab,以及列表未知元素类型asbs。但这些变量的作用域将仅限于短函数或where 子句。

我的 C 代码将包含名为 ijpqst 的变量。但是这些变量的范围将被限制在单个循环(都称赞 C99 和 C++ 反向移植!)或短函数。无论是循环索引还是其他变量,出现在大范围内的东西都会得到更长的名称。

【讨论】:

    【解决方案5】:

    我经常使用单字母变量作为计数器。 以下是我如何循环,详尽地使用字母表中的字母:

    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]);
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    

    【讨论】:

    • 真棒 +1.. 现在如果那是 array[country][state][county][town][street][building][house][residents][0][name],我会被难住的。
    • 更不用说 l、m、n、p、r、t、v 和 x 作为循环变量了。
    • 看起来像 perl 的形状很好。
    • 我编写了一段代码,他们使用 a,r,s,e 作为变量。它在内循环中拼出了 a[r][s] = e。仍然不确定这是不是故意的。
    • 我的眼睛 OH GODMYEYESWHYARETHEYBURNING THE GOGGLES 他们什么都不做
    【解决方案6】:

    项目的可见性范围应决定该名称​​需要的描述性。

    如果你真的有一个小循环,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

    我相信在 The Pragmatic Programmer 中他们说你不应该使用缩写,因为那样人们永远不知道该使用什么缩写。我知道我想要一个名为index 的东西,所以我输入了index,但我得到了一个编译器错误。怎么办? (翻遍代码发现它写的是ndx会打扰我。)

    当我尝试思考时,我使用的唯一一个非游戏特定的缩写是“num”来代表“numberOf”。除此之外,我用“npc”表示非玩家角色,“ai”表示人工智能等,有时我在小块中使用缩写,例如。在相机上运行的 10 行函数可能只是将其称为“cam”,但范围很小,因此很容易看到发生了什么,并且混淆的可能性有限。

    那么小范围 -> 做任何你喜欢的事(只要有一些一致性)。大范围 -> 使您的名称明确、有意义且易于输入。 (我所说的“易于输入”是指“易于记住如何拼写”以及“不要太过分”。)

    【讨论】:

      【解决方案7】:

      在命名方面,一切都是为了清晰。我想说大多数看代码的人都知道“int i”是某种索引,但他们可能认为这是一种普通的老式香草用法。因此,如果它做了一些聪明的事情(即不仅仅是简单的数数),你应该称它为能明确这一事实的东西。

      【讨论】:

        【解决方案8】:

        如果它是小块,并且没有嵌套的for循环,i就可以了,几乎不成文的规则i是一个循环增量变量,只要它出现。在更复杂的事情中,良好的命名至关重要。

        【讨论】:

          【解决方案9】:

          我个人使用 i,j 而不是循环变量,我倾向于在语言允许的情况下尝试使用 for each - 我发现这样更好。

          【讨论】:

          • 当然可以,但这与我在 C 和 C# 中的编码有关,甚至可能是一点 Ruby
          • +1 .. 如果不需要索引并且语言支持集合迭代,我更喜欢它,即使它更慢。
          【解决方案10】:

          在解析位图等二维对象时,我经常使用xy

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

          【讨论】:

            【解决方案11】:

            我从不使用单字母变量名,原因很简单——您是否曾尝试在文件中或跨多个文件搜索某个变量的所有出现?最好使用一些不那么含糊且更易于搜索的内容。

            【讨论】:

            • 如果你的单字母标识符的范围总是很窄,那么搜索它们的所有出现是没有意义的。 :)
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-07-05
            • 1970-01-01
            • 2014-01-30
            • 2021-07-31
            • 1970-01-01
            • 2012-12-08
            • 1970-01-01
            相关资源
            最近更新 更多