匈牙利命名法

维基百科,自由的百科全书
跳转到: 导航、 搜索
跳过字词转换说明

匈牙利命名法是电脑程序设计中的一种变量命名规则,此命名法又可细分为:系统匈牙利命名法匈牙利应用命名法

匈牙利命名法具备语言独立的特性,并且首次在BCPL语言中被大量使用。由于BCPL只有机器字这一种数据类型,因此这种语言本身无法帮助程序员来记住变量的类型。匈牙利命名法通过明确每个变量的数据类型来解决这个问题。

在匈牙利命名法中,一个变量名由一个或多个小写字母开始,这些字母有助于记忆变量的类型和用途,紧跟着的就是程序员选择的任何名称。这个后半部分的首字母可以大写,以区别前面的类型指示字母(参见驼峰式大小写)。

目录

[隐藏]

  • 1历史
  • 2系统匈牙利命名法匈牙利应用命名法
  • 3示例
  • 4系统匈牙利命名法的优点
  • 5匈牙利系统命名法的缺点
  • 6注释和参考
  • 7内部连结
  • 8外部链接

[编辑]历史

原始的匈牙利命名法,现在被称为匈牙利应用命名法,由1972年至1981年在施乐帕洛阿尔托研究中心工作的-程序员查尔斯·西蒙尼发明。此人后来成了微软的总设计师。

这种命名法其实是对于西蒙尼祖籍的一种讽刺。匈牙利人名和大多数其他欧洲人名相比是反过来的,即姓氏在名字的前面。举个例子,英语化的名字“Charles Simonyi”在匈牙利语中原本是“Simonyi Károly”。同样的,在匈牙利命名法中,类型名在实际变量名前,而不是像大多数欧洲的Smalltalk那样,类型放在变量名后,例如aPoint和lastPoint。后者在西蒙尼任职于施乐帕洛阿尔托研究中心时期非常流行。这种命名法的灵感,可能是受波兰表示法的启发。

匈牙利命名法这个叫法能让许多人记住,是因为难发音的辅音字符串,有点像部份东欧语言中,辅音丰富的拼写方式,尽管实际上匈牙利语是属于芬兰-乌戈尔语族,而不像斯拉夫语族那样元音丰富。举例来说,零结束字符串的前缀"sz"实际上就是匈牙利字母表中的一个合体字母(参看德语中的ß)。

[编辑]系统匈牙利命名法匈牙利应用命名法

系统命名法与应用命名法的区别在于前缀的目的。

在系统匈牙利命名法中,前缀代表了变量的实际数据类型。例如:

  • lAccountNum:变量是一个长整数("l");
  • arru8NumberList:变量是一个无符号8位整型数组("arru8");
  • szName:变量是一个零结束字符串("sz"),这是西蒙尼最开始建议的前缀之一。

匈牙利应用命名法不表示实际数据类型,而是给出了变量目的的提示,或者说它代表了什么。

  • rwPosition:变量代表一个("rw")。
  • usName:变量代表一个非安全字符串("us"),需要在使用前处理。
  • strName:变量代表一个包含名字的字符串("str")但是没有指明这个字符串是如何实现的。

西蒙尼建议的大多数前缀都是自然语义的,但不是所有。下面几个是来自原始论文的: [1]

  • pX是指向另一个X类型的指针,这包含非常少的语义信息。
  • d是一个前缀表示两个值的区别,例如,dY可能代表一个图形沿Y轴的距离,而一个仅仅叫做y的变量可能是一个绝对坐标。这完全是自然语义的。
  • sz是一个无结束或零结束的字符串。在C中,这包含一些语义信息,因为它不是很明确一个char*类型的变量是一个指向单个字符的指针,还是一个字符数组,或是一个零结束字符串。
  • w标记一个变量是一个字。这基本上没有包含什么语义信息,因此大概会被当成是系统命名法。
  • b标记了一个字节,和w对比可能有一些语义信息,因为C语言中,只有字节大小的数据是char型的,因此这些有时候被用来保存数值。这个前缀也许可以明确某个变量保存的是应该被看作是字母(或更一般的字符)的数值还是一个数字。

由于这种命名法通常使用小写字母开头用来助记,但是并没有对助记符本身作规定。有几种被广泛使用的习惯(见下面的示例),但是任意字母组合都可以被使用,只要它们在代码主体中保持一致就可以了。

在使用匈牙利系统命名法的代码中有时候也可能包含系统匈牙利命名法,即在描述被单独以类型方式定义的变量时使用。

