匈牙利命名法

电脑杂谈  发布时间:2020-04-30 09:16:45  来源:网络整理

领导力21法则:追随这些法则_匈牙利命名法则_走迷宫 右手法则还是左手法则

匈牙利命名法

问大家:

在编写c ++ / mfc程序时,将使用变量命名规则吗?会使用匈牙利命名法吗?还是其他变量命名规则?

有时为了使变量类型更清楚,我将匈牙利语命名法应用于代码,但是有时我发现对于C ++匈牙利命名法则,这种命名法不太适合. 有时在查看其他人编写的代码时(尤其是在国外论坛中),基本上没有应用变量命名规则,并且变量名非常短,因此简单的程序看起来非常新鲜和舒适.

希望您能谈谈您的惯常做法.

过去,在编写代码时,有时我强迫自己使用匈牙利命名规则,但是今天我看到了对此规则的异议,并且由于我所说的某些问题,我认为这确实很有意义. 我很困惑.

走迷宫 右手法则还是左手法则_领导力21法则:追随这些法则_匈牙利命名法则

--------------------------------------------------- ---------

语音

匈牙利命名法是编程的命名约定. 在程序编写约定中,命名约定是最重要且最具争议的地方. 命名约定的用途是什么?四个字: 名字正确. 使用二分法,将命名约定分为良好的命名约定和不良的命名约定,即合理的命名约定和不正确的命名约定. 好的舞鞋会使舞者感觉不到自己的存在,而坏的舞鞋会使舞者shoes铐跳舞. 不良的命名约定比良好的命名约定更具破坏性.

有人认为匈牙利的命名法是一个不好的命名约定. 例如. 以静态强类型编程语言为例,分析模板为C语言和C ++语言. 以下匈牙利法律是匈牙利术语的缩写.

费用

匈牙利法律的表达形式是在变量名称前添加类型名称前缀,例如: nFoo,szFoo,pFoo,cpFoo表示整数变量,字符串变量,指针变量和常量指针变量. 可以看出,匈牙利法律将变量的类型信息从一个地方(声明了变量的地方)复制到了多个地方(使用了变量的地方),这是一种多余的方法. 冗余方法的成本之一是保持副本的一致性. 当在编写和维护代码的过程中需要更改变量的类型时,将支付此费用. 冗余方法的第二个成本是占用额外的空间. 优秀的作者会自觉遵循一条规则: 代码的最小组织单位长度应少于30条自然线. 如果超过50行,则应进行重组. 可变的书写空间为该规则增加了不必要的难度.

匈牙利命名法则_走迷宫 右手法则还是左手法则_领导力21法则:追随这些法则

收入

匈牙利命名法的好处含糊且难以预测.

模板1: strcpy(pstrFoo,pcstrFoo2)Vsstrcpy(foo,foo2)

没有程序员会承认他不知道strcpy函数的参数类型,因此增益为零.

模板2: unknown_function(nFoo)Vsunknown_function(foo)

仍然没有收入. 对于不知道某种类型的功能,程序员应检查该功能的说明文件,这是一项成本. 使用匈牙利方法的唯一好处是,阅读代码的人知道此函数需要一个整数参数,这是没有用的. 函数是一个接口,参数的类型只是该接口的一小部分. 重要信息,例如功能的功能,退出信息,线程安全性,异常安全性,参数有效性等,仍必须查阅文档.

领导力21法则:追随这些法则_走迷宫 右手法则还是左手法则_匈牙利命名法则

模板3: nFoo = nBarVsfoo = bar

使用匈牙利语方法的唯一好处是,阅读代码的人知道这里已经发生了整数变量的复制操作,这听起来还可以,而且可以放心. 如果他看到nFoo = szBar,就无法放心. 但这种情况并非如此. 第一个问题应该是编译器. 另一方面,nFoo = nBar在语法上只是合法的. 那些读过代码的人真的很在乎语义的合法性,而匈牙利法律没有帮助. 另一方面,优秀的作者会自觉遵循一条规则: 最小的组织单位代码中的临时变量应该是一两个,如果要重组三个以上的话. 结合上述第一个规则,可以得出结论,易于理解的代码本身应该易于理解,这是代码的内置高质量. 好的命名约定对内置高质量的好处非常有限,而不好的命名约定对内置高质量的损害比人们想象的要大.

实施

匈牙利术语很难用C语言实现,而用C ++语言则很难.

匈牙利法律是类型系统的冗余,因此实施匈牙利法律的关键是我们是否可以准确地复制类型系统. 这取决于类型系统的复杂性.

C语言:

领导力21法则:追随这些法则_走迷宫 右手法则还是左手法则_匈牙利命名法则

1. 内置类型: int,char,float,double复制为n,ch,f,d?似乎没有问题. 但是如何表达虚无?

2. 组合类型: 数组,联合,枚举,复制为a,u,e,s的结构?不便.

这里的困难不是命名主要类型,而是命名子类型. 一个代表整数数组? sfoo,sbar表示结构foo匈牙利命名法则,结构bar? ausfoo代表联合结构foo数组?非常冗长.

3. 特殊类型: 指针. 从理论上讲,指针应为组合类型,但由于C语言并未严格区分不同的指针类型,因此可以将其视为C语言的内置类型.

C ++语言:

1.class: 如果可以说C语言中的struct也可以使用stru阻止过去,那么不要梦想使用cls来阻止C ++中的类. 严格来说,类根本不是类型,而是用于创建类型的工具. 在C ++中,与通过类创建的用户定义类型相比,该语言中的内置类型数量可以完全忽略. stdvectorFoo表示标准库矢量类型变量Foo,这是不合逻辑的.

2. 命名空间: boostfilesystemiteratorFoo,这意味着boostspace文件系统子空间遍历目录类型变量Foo,这仍然不可行.

3. 模板: std :: map 类型的确切名称是什么,具有超过255个字符.

4. 模板参数: 模板 constT&max(constT&a,constT&b,BinaryPredicatecomp)以匈牙利命名法命名,这非常困难.

5. 类型修改: static,extern,mutable,register,volatile,const,short,long,unsigned plus类型修改,这更加困难.


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-194008-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...