12

MFC 具有以 C 开头的所有类名。例如,CFile 和 CGdiObject。有没有人看到它在其他地方使用过?是否有来自 Microsoft 的官方命名约定指南推荐这种风格?这个想法是源于 MFC 还是其他项目?

4

12 回答 12

18

这是邪恶的。除了抽象的东西,不要使用匈牙利符号。

例如,btnSubmit可以描述一个名为 Submit 的按钮(该lblSubmit按钮旁边的标签会附带一个标签)

但是CMyClass对于 Class 和uiCount命名为 count 的无符号整数之类的事情对程序员没有帮助,只会导致额外的浪费输入。

于 2010-02-18T22:00:16.463 回答
16

Symbian C++ 中使用了一些类似的东西,其中约定是:

T 类是“值”,例如 TChar、TInt32、TDes

R 类是内核(或其他)资源的句柄,例如 RFile、RSocket

M 类是 mixins,其中包括接口(被解释为没有函数实现的 mixins)。指导原则是多重继承最多应涉及 1 个非 M 类。

C 类几乎是其他所有东西,并且从 CBase 派生,其中包含一些有助于资源处理的东西。

HBufC 的存在主要是为了在 Symbian 论坛上生成混乱的帖子,拥有自己的前缀只是开始。H 代表“嗯?”,或者可能是“哇,哇!你没有 STL!” ;-)

这在精神上接近于 Apps Hungarian Notation 而不是 Systems Hungarian notation。前缀告诉您一些关于类的信息,您可以在文档中查找这些信息,但您不知道这些信息。在编程中命名任何东西的全部意义在于提供这样的提示和提醒,否则您只需将您的类称为“Class001”、“Class002”等。

Systems Hungarian 只是告诉您变量的类型,IMO 对此没什么好兴奋的,尤其是在像 C++ 这样的语言中,类型往往会不断重复或完全被模板参数隐藏。命名类型时的类似物是使用 I 命名所有接口的 Java 实践。同样,我对此并不感到很兴奋(标准 Java 库也没有),但是如果您要为每个类定义一个接口,除了在非测试情况下实际用于多态的接口外,还需要一些方法来区分两者。

于 2010-02-19T00:47:55.533 回答
13

那是一种旧的 C++ 编码风格,而 MFC 可能是最后使用它的东西之一。

它通常只是 C++(可能还有其他几种语言)的约定,因此随着语言变得更加可互操作,通过 COM 和 .NET,它开始失宠。

您仍然经常看到它的表亲,即接口的“I”前缀。我一直觉得有趣的是,当“C”死亡时,“I”幸存下来,但这可能是因为接口在 COM 互操作性中被大量使用。

于 2010-02-18T21:56:54.360 回答
6

我记得 Borland 编译器使用类名以“T”开头的库。可能是“类型”:)

于 2010-02-19T02:52:00.623 回答
5

我不能回答你所有的问题,但据我所知,这只是为了将 MFC 类与其他类区分开来——匈牙利符号的一种形式。

有趣的是,它显然不仅在 MS 之外,而且在内部也存在争议。

于 2010-02-18T21:56:20.847 回答
5

多年前,命名约定对于帮助识别类、类型甚至类的分组至关重要。不要忘记当时没有命名空间,也没有/有限的智能感知可用。C 是匈牙利符号的一种形式,但肯定被 MFC 流行起来。Borland 和 Delphi 使用 T - 作为 Type 的前缀

于 2010-02-19T00:58:51.873 回答
5

虽然 MFC 和许多为 Windows 编写的软件对类使用“C”约定,但在为 UNIX 平台编写的软件中通常找不到后者。我认为这是 Visual C++ 强烈鼓励的一种习惯。我记得 Visual C++ 6.0 会为使用类向导创建的任何类添加一个“C”前缀。

于 2010-02-19T03:12:14.100 回答
2

请参阅此处: http: //www.jelovic.com/articles/stupid_naming.htm以获取有关此问题的长篇文章。

于 2010-02-19T12:24:27.523 回答
0

我们在工作中使用它,就像许多其他命名约定一样

很多我的意思是 C 代表类,p 代表指针,m_ 代表成员,s_ 代表静态成员,n 代表整数……文档不多

于 2010-02-18T21:55:28.337 回答
0

这种变量约定对于像 Fortran 这样的语言很有用,在这种语言中,您不需要在使用变量之前声明变量的类型。我似乎记得名称以“i”或“j”开头的变量默认为整数,而名称以“r”和其他字母开头的变量默认为实数(浮点数)值。

人们在需要声明变量的语言或类定义中使用类似的语言,这可能只是有人误解了像 Fortran 这样的语言的旧代码约定,而这实际上很重要。

于 2010-09-17T17:04:32.050 回答
0

在编写使用 Qt 库的应用程序时,我们使用命名约定来区分直接或间接从 QObject 派生的类和不是的类。这很有用,因为您可以从类名中判断它是否支持信号/插槽、属性以及来自 QObject 的所有其他好东西。

于 2011-08-14T06:08:05.943 回答
0

就我个人而言,我发现匈牙利符号对我有帮助,因为我可以看着一个充满变量的屏幕,并在我尝试吸收逻辑时立即知道它们是什么。我看到你唯一反对它的论点是“额外打字”

于 2018-09-14T20:53:12.533 回答