尽变命名约定去,应该迭代被命名为 i 或更多的东西的语义喜欢 count?如果不使用 i, 为什么不呢?如果你觉得 i 是可以接受的,是有案件的迭代,它不应该被用来?

有帮助吗?

解决方案

取决于我想的背景。如果你在某些环境中循环一组对象 然后从上下文中你应该做的很明显。

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

其他提示

&QUOT; I&QUOT; 表示“循环计数器”给程序员。它没有错。

这是另一个完全没问题的例子:

foreach (Product p in ProductList)
{
    // Do something with p
}

我倾向于使用i,j,k进行非常局部化的循环(仅在源行数量方面存在很短的时间)。对于存在于较大源区域的变量,我倾向于使用更详细的名称,因此我可以在不回溯代码的情况下查看它们的用途。

顺便说一句,我认为这些命名约定来自早期的Fortran语言,我是第一个整数变量(A - H是浮点数)?

i 是可以接受的。但是,我从一位C ++老师那里学到了一个巨大的学期,这位老师拒绝了每个变量都没有描述性名称的代码。描述性地命名一切的简单行为迫使我更加努力地思考我的代码,并且在课程之后编写了更好的程序,而不是学习C ++,而是学习命名一切。 代码完成在同一主题上有一些好词。

很好,但是这样的事情不是:

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主题是“热狗”。这始终是“代码气味”。对我来说 - 如果没有搞砸的话,这种情况很少见。

我很普遍,即使对喜欢描述性变量名的人也是可以接受的。

绝对不可接受的(在我的书中犯了罪)在任何其他环境中使用i,j或k而不是循环中的整数索引....例如

foreach(Input i in inputs)
{
    Process(i);

}

我绝对可以接受。不知道我需要做出什么样的理由 - 但我一直都在使用它,而其他非常受尊敬的程序员也会这样做。

社交验证,我猜:)

是的,实际上它是首选,因为任何阅读代码的程序员都会理解它只是一个迭代器。

使用i而不是更具体的变量名称有什么价值?要节省1秒或10秒,或者可能,甚至30秒的思考和打字?

使用i的费用是多少?也许没什么。也许代码很简单,使用我很好。但也许,也许,使用我将强迫将来使用此代码的开发人员必须考虑一下“我在这里的意思是什么?”他们将不得不思考:“它是一个索引,一个计数,一个偏移,一个标志?”他们将不得不思考:“这种变化是否安全,是否正确,我会被1个人拒绝吗?”

使用i在编写代码时节省了时间和智力,但最终可能会花费更多的智力,或者甚至可能导致由于误解代码而无意中引入缺陷。

一般来说,大多数软件开发都是维护和扩展,因此阅读代码所花费的时间将大大超过编写代码所花费的时间。

很容易养成在任何地方使用有意义的名字的习惯,一旦你有这种习惯,用有意义的名字编写代码只需要几秒钟,但你会有更容易阅读,更容易理解的代码,更明显是正确的。

我用我的短循环。

原因,这是确定的是,我发现它完全不可信的,有人可能会看到一个宣言》的迭代的类型,与初始化程序,然后三行后要求,这是不明确的变量来表示的。他们只是假装的,因为他们已经决定,"有意义的变量名称中的"必须意味着"很长的变量名字"。

原因我实际上这样做,是我发现,使用一些无关的具体任务的手,我会永远只用于一个小的范围内,节省了我担心我可能会使用一个名称的误导性或不明确,或者有一天会被用于别的东西在更大的范围。原因是"我"而不是"q"或"计数",只是《公约》借鉴了数学。

我不会用我,如果:

  • 循环体是不小,或
  • 迭代没有任何其他提前(或退)从启动的范围内完成的循环:

我不一定必须走的增量1所以只要增加一致和清楚的,并且当然可能停止之前结束iterand,但如果它改变方向,或是未经修改通过一个循环(包括恶魔使用的迭代器。新段落()向前的循环)中,我试着记住使用的不同的东西。这个信号"这不只是一个简单的循环变量,因此这可能不是一个简单的循环"。

如果“更具语义性”,是“迭代器”那么没有理由不使用我;这是一个很好理解的习语。

我认为我在for循环情况下完全可以接受。我总是发现这是非常标准的,并且在我在这个实例中使用时从未真正遇到过解释问题。 foreach-loops变得有点棘手,我认为真的取决于你的情况。我很少在foreach中使用i,只在for循环中使用i,因为我发现在这些情况下我的描述性太强。对于foreach,我尝试使用循环的对象类型的缩写。 e.g:

foreach(DataRow dr in datatable.Rows)
{
    //do stuff to/with datarow dr here
}

无论如何,只需我0.02美元。

如果您将其命名为描述循环内容的内容,则会有所帮助。但我通常只使用i。

只要您使用i来计算循环,或者将索引的一部分从0(或1取决于PL)变为n,那么我会说我很好。

否则它可能很容易为我命名一些有意义的东西,它不仅仅是一个索引。

我应该指出,i和j也是矩阵指数的数学符号。通常,你是在一个数组上循环。所以这很有道理。

只要您在一个简单的循环中暂时使用它,并且显然您正在做什么,当然。那就是说,你可以使用其他简短的词吗?

i 被广泛称为循环迭代器,因此如果你在循环之外使用它,你实际上更容易混淆维护程序员,但如果你使用更具描述性的东西(比如 filecounter ),它使代码更好。

这取决于。 如果您正在迭代某些特定的数据集,那么我认为使用描述性名称更有意义。 (例如,Dan建议的 filecounter 。)

但是,如果您正在执行任意循环,那么 i 是可以接受的。正如一位工作伙伴向我描述的那样 - i 是一种惯例,意思是“此变量只能由 for 循环结构修改。如果不是这样,请不要使用 i &quot;

对INTEGER循环计数器使用i,j,k可以追溯到FORTRAN的早期阶段 就个人而言,只要他们是INTEGER计数,我就没有问题。
但后来我在FORTRAN长大了!

我的感觉是,使用单个字母的概念对于“简单”来说是好的。但是,我学会了很久以前使用双字母而且效果很好。

我上周询问了类似问题,以下内容是我自己的回答

// 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年。

请注意,很多人评论说,上述任何一个/两个都是“丑陋的”......

我会反对这种说法并拒绝。

对于那些说“我被理解为迭代器”的人群来说,这可能是真的,但对我而言,这相当于评论,例如'将值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的命名也非常糟糕。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top