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)