学习约定是否值得,还是会对可读性和可维护性造成不利影响?
学习约定是否值得,还是会对可读性和可维护性造成不利影响?
考虑到大多数使用匈牙利命名法的人都遵循了其被误解的版本,我认为这样做相当无意义。
如果您想使用它的原始定义,那么可能更有意义,但除此之外,它大多数是语法糖。
如果您阅读了相关的维基百科文章,您会发现两种相互冲突的表示法:系统匈牙利命名法和应用程序匈牙利命名法。
原始的、好的定义是应用程序匈牙利命名法,但大多数人使用系统匈牙利命名法。
以变量前缀l表示长度,a表示面积,v表示体积为例。
使用这种命名法,以下表达式是有意义的:
int vBox = aBottom * lVerticalSide;
但是这个不行:
int aBottom = lSide1;
如果您混淆了前缀,它们应被视为等式的一部分,且 volume = area * length 对于一个长方体来说是可以的,但将长度值复制到面积变量中应该引起一些警惕。
不幸的是,另一种表示法不太有用,其中人们使用值类型作为变量名称的前缀,就像这样:
int iLength;
int iVolume;
int iArea;
有些人使用n代表数字,i代表整数,f代表浮点数,s代表字符串等。
原始的前缀旨在用于检测方程中的问题,但不知何故已经演变为使代码稍微易读一些,因为您不必去查找变量声明。随着今天智能编辑器的出现,您可以简单地将鼠标悬停在任何变量上以找到完整类型,而不仅仅是它的缩写,这种匈牙利标记法已经失去了很多意义。
但是,你应该自己决定。我只能说我两者都不用。
编辑 补充一下,虽然我不用匈牙利标记法,但我使用前缀,它是下划线。我将类的所有私有字段都加上下划线作为前缀,并按照属性的命名方式拼写它们的名称,即标题大小写,首字母大写。
在涉及UI元素的情况下,我仍然使用匈牙利命名法,其中几个UI元素与特定对象/值相关联,例如:
lblFirstName用于标签对象,txtFirstName用于文本框。 即使这两个对象都需要关注/负责“FirstName”,我绝对不能将它们都命名为“FirstName”。
其他人是如何处理命名UI元素的?
我认为匈牙利命名法是通向更可读代码的“路径”上有趣的脚注。如果使用得当,它比不使用要好。
虽然如此,我更倾向于放弃它,而不是这样:
int vBox = aBottom * lVerticalSide;
写下这个:
int boxVolume = bottomArea * verticalHeight;
现在是2008年,我们不再使用80个字符的固定宽度屏幕了!
此外,如果您正在编写比这还要长的变量名,那么您应该考虑重构为对象或函数。
这种命名方式对于像整数、字符串、布尔和双精度浮点等类型至少在我们公司中被广泛使用,但它是毫无意义的(并且会分散注意力)。
类似于 sValue
, iCount
, dAmount
或 fAmount
, 以及 bFlag
这样的东西随处可见。
曾经有一个很好的理由来采用这种约定。现在,它却成为了一种病态。
现在,范围比类型更重要,例如:
使用现代重构旧代码的技术,如果您更改了变量的类型,则替换符号是繁琐的。编译器会捕捉到类型更改,但通常无法捕捉到范围的不正确使用,合理的命名约定可以帮助解决这个问题。
我并不严格遵循匈牙利命名法,但对于一些常见的自定义对象,我会适度使用它来帮助识别它们,并且我倾向于在GUI控件对象前加上它们所属的控件类型。例如,labelFirstName(标签名字)、textFirstName(文本框名字)和buttonSubmit(提交按钮)。
typedef volume_t int; typedef area_t int; typedef length_t int;
- vasilescur