[编辑]示例

  • bBusy:布尔型
  • cApples:项目计数
  • dwLightYears:双字(系统)
  • fBusy:布尔型(标记)
  • nSize:整型(系统)或计数(应用程序)
  • iSize:整型(系统)或索引(应用程序)
  • fpPrice:浮点数
  • dbPi:双精度浮点数(系统)
  • pFoo:指针
  • rgStudents:数组或范围
  • szLastName:零结束字符串
  • u32Identifier:无符号32位整型(系统)
  • stTime:时钟结构
  • fnFunction:函数名

对于指针和数组来说,它们实际上并不是数据类型,因此通常在助记符后面跟着实际元素的类型。

  • pszOwner:指向零结束字符串的指针
  • rgfpBalances:浮点值的数组

由于匈牙利命名法可以被应用在任何程序设计语言和环境中,因此被微软广泛用在C语言中,特别是在Microsoft Windows里。由此一来,许多常见的匈牙利命名法的结构都和Windows紧密相关:

  • hwndFoo:窗口句柄
  • lpszBar:指向零结束字符串的长指针

这种命名法又是在C++中被扩展而包含变量的作用域,由一个下划线隔开:

  • g_nWheels:全局命名空间的成员,整型
  • m_nWheels:结构体/类成员,整型

[编辑]系统匈牙利命名法的优点

(其中一些只适用于系统匈牙利命名法) 支持者声称匈牙利命名法的好处包括:[1]

  • 从名字中就可以看出变量的类型
  • 拥有类似语义的多个变量可以在一个代码块中使用:dwWidth,iWidth,fWidth,dWidth
  • 变量名在仅仅知道他们的类型时可以被轻易记住
  • 可以使变量名更加一致
  • 决定一个变量名的时候可以更机械化,更快
  • 不合适的类型转换和操作可以在阅读代码的时候被检测出来
  • 在那些数字被当作字符串处理的基于字符串的语言中非常有用(例如Tcl)
  • 在匈牙利应用命名法中,变量名确保不会犯以下错误:
heightWindow = window.getWidth()
  • 在使用动态类型语言或完全无类型的语言编程时,关于类型的修饰可以更简化。这种语言一般不包含类型修饰(或者可选),因此唯一可以看出哪些类型是被允许的只有名字本身、文档以及通过阅读代码来明白它们在做什么。在这些语言中,包含对于变量类型的指示可能会有助于程序员。就像上面提到的,匈牙利命名法扩展了这样的语言(BCPL)。
  • 在包含许多全局对象的复杂程序中(VB/Delphi Forms),拥有一个基本的前缀命名法可以简化在编辑器中查找组件的工作。按btn<Ctrl-Space>可以使编辑器弹出一个Button对象的列表。

[编辑]匈牙利系统命名法的缺点

批评者认为:

  • 匈牙利命名法在编译器做类型检查时是多余的。一个提供类型检查的语言在确定一个变量与其类型一致时,比人眼仅仅检查变量的用法与变量名一致要强大的多。
  • 一些现代的集成开发环境,如Visual Studio在需要时可以显示变量类型,并且自动标记不匹配的类型。使用这种命名法完全没有必要。
  • 匈牙利命名法在被用作代表多个属性的时候会造成困惑,如 a_crszkvc30LastNameCol:一个常量引用参数,保存了一个varchar(30)类型的数据库列LastName的内容,而这列又是这个表的主键的一部分。
  • 在代码更改后可能造成不一致。如果一个变量的类型改变了,不是变量名的修饰与新的类型不一致,就是变量名必须被改变。
  • 由于变量名和类型捆绑在一起,因此不利于代码的移植。一个典型的众所周之的例子就是WPARAM类型,以及在许多Windows系统函数声明中使用的wParam参数。它原本是一个16位的类型,但是在后来的操作系统中被改成了32位或64位,但仍保留原来的名字(它实际的基础类型是UINT_PTR,即一个大小足够保存一个指针的无符号整型)。
  • 大多数时候,看到一个变量就意味着知道了它的类型。但是,如果你不知道一个变量是干什么的,知道了它的类型也没什么帮助。

.NET Framework,微软新的软件开发平台,除了接口类型一般不适用匈牙利命名法。在.NET中,习惯在接口类型前放一个I(例如Windows Forms中的IButtonControl接口。).NET Framework指导方针建议程序员不要用匈牙利命名法,但是没有指明不要用系统匈牙利命名法还是匈牙利应用命名法,或者是两者都不要用。[2]与此对比,Java的标准库中连接口类型也不加前缀。[3]

