什么是匈牙利符号,我应该使用它吗?

编程界的一句名言如下:

在计算机科学中只有两件难事:缓存失效和命名。

匈牙利表示法是一种尝试使命名变得更容易的系统。在探索现有代码库时,您可能会遇到匈牙利表示法。您可能有一位特别热衷于使用它的同事。但是它是什么,看起来像什么?并且您真的应该使用它吗?

什么是匈牙利符号?

匈牙利表示法是标识符命名的约定。它主要应用于变量命名,但也可以覆盖函数的命名。该符号是一种尝试形式化变量名如何表示其类型或用途的尝试。

使用匈牙利表示法,所有变量名都以一组字母开头,这些字母具有相同的含义。这些字母通常是变量类型的缩写。例如,字母l可能代表一个长整数。缩写str代表字符串。

真的是匈牙利人吗?

是的,匈牙利记法的确是由匈牙利人发明的!查尔斯·西蒙尼(Charles Simonyi)发明术语时是微软的一名员工。他曾是该公司的程序员,从事应用软件的开发。

与大多数其他西方语言相反,匈牙利名称首先对姓氏进行排序,然后是给定名称。匈牙利表示法一词可能引用了这一事实,或者可能只是一个快乐的巧合。由于西蒙尼的母语,这本来可以是更自然的。

它是什么样子的?

而不是简单地命名变量年龄,匈牙利命名法包括代表变量的类型的前缀。例如,在C语言中,程序员可以这样声明变量:

 int iAge;

请注意,由于C是一种强类型语言,因此i前缀在声明时是多余的。但是,以后使用变量时,前缀被证明是有用的:

 printf("I am %d years old", iAge);

前缀有助于提醒我们我们使用的是正确类型的变量。

在弱类型语言(例如PHP)中,变量可以根据其所拥有的值采用不同的类型。因此,匈牙利表示法可能会更有用:

 $iAge = 21;

以下是一些常见的匈牙利符号表示法的示例:

字首 类型 例子
b 布尔值 bLightsEnabled
C 特点 字母等级
力量 细绳 策略类别
一世 整数 iWheels
F 漂浮 里程
C 班级 皮尔森
{班级名称} 目的 人领导

系统匈牙利文与Apps匈牙利文

匈牙利表示法有分歧。在一个角落里,我们有系统匈牙利语,在另一个角落里,我们是Apps Hungarian。差异是微妙的,但非常重要。

系统匈牙利语是人们经常将其与匈牙利符号联系在一起的版本。如上所示,它严格处理变量的类型。

Apps Hungarian尝试对变量的用途而非其数据类型进行编码。这是一个更广泛的概念,因此示例可以涵盖许多不同的用例:

 // an Unsafe String eg a name the user entered in a web form
$usName
// the Length of the vertical side
$lVertical
// a Count of references to an object
$cRefs

Apps Hungarian是匈牙利符号的原始形式,描述目的是Simonyi的意图。系统匈牙利人是一种突变,许多人认为这种突变是更糟的。

匈牙利表示法有什么好处?

正如我们前面提到的,“系统匈牙利语”对于弱类型语言可能很有用。它使查看代码的人可以在变量出现时立即确定变量的类型。

匈牙利表示法还有助于强制执行一致的变量命名。毕竟,错误的变量命名是最常见的编程错误之一。应用符号可以帮助程序员发现该语言不会警告他们的重要错误。

匈牙利符号有什么坏处?

总的来说,匈牙利记数法已经过时了。在强类型语言中,它具有广泛的冗余性,尤其是“系统匈牙利语”类型。这也会使代码更难阅读。它可能帮助解决的任何问题通常都表明存在更深层次的缺陷,例如过分依赖全局变量

Apps Notation似乎有更多用途,但即使此版本也有其不利之处。有一个很好的论点,即关于目的的信息仍应是变量类型的一部分。

任何支持用户定义类型或类的语言通常都可以更好的方式达到相同的目的。命名变量usName不会使其更安全。但是,创建一个名为UnsafeString的类可以使编译器检查变量的类型。

我应该使用匈牙利符号吗?

最终,该选择取决于您。如果您在更大的团队中工作,那么可能会有人做出决定,每个人都应该坚持下去。如果您要编写自己的代码,则可以根据上面的参数进行决定。

但是您可能想听听来自匈牙利符号法起源的公司Microsoft的最新建议。自2008年以来,其一般命名公约都包含以下简单说明:

❌请勿使用匈牙利表示法。