【问题标题】:naming convention of temp local variables临时局部变量的命名约定
【发布时间】:2009-09-01 11:50:35
【问题描述】:

在本地函数中命名临时变量的标准方法是什么?让我举例说明我在做什么。我得到一个指向结构的指针,所以我想在本地存储它的一个成员以避免取消引用,然后将任何修改分配回指针。

更具体一点:

struct  Foo
{
  double m_d;

};


void function (Foo* f)
{
   double tmp=f->m_d;

       /***Other stuff***/

     f->m_d=tmp;
}

我不喜欢 tmp。如果我在一个函数中有很多,它们只会增加混乱。

谢谢

【问题讨论】:

    标签: c++ c naming-conventions


    【解决方案1】:

    对任何其他变量做同样的事情:给它一个简洁、富有表现力的名字。如何使用您正在复制的成员变量的原始名称(可能不使用m_)?这是明确两者之间联系的最佳方式。

    【讨论】:

    • 如果我没有 m_.我使用的是非常古老的 c 代码结构?谢谢
    • 拥有m_ 很臭,无论如何;-) 说真的,只要理解变量。如果您保存 d 的值,请随时将其保存到 old_dtemp_d 或任何您喜欢且对您有意义的内容。
    • @enigma:然后只需使用与您要复制的结构字段相同的名称。不会有命名冲突,因为要访问该字段,您必须明确地为其所属的结构添加前缀。
    【解决方案2】:

    Linus Torvalds - Linux Kernel coding style from Linus Torvalds

    LOCAL 变量名称应该简短而切题。如果你有 一些随机整数循环计数器,它可能应该被称为“i”。 如果没有机会,称它为“loop_counter”是非生产性的 被误解。同样,“tmp”可以是任何类型的 用于保存临时值的变量。

    如果你害怕混淆你的局部变量名,你有另一个 问题,称为功能-生长-激素-失衡综合征。

    【讨论】:

    • 抱歉——但 Linus Torvalds 在代码风格方面根本不是一个好的参考,请参阅他对 goto 对手 [kerneltrap.org/node/553/2131] 的抨击。在那种特殊情况下,他(有点)正确的(恕我直言),但随着对权威的诉求,这是一个谬误。
    • 我并不总是支持 Linus 的观点,但我确实同意 both 示例(临时和 goto)。他在这两种情况下所说的话——在你理解遵守和违背它们的含义之前,不要盲目地坚持愚蠢的规则。而且,尽管这一点在企业机器人的世界中遭到强烈反对,但如果您与有智力的人类打交道,这确实是完全合理的。
    • 我讨厌使用 'i' 或任何单个字母作为变量名的想法。你有没有试过在代码中搜索“i”的所有用法!您几乎停在每条评论和一大堆其他标识符中的每一句话,这很痛苦。保持简短,但不要那么短。
    • @Martin:那么,除了ijk 等之外,您建议调用嵌套 2 行 for 循环中使用的一系列变量是什么?它们的作用域仅适用于 for 循环,为什么还要冗长呢?
    • @Martin,如果你只搜索文本字符串“i”,你当然会得到很多误报。您应该在搜索对话框中选择“整个单词”选项(或类似选项),或者使用正则表达式,“\”或“\bi\b”。
    【解决方案3】:

    你在tmp 变量中存储了什么?使用该描述作为变量名,如果它不是太长的话。对于三行函数 (swap ...) tmp 就可以了。对于几乎所有其他内容,请进行描述。

    【讨论】:

      【解决方案4】:

      我会称它为saved_m_d,或者简称为m_d(不过,我也会给m_d 起一个不同的名字)。

      【讨论】:

      • 不幸的是,“用于说明”违背了您提出问题的目的。只有给出一个真实的例子,你才能得到好的建议。
      【解决方案5】:

      供您参考:Code Complete 有一章专门讨论变量命名。

      在您的示例中,一个问题是Foo 中的成员变量一开始就不是很有描述性,这使得很难为占位符局部变量找到一个有用的名称。

      例如,我会这样做:

      struct Foo
      {
        double mValue; // I don't use underscores here
                       // however, you can do as you please.
                       // Also 'mValue' is just for the sake of example,
                       // you should find a more descriptive name :D
      
      };
      
      
      void function (Foo* f)
      {
         double oldValue = f->mValue;
      
             /***Other stuff***/
      
         f->mValue = oldValue;
      }
      

      【讨论】:

        【解决方案6】:

        如果想不出更具描述性的名称,我们在工作中的惯例是使用名称“my[object]”来代替更好的名称。最重要的是,使其具有描述性,以便您的代码更易于理解和维护。自我记录代码是这样做的另一个好处。

        【讨论】:

          【解决方案7】:

          我将 m_ 用于成员变量,并且不对局部变量使用任何前缀。所以在这种情况下,它将是double d;

          【讨论】:

            【解决方案8】:

            有一些“常用的速记”,例如 i、j 和 m 和 n for 循环,但如果您要在一个函数中有许多循环,最好有一些更有表现力的东西。

            在大多数情况下,我会使用良好的变量命名规则。如果您正在使用 C++,我认为的问题是“我将如何区分成员变量”而不是局部变量。

            【讨论】:

              【解决方案9】:

              一般来说,我只使用描述性名称。如果它是一个属性,我将第一个字母大写并应用驼峰式大小写。对于局部变量,我将所有内容都保留为小写。对于存储属性名称的变量,我使用小写字母和下划线作为前缀。我避免使用任何速记符号,通常也不需要速记。代码完成对于长名称非常有用。 :-)

              几个 IDE 将使用代码突出显示,如果您需要知道某物是类还是变量,这很实用。因此,我在类名和属性名之间没有太多区别。 (除了在 Delphi 中,我仍然在每个类前面加上一个 T,因为这是 Delphi 中的标准约定。)

              不,我不使用 tmp。我把它写成临时的,以防万一我想不出一个不同的名字。或者如果是索引号,则为 I、J、K、L 或 M。 (不,只有这 5 个字母,总是大写。)在你的情况下,我会改用“oldvalue”或“oldm_d”。

              【讨论】:

                【解决方案10】:

                我想说的是尝试找到最能具体描述变量用途的内容,同时将其与该函数中使用的任何其他变量区分开来。

                所以,假设“d”实际上代表了一些已经描述了变量含义的名称,那么我会选择 cached_dcopied_d 之类的名称。这样您就可以拥有更多(cached_acached_bcached_c 等)而不会混淆它们。

                然后我会进一步建议添加一条评论,具体说明您制作该本地副本的原因。也许是这样的:

                double cached_d = f->m_d;   // cached to avoid further de-referencing
                

                这样,将来查看该代码的任何人都应该可以毫无问题地弄清楚您在做什么以及为什么要这样做。

                【讨论】:

                  【解决方案11】:

                  我的建议是简单地合并原始变量名称,或一些其他标识符,以提醒读​​者其预期功能。

                  struct  Foo
                  {
                    double m_d;
                  
                  };
                  
                  
                  void function (Foo* f)
                  {
                     double m_d_tmp = f->m_d;
                  
                         /***Other stuff***/
                  
                       f->m_d = m_d_tmp;
                  }
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2014-08-06
                    • 1970-01-01
                    • 2012-12-28
                    • 2011-08-10
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-09-19
                    • 1970-01-01
                    相关资源
                    最近更新 更多