两种匈牙利命名法

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

匈牙利命名法就是为变量命名的一种规则。一般认为,它是以变量的数据类型为基础的命名法,以代表数据类型的小写字母开头,然后使用驼峰法进行命名,比如 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 代表四个字节等。其他情况,如果非要用匈牙利命名法,那就用匈牙利命应用名法。

两种匈牙利命名法》上有2条评论

  1. 酷~行天下

    采访者:你提到的”匈牙利命名法”是指什么?

    西蒙尼:称它为”匈牙利命名法”是个玩笑。你知道,如果有人说”这对我来说就是希腊文”,这表示他们看不懂,因此也可能它就真是用希腊语写的。这里的”匈牙利”是句反话,因为这些命名规范其实是要让代码更易读。这个玩笑说的是程序看起来这么难读,说不定真是用匈牙利语写的。其实这套规范能够很好地控制程序中所有变量的命名。

    这家伙是匈牙利人。。。

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注