这才是真正的“匈牙利命名法”

开发 开发工具
匈牙利命名法是一种编程时的命名规范。基本原则是:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。

从刚进大学开始学习 C 语言,就听说了实际开发中会用到的各种变量命名方法,例如常见的匈牙利命名法、骆驼命名法、Pascal 命名法等。

后来自己真正开始用 C/C++ 写程序,开始使用匈牙利命名法,总觉得十分别扭。好好的变量名 name,严格按照命名规则,非得在前面加类型前缀,改写成 lpszName。

如今的 IDE 都会自动检查变量类型,而且类型错误在编译时也比较容易发现,在变量名前面强制加上类型信息实在不知道有什么意义。

直到无意中在《More Joel on Software》[1] 这本书第 23 章看到匈牙利命名法作者——Charles Simonyi 的本意。

1. 应用型匈牙利命名法——鲜为人知的正统

Simonyi 的匈牙利命名法的原型在微软公司内部最初被叫做“应用型匈牙利命名法”(Apps Hungarian),因为它是在“应用程序部”(Applications Division)中使用的,也就是用在 Word 和 Excel 身上。在 Excel 的源码中,你可以看到大量的 rw 和 col 。

使用这种“应用型匈牙利命名法”,我们可以在看到变量后很快理解其含义,并很容易发现代码中的问题。

例如在代码中看到 xl = cb,

xl 表示“相对于页面的横坐标”,horizontal coordinates relatives to the layout;cb 表示“字节个数”,count of bytes

显然是有问题的,虽然 xl 和 cb 都是整数,但是这二者之间的赋值基本一定会导致 bug。

2. 系统型匈牙利命名法——广为流传的冒牌货

然而,一定程度上由于 Simonyi 自己在编写文档时,用了“type”这个词,而不是“kind”,于是被人误以为 Simonyi 指的是数据类型。尽管 Simonyi 很详细、很准确地解释了他所说的“type”到底是什么意思。可惜于事无补,危害已经酿成了。悲剧的结果就是产生了我们现在熟悉的“系统型匈牙利命名法”(System Hungarian)。

还是上面的例子,改用“系统型匈牙利命名法”以后,可以改成 nWidth = nCount,看起来好像还不错哈~

bug 就是这样隐藏起来的。

“应用型匈牙利命名法”的前缀是非常有用的、有含义的,比如:

“ix” 表示数组的索引值(index)

“c” 表示一个计数器(count)

“d” 表示两个数量之间的差(difference),“dx” 就可以表示宽度 

“系统性匈牙利命名法”的前缀就差远了,比如

“l” 表示长整型(long)

“ul” 表示无符号长整型(unsigned long)

“dw” 表示双精度值(double word),这实际上也是一个无符号的长整型

这种差别虽然细微,但是完全误解了 Simonyi 的意图和做法。“系统型匈牙利命名法”传播的又远又广,在 Windows 编程文档中,它是标准的变量命名法。难怪很多人都觉得匈牙利命名法很奇怪、很别扭。

原文链接:http://www.cnblogs.com/xuxn/archive/2012/05/16/real-hungarian-notation.html

【编辑推荐】

  1. 推荐5个提高Java开发效率的工具
  2. 优秀开发者必备的四种品质
  3. 软件开发基本原则之***项目
  4. 聘用Node.js开发者的六个建议
  5. 软件开发如同木匠做桌子
责任编辑:彭凡 来源: 博客园
相关推荐

2020-05-28 10:45:31

Git分支合并

2016-12-16 19:06:02

扩展数据库架构

2020-03-05 16:47:51

Git内部储存

2015-02-11 09:35:09

iPhone6

2015-04-03 10:11:57

Windows 10免费

2015-08-17 13:19:55

大数据

2020-08-25 23:06:33

开发技能代码

2021-01-19 05:44:53

危机面试技术

2022-11-14 11:55:39

数据分析项目

2022-11-29 11:31:19

商品分析商品销售库存

2023-06-16 11:54:59

数据分析项目

2022-03-10 15:55:44

元宇宙VRVR办公

2017-10-16 15:33:35

微信APP小程序

2023-09-27 07:21:08

数据分析报告PPT

2020-08-04 07:21:02

区块链共享经济分布式

2021-12-15 07:24:56

SocketTCPUDP

2013-11-28 14:34:30

微软WP

2013-12-13 10:47:02

移动游戏Ingress电子新我

2012-03-16 13:57:06

苹果Android专利案

2018-06-09 07:32:08

点赞
收藏

51CTO技术栈公众号