匈牙利命名法是电脑程式设计中的一种变量命名规则,此命名法又可细分为:系统匈牙利命名法和匈牙利应用命名法。原始的匈牙利命名法,现在被称为匈牙利应用命名法,由1972年至1981年在施乐帕洛阿尔托研究中心工作的-程序员查尔斯·西蒙尼(之后任微软总设计师)发明。此命名方法被微软公司广泛推广,以下重点讲述系统匈牙利命名法。
基本原则是:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。命名要基于容易记忆容易理解的原则。
属性部分举例
序号 | 全名 | 属性名前缀 | 说明 |
1 | global | g_ | 全局变量 |
2 | const | c_ | 常量 |
3 | member | m_ | C++成员变量 |
4 | static | s_ | 静态变量 |
类型部分举例
序号 | 全名 | 属性名前缀 | 说明 |
1 | pointer | p | 指针 |
2 | function | fn | 函数 |
3 | handle | h | 句柄 |
4 | long | l | 长整型 |
5 | boolean | b | 布尔 |
6 | float | f | 浮点型 |
7 | double word | dw | 双字 |
8 | string with zero end | sz | 字符串 |
9 | short | n | 短整型 |
10 | double | d | 双精度浮点 |
11 | character | c | 字符 |
12 | integer | i | 整型 |
13 | real | r | 实型 |
14 | un | 无符号 |
综合举例
序号 | 全名 | 属性名前缀 | 说明 |
1 | bBusy | b | 布尔 |
2 | pszOwner | psz | 指向零结束字符串的指针 |
系统匈牙利命名法和匈牙利应用命名法的区别
系统命名法与应用命名法的区别在于前缀的目的。
在系统匈牙利命名法中,前缀代表了变量的实际数据类型。例如:
lAccountNum:变量是一个长整数("l");
arru8NumberList:变量是一个无符号8位整型数组("arru8");
szName:变量是一个零结束字符串("sz"),这是西蒙尼最开始建议的前缀之一。
匈牙利应用命名法不表示实际数据类型,而是给出了变量目的的提示,或者说它代表了什么。
rwPosition:变量代表一个行("rw")。
usName:变量代表一个非安全字符串("us"),需要在使用前处理。
strName:变量代表一个包含名字的字符串("str")但是没有指明这个字符串是如何实现的。
系统匈牙利命名法的优点
·从名字中就可以看出变量的类型。
·拥有类似语义的多个变量可以在一个代码块中使用(例如dwWidth和fWidth)。
·变量名在仅仅知道他们的类型时可以被轻易记住。
·可以使变量名更加一致。
·决定一个变量名的时候可以更机械化,更快。
·不合适的类型转换和操作可以在阅读代码的时候被检测出来。
·在那些数字被当作字符串处理的基于字符串的语言中非常有用(例如Tcl)。
匈牙利系统命名法的缺点
·匈牙利命名法在编译器做类型检查时是多余的。一个提供类型检查的语言在确定一个变量与其类型一致时,比人眼仅仅检查变量的用法与变量名一致要强大的多。
·一些现代的集成开发环境,如Visual Studio在需要时可以显示变量类型,并且自动标记不匹配的类型。使用这种命名法完全没有必要。
·由于变量名和类型捆绑在一起,因此不利于代码的移植。一个典型的众所周之的例子就是WPARAM类型,以及在许多Windows系统函数声明中使用的wParam参数。它原本是一个16位的类型,但是在后来的操作系统中被改成了32位或64位,但仍保留原来的名字(它实际的基础类型是UINT_PTR,即一个大小足够保存一个指针的无符号整型)。
适用场景
早期程序设计、C++程序设计。