临时局部变量的命名约定

在本地函数中命名临时变量的标准方法是什么? 让我举一个例子说明我在做什么。 我得到一个指向结构的指针,所以我希望在本地存储其中一个成员以避免被引用,然后任何修改都会返回指针。

更具体一点:

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

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

谢谢

Linus Torvalds – 来自Linus Torvalds的Linux内核编码风格 :

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

如果你害怕混淆你的本地变量名,你还有另一个问题,就是所谓的function – 生长 – 激素 – 失衡综合症。

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

你在tmp变量中存储了什么? 如果描述不太长,请将该描述用作变量名称。 对于三行函数( swap …), tmp很好。 几乎所有其他内容都是描述性的。

我会称之为saved_m_d ,或者只是m_d (但是,我还会给m_d一个不同的名字)。

为了您的信息: 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; } 

我使用m_作为成员变量,不使用任何前缀作为局部变量。 所以在这种情况下它会是double d;

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

有一些“常用的缩写”,例如i,j和m和n for循环,但是如果你要在函数中有很多循环,那么最好有更具表现力的东西。

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

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

几个IDE将使用Code Highlighting,如果你需要知道某个东西是类还是变量,它是实用的。 因此,我在类名和属性名之间没有太多区别。 (除了在Delphi中,我仍然在每个类前面添加一个T,因为这是Delphi中的标准约定。)

不,我不使用tmp。 我把它写成临时的,以防我不能提出不同的名字。 或者在索引号的情况下I,J,K,L或M. (不,只有那5个字母,总是大写。)在你的情况下,我会使用“oldvalue”或“oldm_d”代替。

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

因此,假设“d”实际上代表了一些已经描述了变量含义的名称,那么我会选择像cached_dcopied_d这样的东西。 这样你就可以拥有更多( cached_acached_bcached_c等),而不会产生混淆。

然后我会进一步建议包括一个评论,明确说明你为何制作本地副本。 也许是这样的:

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

这样,将来查看该代码的任何人都应该没有问题,弄清楚你在做什么以及为什么。

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

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