0

好吧,和几个朋友一起做一些项目,我需要一些标准来命名 C++ 中的东西。有没有人有任何好的 c++ 命名方案,它是经过深思熟虑的,而不是像 10 分钟那样制作的。

例如,int* house 应该命名为 int* house_p,这样当有人阅读代码时,他就不需要一直滚动想知道一个东西是指针、数组、矩阵还是其他什么...

发布您正在使用的经过深思熟虑的命名方案!

4

6 回答 6

19

例如,int* house 应该命名为 int* house_p,这样当有人阅读代码时,他就不需要一直滚动想知道一个东西是指针、数组、矩阵还是其他什么...

但是如果它的类型发生了变化——你是否要检查所有的代码并更改所有变量的名称。如果变量是复杂类型的实例怎么办:

ComplicatedDerivativeFinancialInstrument x;

你会使用什么后缀?

您所问的是匈牙利符号- 它在 C++ 中的使用几乎被普遍认为是一个坏主意。

于 2009-04-03T13:06:16.893 回答
5

int*在 C++ 中,在设计/重构代码时,将指针 ( ) 更改为引用 ( )是很常见的int&。如果您通过在变量名上包含一个表明它是指针的后缀来重复自己,那么您将不得不将其更改为其他内容,到处都是。这似乎是无意义的工作,只会让代码更难编辑和塑造成你想要的样子。

你不应该需要那种提醒;例如,如果变量是指针,从用法上会很清楚。

于 2009-04-03T13:09:47.243 回答
1

那里有很好的命名约定,但是在变量名称中包含类型信息(一种形式称为匈牙利表示法)变得不那么流行了。大多数现代 IDE 只需将鼠标悬停在变量上即可为您提供有关变量的有用信息,例如它的类型。但是,如果它对您很重要,那么匈牙利符号可能就是您想要的。

于 2009-04-03T13:06:53.337 回答
1

正如 Neil 和 aaronis 所提到的,您说的是一种Hungarian Notation形式。由于 C++ 是一种强类型语言,因此通常被认为是一个坏主意。它使代码更难阅读,因为有一堆额外的字符妨碍了。

最初的匈牙利符号实际上用于表示超出类型所告诉的信息。例如,假设我正在做一些图形工作,并且我在各种坐标系中都有点。它们都是 Point 类型,但有些在对象坐标中,有些在相机坐标中,有些在世界坐标中。在这种情况下,将它们各自的变量命名为 oPt、cPt 和 wPt 是很有意义的。

从历史上看,这个“应用程序”匈牙利语对某些人来说似乎是一个好主意(额外的字符代码表示非类型信息),他们走得太远了,将其变成了“系统”匈牙利语(额外的字符代码表示 C++ 类型),这几天不受欢迎。

于 2009-04-03T13:13:34.270 回答
0

作为一般规则,请使用您要解决的实际问题的语言。当您使用对外界有意义的良好、描述性标识符时,您的代码将记录自己。

至于语法,选择一个可读的约定,传达一些关于标识符的信息,但不会将你锁定在某些实现中。使其简单易记,这样您的编码人员就可以花更多的时间进行编码,而花更少的时间来满足复杂的语法要求。我发现以下内容很容易理解并且足够丰富:

  • 类和方法定义 - 第一个字母大写,连接单词的第一个字母也大写
  • 对象实例和函数参数 - 第一个字母小写,连接单词的第一个字母大写
  • 类数据字段 - 尾随下划线,第一个字母字符小写,连接单词的第一个字母大写

恐怕它可能没有通过 10 分钟的测试,但如果需要超过 10 分钟的时间来解释,它可能会妨碍实际工作。

class FooProblem {
  int fooData_;
  public:
  FooProblem(int fooData): fooData_(fooData){}
};
于 2009-04-03T14:17:40.280 回答
0

如果 Facebook 上有一个“我讨厌匈牙利符号”组,我会加入。

这是一些说明我的标准的伪代码。

namespace utilities
{

class MyGizmo
{
public :
   void doTheThing();
   std::string name_;
private:
   int thingCount_;
};

static const char* ApplicationName = "Gizmotronic Ultra 1.0";

void setGizmoName(MyGizmo& gizmo, const std::string & name)
{
   gizmo.name_ = name;
}

int main()
{
   cout << ApplicationName;
   MyGizmo gizmo;
   gizmo.doTheThing();

   std::string gizmoName = gizmo.name_;

   return 0;
}
于 2009-04-03T14:33:43.173 回答