13

首先,我查看了以下帖子以避免重复问题。

https://stackoverflow.com/questions/1184717/hungarian-notation
为什么我不应该使用“匈牙利符号”?
变量前缀(“匈牙利符号”)真的有必要了吗?
人们在现实世界中使用匈牙利命名约定吗?

现在,所有这些帖子都与 C#、C++、Java 相关——强类型语言。
我确实理解在编译之前知道类型时不需要前缀。
不过,我的问题是:

考虑到在运行时之前看不到对象的类型这一事实,是否值得在基于解释器的语言中使用前缀?

编辑:如果有人可以将此帖子作为社区维基,请这样做。我对这篇文章的声誉(或负面声誉)几乎不感兴趣。

4

5 回答 5

20

这取决于您引用的两个版本中的哪一个:

  • 如果您想使用“真实”的原始匈牙利符号 AKA Applications Hungarian notation,分别表示逻辑变量类型。它的目的,随意这样做。

  • OTOH,“被误解的”版本 AKA Systems Hungarian 表示法,仅表示物理变量类型不受欢迎,不应使用。

于 2012-01-09T16:28:46.123 回答
12

恕我直言,使用 Systems Hungarian(为数据类型添加前缀)从不(*)真正有意义。您可以使用静态语言或动态语言,但编译器或解释器都负责类型系统。通过变量名称注释变量的类型只会导致歧义(例如,想象一个名为 的浮点数intSomething)。

它与 Application Hungarian 完全不同,即以某种使用模式为前缀。我认为使用这种表示法是一种很好的做法,例如,'usValue' 表示不安全(即未经验证)的值。这为使用提供了视觉提示,并防止您混合使用具有相同类型但不打算一起使用的变量的不同用途(或者当它们打算一起使用时,您至少有一个想法到正在使用的内容,它们会在您的代码检查雷达上产生信号)。

我经常在 MATLAB 中使用这样的东西,例如idxInterest表示双精度数组不是原始数据值,而只是以一种或另一种方式感兴趣的索引(到另一个数组中)。我经常使用selInterest( selfrom select) 对逻辑索引做同样的事情(我同意这可能看起来像边界系统匈牙利语),但在许多情况下,两者都可以在相同的上下文中使用。

对于迭代器也是如此:我经常使用多维数组(例如 4D),在奇怪的情况下,我(par)for在一个维度上运行 a,迭代器被称为iFoo, jBar, kBaz, ... 而它们的上限通常是nFoo, nBar, nBaz, ... (或numFoo, ...)。在进行更复杂的索引操作时,您可以轻松查看索引属于哪个维度(通过前缀您知道使用了哪个数字维度,通过全名您知道该维度代表什么)。这使代码更具可读性。

除此之外,我经常使用dFoo=1;, dBar=2;, ... 来表示特定变量集的维数。这样,您可以很容易地看到类似的东西在s 上meanIncome = mean(income, dBar)取均值,而不会传达相同的信息。由于您还必须设置变量,因此它还可以用作变量的文档。incomeBarmeanIncome = mean(income, 2)d

虽然做类似iFoo + jBaror的事情在技术上并不是不正确的kBaz + dBar,但当这些确实出现在您的代码中时,它确实会引发一些问题,并且它们允许您更加警惕地检查该部分。这就是真正的(应用程序)匈牙利符号的意义所在。

(*) 唯一可能有意义的时刻是您的完整框架/语言要求您使用它的地方。例如,win32 API 使用它,因此当您直接与它交互时,您应该使用这些标准将混淆降至最低。但是,我认为寻找另一种框架/语言可能更有意义,甚至更有意义。

请注意,这与Perl 中使用的sigils、一些 BASIC 方言等有所不同。这些也传达了类型,但在许多实现中,这是类型定义,因此没有或很少有歧义。使用这种类型声明是否是一种好习惯是另一个问题(我不太确定我自己在这方面的立场)。

于 2012-01-09T19:49:59.993 回答
9

匈牙利符号传送类型(“systems Hungarian”)在 Python 中不受欢迎的原因很简单。这是误导。可能会调用一个变量iPhones(电话号码的整数,也许 :-),但是因为它是 Python,所以没有什么可以阻止您将整数以外的东西放入其中!也许您会发现出于某种原因需要这样做。然后所有使用它的代码都会对试图理解它的人产生很大的误导,除非您当然全局更改变量的名称。

这种表示法旨在帮助您跟踪静态类型语言中的变量类型,并且可以说在一段时间内很有用。但是现在它已经过时了,即使对于静态类型的语言,考虑到可以更好地完成这项工作的 IDE 的可用性。

于 2012-01-09T18:24:53.170 回答
3

正如建议的那样,匈牙利符号是一个合理的想法。因为它被应用了?它应该从轨道上被核弹(这是唯一可以确定的方法。)

于 2012-01-09T16:33:27.590 回答
2

您链接到的第一个问题的公认答案同样适用于 Python:

匈牙利符号在 Java 中没有位置。Java API 不使用它,大多数开发人员也不使用它。Java 代码看起来不像 Java 使用它。

这对 Python 来说也是如此。

于 2012-01-09T16:19:23.243 回答