在类型之后命名变量是不好的做法吗?

Noa*_*rth 14 c++ variables naming naming-conventions

我正在使用下划线命名样式(与camel case相反)编写C++,这也是STL和boost使用的.但是,由于类型和变量/函数都被命名为全小写,因此如下的成员变量声明将导致编译器错误(或至少是麻烦):

position position;
Run Code Online (Sandbox Code Playgroud)

名为position的成员变量,其类型为position.我不知道如何命名它:它通常是一个位置,但它也是对象的位置.在驼峰的情况下,这对编译器来说没问题:

Position position;
Run Code Online (Sandbox Code Playgroud)

但在C++中它会导致问题.我不想切换到驼峰的情况下,使用匈牙利表示法或添加一个尾随下划线因此,所以我想知道:将类似的成员命名为一个好的做法是不是很好?

在C中,为此使用神秘的单字母变量是很常见的:

int i;
Run Code Online (Sandbox Code Playgroud)

但我发现有点,嗯,神秘:

position p;
Run Code Online (Sandbox Code Playgroud)

我可以用来避免这种变量命名的经验法则吗?

如果您需要处理以下内容,我的代码中会有更多示例:

mouse_over(entity entity) // Returns true if the mouse is over the entity

manager &manager; // A reference to the framework's manager

audio audio; // The audio subsystem
Run Code Online (Sandbox Code Playgroud)

编辑:

我很想知道Bjarne Stroustrup本人在这个问题上是否有话要说.显然,他没有,但他提出了可以解决我的编译器问题的编码约定:

例如,大写非标准库用户定义类型并使用小写字母启动非类型

这与STL和提升是一致的,所以我可能会使用它.但是,大多数人都同意,无论是否编译,都应避免使用此命名.Stroustrup也是如此:

选择仅以大小写不同的名称是不明智的.

Ben*_*igt 10

本地意义很少是该类型的唯一全局描述:

cartesian_point_2d position;  // rectangular, not polar coordinates
mouse_over(ui_entity entity); // not a business layer entity
xyz_manager& manager;         // what's a manager without something to manage?
audio_system audio;
Run Code Online (Sandbox Code Playgroud)

  • 令人印象深刻的是你如何为我的所有这些例子提出合理的建议.你有没有使用任何经验法则,或者只是随着时间学习的东西?我会坐下来仔细考虑每个重复的名字. (3认同)

Jam*_*lis 8

赋予变量与其类型相同的名称几乎总是一个坏主意,因为它很难分辨哪些代码引用了类型以及哪些代码引用了变量.例如,请考虑以下类:

struct position
{
    void operator()() { }
};

// later on, somewhere:
position position;
Run Code Online (Sandbox Code Playgroud)

现在,如果我们看到一行代码使用:

position()
Run Code Online (Sandbox Code Playgroud)

我们不能轻易判断是构造position对象还是调用position::operator()().我们必须返回并查看是否存在position当前在范围内命名的对象.

命名约定是一个非常敏感,主观和争论的事情.我建议选择一种以某种方式区分类型和变量的方法.就个人而言,我选择将我的类型大写,并将我的变量保留为以小写字母开头.

它并不真正的问题是如何你区分它们(您使用大写或结尾下划线的建议都是常见的),只是,只要您的使用情况是一致的.