临时局部变量的命名约定
在本地函数中命名临时变量的标准方法是什么? 让我举一个例子说明我在做什么。 我得到一个指向结构的指针,所以我希望在本地存储其中一个成员以避免被引用,然后任何修改都会返回指针。
更具体一点:
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_d
或copied_d
这样的东西。 这样你就可以拥有更多( cached_a
, cached_b
, cached_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; }