日度归档:2012 年 12 月 23 日

两种匈牙利命名法

在编写程序时,为变量命名是一件非常重要的事情,因为它对于代码读着的意义重大。而对于作者而言,在写程序时往往会忽略这点。但程序被阅读、维护的时间远大于其写作时间。并且有研究表明,在程序被写完六个月后,其作者本人也会忘了自己当初写这些代码时的想法。所以,给程序变量取好名字是一件非常重要的事情。关于变量命名,《代码大全》里有一整个章节讨论它,推荐阅读。

匈牙利命名法就是为变量命名的一种规则。一般认为,它是以变量的数据类型为基础的命名法,以代表数据类型的小写字母开头,然后使用驼峰法进行命名,比如 int iNum; char *pFoo; 等。然而,大部分时候,变量的含义比它的数据类型重要多了。知道了变量的含义,就知道了它的数据类型,而反过来并不能如此。并且,机械的在变量名字前面加上数据类型是一种很丑陋的做法。

在我供职的公司,有一件比较有意思的事,QQ 号有一个近似于标准的命名:uin, 据我推测,这是按照匈牙利命名法得来的,其初始定义为 unsigned int n; 首字母连起来变为 uin. 而 n 几乎是毫无含义的名字(典型的谭浩强式命名法)。我觉得,命名为 uid 会更有意义:user’s id. 更好笑的是,随着命名规则的变迁,有时候它被命名为 dwUin, 即 double world uin, 表明其为4个字节的整数,有时候又被命名为 ulUin, 即 unsigned long uin。

事实上,最初的匈牙利命名法并不是现在广为人知的那样,其前缀它更强调变量的目的而非变量的数据类型。这种用前缀强调变量目的的命名法被称为匈牙利应用命名法,而上面所述的为系统匈牙利命名法。应用命名法的前缀应该是有自然语义的,比如:rwPosition:变量代表一个行(”rw”)。

匈牙利命名法现在并不那么受欢迎,事实上,连其发源地微软在最新版的 .NET Framework 就不建议程序员使用匈牙利命名法。

至于用不用匈牙利命名法,则要看具体情况。如果团队有标准,就根据标准规则来,因为有效的标准是所能掌握的最有效的工具之一。

在数据类型非常有意义的情况下,比如在底层网络编程中,使用系统匈牙利命名法还是非常有好处的。比如用 c 前缀标识一个字节长度,w 表示两个字节长度,dw 代表四个字节等。其他情况,如果非要用匈牙利命名法,那就用匈牙利命应用名法。