在解释语言中使用匈牙利表示法前缀是否有意义?

时间:2012-01-09 16:17:13

标签: python matlab interpreter interpreted-language weak-typing

首先,我已经看过以下帖子以避免重复的问题。

https://stackoverflow.com/questions/1184717/hungarian-notation
Why shouldn't I use "Hungarian Notation"?
Are variable prefixes (“Hungarian notation”) really necessary anymore?
Do people use the Hungarian Naming Conventions in the real world?

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

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

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

5 个答案:

答案 0 :(得分:14)

这取决于您所指的two versions中的哪一个:

  • 如果你想使用“真实的”原始匈牙利表示法AKA Applications匈牙利表示法,表示逻辑变量类型resp。它的目的,随时可以这样做。

  • OTOH,“被误解”的版本AKA Systems Hungarian表示法,只是表示物理变量类型不赞成,不应该使用。

答案 1 :(得分:11)

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

与匈牙利申请完全不同,即使用某种使用模式作为前缀。我认为使用这种表示法是一种好习惯,例如: 'usValue'表示不安全(即未经验证)的值。这给出了一个关于用法的视觉提示,并且阻止你混合使用具有相同类型但不打算一起使用的变量的不同用途(或者当它们打算一起使用时,你至少有一个想法对于正在使用的内容,它们会在您的代码检查雷达上产生一些影响。)

我经常在MATLAB中使用这样的东西,例如idxInterest表示双精度数组不是原始数据值,而是指向以某种方式感兴趣的索引(进入另一个数组)。我经常使用selInterest(来自select的sel)对逻辑索引执行相同的操作(我同意这可能看起来像边界系统匈牙利语),但在很多情况下,两者都可以在相同的上下文中使用。 / p>

类似于迭代器:我经常使用多维数组(例如4D),奇怪的是我在一个维度上运行(par)for,迭代器被称为iFoojBar,{ {1}},...,而其上限通常为kBaznFoonBar,...(或nBaz,...)。在进行更复杂的索引操作时,您可以轻松查看哪个索引属于哪个维度(通过前缀,您知道使用的是什么数字维度,您知道该维度代表什么的全名)。这使代码更具可读性。

接下来,我经常使用numFoodFoo=1;,...来表示某组变量的维度数。这样,您可以轻松地看到dBar=2;之类的内容meanIncome = mean(income, dBar)取代income,而Bar则不会传达相同的信息。由于您还必须设置meanIncome = mean(income, 2)变量,因此它还可用作变量的文档。

虽然执行diFoo + jBar之类的操作在技术上不正确,但在代码中出现这些问题时会引发一些问题,并且它们允许您更加警惕地检查该部分。这就是真实的(应用程序)匈牙利表示法的全部内容。

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

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

答案 2 :(得分:4)

匈牙利符号传达类型(“系统匈牙利语”)在Python中不受欢迎的原因很简单。这是误导。一个变量可能被称为iPhones(手机的整数,可能是:-)但是因为它是Python,所以没有任何东西可以阻止你将整数以外的东西放入其中!也许你会发现你出于某种原因需要这样做。然后使用它的所有代码对于试图理解它的人来说都是非常误导,除非您全局更改变量的名称。

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

答案 3 :(得分:3)

正如提议的那样,匈牙利符号是一个合理的想法。它被应用了吗?应该从轨道上进行训练(这是确定的唯一方法。)

答案 4 :(得分:1)

您链接的第一个问题中接受的答案适用于Python:

  

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

对于Python来说,这一切也是如此。