【问题标题】:Loop iterator naming convention [closed]循环迭代器命名约定[关闭]
【发布时间】:2012-08-08 12:26:11
【问题描述】:

我们知道,不知何故,我们非常普遍地在循环中使用ij 变量。如果需要一个双 for 循环,很可能会使用如下内容:

for (int i = 0; i < n; i++)
{
    for (int j = 0; j < m; j++)
    {
        // do some stuff...
    }
}

但是,如果我需要在这些循环中使用第三个 for 循环,则我对第三个迭代器没有任何命名约定。我,可能使用以下变量:rkiijj 等...

第三个(等等...)循环的迭代器有命名约定吗?

【问题讨论】:

  • 我真诚地认为,如果你有 3 个这样的嵌套循环,你应该考虑“重构”而不是如何命名变量。
  • 逻辑将倾向于使用下一个字母 (k) ,也就是说 - @JoachimIsaksson 有一个很好的观点

标签: loops iterator naming-conventions


【解决方案1】:

对于可读性而言,最重要的应该是明显的名称
i 和 j 不是最明显的,但对于简单的情况可能没问题。考虑这个(诚然有些考虑不周)的例子;

static void Main(string[] args)
{
    for(int i = 0; i < 100; i++)
        for (int j = 0; j < 100; j++)
            for (int k = 0; k < 100; k++)
                Console.WriteLine("" + i + "-" + j + "-" + k);
}

static void Main(string[] args)
{
    for(int survey = 0; survey < 100; survey++)
        for (int question = 0; question < 100; question++)
            for (int option = 0; option < 100; option++)
                Console.WriteLine("" + survey + "-" + question + "-" + option);
}

很容易看出哪个更有意义。但是,当我们这样做时,如何使它更具可读性,同时进一步消除您的命名问题;

static void Main(string[] args)
{
    for(int survey = 0; survey < 100; survey++)
        PrintSurvey(survey);
}

private static void PrintSurvey(int survey)
{
    for (int question = 0; question < 100; question++)
        PrintQuestion(survey, question);
}

private static void PrintQuestion(int survey, int question)
{
    for (int option = 0; option < 100; option++)
        PrintOption(survey, question, option);
}

private static void PrintOption(int survey, int question, int option)
{
    Console.WriteLine("" + survey + "-" + question + "-" + option);
}

对于这个简单的循环来说可能有点矫枉过正/冗长,只是想说明有更多方法可以处理嵌套循环的命名问题,而不仅仅是找到唯一的名称。

【讨论】:

    【解决方案2】:

    对于这些事情没有既定的惯例。 i 适用于基本循环。对于更复杂的循环或实现一目了然的地方,您应该考虑明确命名迭代器,例如surveyIndexquestionIndex,而不是 ij

    【讨论】:

      【解决方案3】:

      在计算机视觉应用程序中看到嵌套循环并不少见,正如其他人所说,没有约定,至少在字母顺序上,但通常人们倾向于使用字母i,j,k,l,m,n,q,h...

      例如,这是用于过滤图像的二维离散卷积的可能实现:

      /* The Input image I and Output image O have M*N pixels.  
       * The kernel H has size (2k+1)*(2k+1)
       */
      for (i=k; i<M-k; i++) {
          for (j=k; j<N-k; j++) {
              temp=0;
              for (m=-k; m<=k; m++)
                  for (n=-k; n<=k; m++)
                      temp = temp + I[i-m,j-n] * H[m+k,n+k];
              O[i,j] = temp;
          }
      }
      

      Here 你可以看到另一个 C++ 实现。

      【讨论】:

        【解决方案4】:

        实际上我几乎从不使用 i,我更喜欢 cntindexid 之类的东西。一方面,cnt 仍然很短且可以快速输入。此外,人们在查看您的代码时会立即知道它是什么,它是一个计数器,最重要的是,当您尝试使用搜索类似 "i" 的东西时,您会得到很多您不想看到的垃圾

        include <iostream>
        
        int main ()
        
        //hi there, this is a comment
        
        for (int i = 0; i < 5; i++)
        

        如果你 Ctrl+F 使用 index 而不是 i,或者更是如此 cnt,你只会看到你期望的,因此导航起来更加舒适。

        对于更复杂的循环,尽管您绝对应该输入变量的全名,否则您只会让自己感到困惑

        【讨论】:

          猜你喜欢
          • 2015-03-02
          • 1970-01-01
          • 2010-10-29
          • 1970-01-01
          • 2016-12-25
          • 2010-09-11
          • 2011-10-21
          • 2010-10-15
          相关资源
          最近更新 更多