Language agnostic 为什么不应该';t我使用“;匈牙利符号“;?
我知道匈牙利语指的是什么——将变量、参数或类型的信息作为其名称的前缀。每个人似乎都强烈反对,尽管在某些情况下这似乎是个好主意。如果我觉得有用的信息正在被传递,为什么我不把它放在可用的地方呢Language agnostic 为什么不应该';t我使用“;匈牙利符号“;?,language-agnostic,naming-conventions,hungarian-notation,Language Agnostic,Naming Conventions,Hungarian Notation,我知道匈牙利语指的是什么——将变量、参数或类型的信息作为其名称的前缀。每个人似乎都强烈反对,尽管在某些情况下这似乎是个好主意。如果我觉得有用的信息正在被传递,为什么我不把它放在可用的地方呢 另请参见:我认为它会将源代码弄得乱七八糟 在强类型语言中,它也不会给您带来太多好处。如果你做了任何形式的类型不匹配的傻事,编译器会告诉你。IDE应该提供有用的信息。当IDE还不那么先进的时候,匈牙利人可能已经有了某种意义(不是很多,而是某种意义上的意义)。Joel Spolsky为此写了一篇很好的博客文章。
另请参见:我认为它会将源代码弄得乱七八糟
在强类型语言中,它也不会给您带来太多好处。如果你做了任何形式的类型不匹配的傻事,编译器会告诉你。IDE应该提供有用的信息。当IDE还不那么先进的时候,匈牙利人可能已经有了某种意义(不是很多,而是某种意义上的意义)。Joel Spolsky为此写了一篇很好的博客文章。
基本上,当一个像样的IDE告诉你想要输入变量时,你就不会让你的代码更难阅读。另外,如果你把代码划分得足够细,你就不必记住变量在三页上声明了什么。我一直认为在正确的位置加上一两个前缀不会有什么坏处。我想如果我能传授一些有用的东西,比如“嘿,这是一个接口,不要指望具体的行为”,就像在IEnumerable中一样,我应该这样做。注释不仅仅是一个或两个字符的符号,它还可以把事情弄得乱七八糟。在大多数现代IDE中,注释是令人难以置信的冗余和无用的,在IDE中,注释可以很好地显示类型
另外——对我来说——看到intI、strUserName等真让人恼火:)我不认为每个人都强烈反对它。在没有静态类型的语言中,它非常有用。当它用于提供类型中尚未包含的信息时,我当然更喜欢它。与C类似,char*szName表示变量将引用以null结尾的字符串——这在char*中不是隐式的——当然,typedef也会有所帮助 Joel有一篇关于使用匈牙利语判断变量是否为HTML编码的精彩文章:
无论如何,当匈牙利语被用来传递我已经知道的信息时,我倾向于不喜欢它。用大师的话说: 像往常一样,这本书很有趣 摘录: “有人在某处读过Simonyi的论文,他在论文中使用了“类型”一词,认为他指的是类型,就像类一样,就像在类型系统中,就像编译器进行的类型检查一样。他没有这样做。他非常仔细地解释了他所说的“类型”一词的确切含义,但没有起到任何作用。损害已经造成了。” “但Apps Hungarian仍有巨大的价值,因为它增加了代码的搭配,使代码更易于阅读、编写、调试和维护,最重要的是,它使错误的代码看起来是错误的。” 在阅读Joel On软件之前,请确保您有一些时间。:) 如果我觉得有用的信息正在被传递,为什么我不把它放在可用的地方呢
那谁在乎别人怎么想?如果你觉得它有用,就用这个符号。根据我的经验,它不好,因为: 1-如果需要更改变量类型(即,如果需要将32位整数扩展为64位整数),则中断所有代码 2-这是无用的信息,因为类型已经在声明中,或者您使用的是一种动态语言,而实际类型一开始就不应该如此重要
此外,对于接受泛型编程的语言(即编写函数时某些变量的类型不确定的函数)或动态类型系统(即编译时甚至不确定类型),您将如何命名变量?大多数现代语言支持一种或另一种,即使是受限形式。大多数人以错误的方式使用匈牙利符号,并得到错误的结果 阅读Joel Spolsky的这篇优秀文章: 简言之,在变量名前面加上
类型
(字符串)(Systems Hungarian)前缀的匈牙利符号是不好的,因为它没有用
匈牙利语符号,正如作者所希望的那样,在变量名称前面加上种类的前缀(使用Joel的例子:安全字符串或不安全字符串),所谓的Apps Hungarian有它的用途,仍然很有价值。几个原因:
- 任何现代IDE都会通过将鼠标悬停在变量上来提供变量类型
- 大多数类型名都很长(想想HttpClientRequestProvider),可以合理地用作前缀
- 类型信息没有包含正确的信息,它只是解释变量声明,而不是概述变量的用途(想想myInteger和pageSize)
匈牙利符号在语言中非常有用,无需编译时类型检查,因为它允许开发人员快速提醒自己如何使用特定变量。它对性能或行为没有任何作用。它被认为是为了提高代码的可读性,主要是一种品味和编码风格。正是由于这个原因,它受到了许多开发人员的批评——并不是每个人的大脑中都有相同的线路
对于编译时类型检查语言来说,它基本上是无用的——向上滚动几行应该会显示声明,从而显示类型。如果您的全局变量或代码块跨越多个屏幕,则会出现严重的设计和可重用性问题。因此,其中一个批评是匈牙利符号允许开发人员进行糟糕的设计,并且很容易逃脱惩罚。这可能是仇恨的原因之一
另一方面,在某些情况下,甚至编译时类型检查语言也会受益于匈牙利符号——win32 API中的无效指针或句柄。这些混淆了实际的数据类型,并且可能存在
LRESULT CALLBACK WindowProc(HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
* l for local
* a for argument
* m for member
* g for global
* etc
foo = 12
print "The current value of foo is %s" % foo
<asp:Label ID="lblFirstName" runat="server" Text="First Name" />
<asp:TextBox ID="txtFirstName" runat="server" />
<asp:RequiredFieldValidator ID="rfvFirstName" runat="server" ... />
frcGravityEarthMars = G * massEarth * massMars / norm(posEarth - posMars)