匈牙利命名法的利与弊相关推荐

  1. 匈牙利命名法(Hungarian Notation)

    匈牙利命名法是一种编程时的命名规范.基本原则是:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确 含义,可以取对象名字全称或名字的一部分.命名要基于容易记忆容易理解的原则.保证名字的连贯性 ...

  2. 骆驼命名法 ,匈牙利命名法 和 帕斯卡命名法

    常用命名法:骆驼命名法,匈牙利命名法和帕斯卡命名法 http://xp9802.iteye.com/blog/2111721 骆驼式命令法(Camel): 驼峰法 小驼峰法: 从第个单词开始首字母大写 ...

  3. 骆驼命名法,帕斯卡命名法和匈牙利命名法(转)

    一.匈牙利命名法:广泛应用于象Microsoft Windows这样的环境中.       Windows 编程中用到的变量(还包括宏)的命名规则匈牙利命名法,这种命名技术是由一位能干的 Micros ...

  4. 【转】匈牙利命名法(Hungarian Notation)

    http://www.hudong.com/wiki/%E5%8C%88%E7%89%99%E5%88%A9%E5%91%BD%E5%90%8D%E6%B3%95 匈牙利命名法 匈牙利命名法是一种编程 ...

  5. c++ 请抛弃匈牙利命名法 - 变量命名代码风格的建议。

    我只针对c++码农们讲,其他语言不了解不过应该大同小异.曾几何时翻开21天学通c++系列等脑残入门书,都以匈牙利命名法示人(DWORD dwXXX, int nXXX, string strXXX). ...

  6. C++编程(一):匈牙利命名法

    匈牙利命名法 许多 Windows 程序员都使用"匈牙利标记法"作为变量命名约定.这是为了纪念具有传奇色彩的微软程序员 Charles Simonyi.这种标记法非常简单,其基本原 ...

  7. mfc编程淘汰了吗_四种基本的编程命名规范(匈牙利命名法、驼峰式命名法、帕斯卡命名法、下划线命名法)...

    匈牙利命名法 匈牙利命名法是早期的规范,由微软的一个匈牙利人发明的,是 IDE 还十分智障的年代的产物.那个年代,当代码量很多的时候,想要确定一个变量的类型是很麻烦的,不像现在 IDE 都会给提示,所 ...

  8. 匈牙利命名法、骆驼命名法、帕斯卡(pascal)命名法 C#命名规范

    一.匈牙利命名法:广泛应用于象Microsoft Windows这样的环境中. Windows 编程中用到的变量(还包括宏)的命名规则匈牙利命名法,这种命名技术是由一位能干的 Microsoft 程序 ...

  9. [摘抄] 匈牙利命名法

    匈牙利命名法中常用的小写字母的前缀: 前缀 整数类型 i 整型int l 长整型long int n 短整型short int w Word dw Double Word h Handle(句柄本身其 ...

最新文章

  1. CentOS 7.5 如何升级Git实录
  2. 关于C语言中的一些注意问题的小记之一----+号使用
  3. 设计模式C++实现(6)——建造者模式
  4. python3新式类_python新式类和旧式类区别
  5. Microsoft SQL Server 2005 提供了一些工具来监控数据库
  6. 2021年中国移动游戏行业深度洞察报告
  7. Hybrid A*论文解析(3)
  8. 【JAVA SE】第十章 String类、StringBuffer类和StringBuilder类
  9. 电脑怎么设计java环境_java环境变量配置,详细教您win7怎么配置java环境变量。
  10. Identity Server 4 原理和实战(完结)_----选看 OAuth 2.0 简介(上)
  11. 关于数据分析部门组织架构的探讨
  12. [多图]Maclean的巴厘岛游记
  13. ora-28500 ora-02063 mysql_ORA-01017/ORA-02063 DbLink建立错误问题分析及解决
  14. 深度竞品分析:阿里旗下闲鱼与58旗下转转
  15. hibernate之多对多配置
  16. Aspose.Words导出word导出pdf
  17. 国家语言代码大全【方便翻译查询】
  18. 2019/3/20统计单词数
  19. 提高网络营销的转化只需掌握这四步
  20. 一周上榜新书:强化学习、深度学习最受程序员关注

热门文章

  1. 白鹭引擎用java_白鹭引擎发布 5.1.6 版 优化打包 iOS Android App 的运行性能
  2. 在树莓派3上移植uboot
  3. B站基于Iceberg的湖仓一体架构实践
  4. idea打war包正确姿势,不要相信网上那些鬼
  5. oppok10pro和红米k50哪个值得买 两者配置对比
  6. 分段二次插值例题_二次样条插值[篇].doc
  7. RS485应用电路图
  8. 金融风控数据挖掘 · Task 5 模型融合
  9. VBA18随机函数RND例子(抽奖、指定几率、随机凑数)
  10. Python对阿里巴巴、谷歌、腾讯等六家公司股票数据进行分析与可视化实战(附源码 超详细)