在解释语言中使用匈牙利符号前缀是不是有意义? [关闭]
Posted
技术标签:
【中文标题】在解释语言中使用匈牙利符号前缀是不是有意义? [关闭]【英文标题】:Does it make sense to use Hungarian notation prefixes in interpreted languages? [closed]在解释语言中使用匈牙利符号前缀是否有意义? [关闭] 【发布时间】:2012-02-06 04:07:06 【问题描述】:首先,我查看了以下帖子以避免重复问题。
https://***.com/questions/1184717/hungarian-notationWhy 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 - 强类型语言有关。 我确实理解在编译之前知道类型时不需要前缀。 不过,我的问题是:
考虑到您在运行前看不到对象的类型这一事实,是否值得在基于解释器的语言中使用前缀?
编辑:如果有人可以将此帖子作为社区维基,请这样做。我对这篇文章的声誉(或负面声誉)几乎不感兴趣。
【问题讨论】:
【参考方案1】:这取决于你指的是哪个two versions:
如果您想使用“真实”的原始匈牙利符号 AKA Applications Hungarian notation,分别表示逻辑变量类型。它的目的,随意这样做。
OTOH,“被误解的”版本 AKA Systems Hungarian 表示法,仅表示不赞成使用物理变量类型,不应使用。
【讨论】:
为什么在运行前我不知道类型的语言中,它仍然不受欢迎? @Andrey - 如果您在运行前不知道类型,那么“lpsz”这样的前缀会传达给您什么? @Throwback1986,假设我只对整数使用“i”前缀,对布尔值使用“b”等。这很简单,让我可以阅读代码并了解类型。跨度> 我建议你阅读匈牙利符号的原意。总而言之,目的是传达使用或语义,而不是数据存储类型。我发现微软——主要负责发布有缺陷的用法的实体——现在提倡不使用 HN,这很有启发性。 msdn.microsoft.com/en-us/library/fzcth91k%28VS.71%29.aspx【参考方案2】:恕我直言,使用 Systems Hungarian(为数据类型添加前缀)从不(*)真正有意义。您可以使用静态语言或动态语言,但编译器或解释器都负责类型系统。通过变量名称注释变量的类型只会导致歧义(例如,想象一个名为 intSomething
的浮点数)。
它与 Application Hungarian 完全不同,即以某种使用模式为前缀。我认为使用这种表示法是一种很好的做法,例如'usValue' 表示不安全(即未经验证)的值。这为使用提供了视觉提示,并防止您混合使用具有相同类型但不打算一起使用的变量的不同用途(或者当它们打算一起使用时,您至少有一个想法到正在使用的内容,它们会在您的代码检查雷达上产生信号)。
我经常在 MATLAB 中使用这样的东西,例如idxInterest
表示双精度数组不是原始数据值,而只是以某种方式感兴趣的索引(到另一个数组中)。我经常使用selInterest
(sel
from select)对逻辑索引做同样的事情(我同意这可能看起来像边界系统匈牙利语),但在许多情况下,两者都可以在相同的上下文中使用。
对于迭代器也是如此:我经常使用多维数组(例如 4D),在奇怪的情况下,我在一个维度上运行 (par)for
,迭代器被称为 iFoo
、jBar
、kBaz
,...而它们的上限一般为nFoo
、nBar
、nBaz
、...(或numFoo
、...)。在进行更复杂的索引操作时,您可以轻松查看索引属于哪个维度(通过前缀您知道使用了哪个数字维度,通过全名您知道该维度代表什么)。这使代码更具可读性。
除此之外,我经常使用dFoo=1;
、dBar=2;
、...来表示特定变量集的维数。这样,您可以很容易地看到像 meanIncome = mean(income, dBar)
这样的东西在 Bar
s 上取平均值 income
,而 meanIncome = mean(income, 2)
不传达相同的信息。由于您还必须设置 d
Variables,它还可以用作变量的文档。
虽然执行iFoo + jBar
或kBaz + dBar
之类的操作在技术上并非不正确,但当这些问题确实出现在您的代码中时,它确实会引发一些问题,并且它们允许您更加警惕地检查该部分。这就是真正的(应用程序)匈牙利符号的意义所在。
(*) 唯一可能有意义的时刻是您的完整框架/语言要求您使用它。例如。 win32 API 使用它,因此当您直接与它交互时,您应该使用这些标准将混淆降至最低。但是,我认为寻找另一种框架/语言可能更有意义,甚至更有意义。
请注意,这与 Perl 中使用的 sigils 不同,一些 BASIC 方言等也传达了类型,但在许多实现中,这是类型定义,因此不会或很少有歧义。使用这种类型声明是否是一种好习惯是另一个问题(我不太确定自己在这方面的立场)。
【讨论】:
它很可能在 Fortran 中使用隐式类型。 @VladimirF:在我看来,隐式类型只是一种商品,如果你喜欢的话,是语法糖。当您使用 Systems Hungarian Notation 时,您不妨使用 The Right Thing® 并正确定义类型,以便让编译器为您工作并检测任何相关错误。恕我直言,系统匈牙利表示法甚至减少了隐式类型的优点(因为您非正式地附加了类型),同时只增加了可能的不一致等缺点。随意争论,因为我没有使用 Fortran 及其隐式类型的经验。【参考方案3】:匈牙利符号传送类型(“系统匈牙利语”)在 Python 中不受欢迎的原因很简单。这是误导。一个变量可能被称为iPhones
(电话的整数,也许是:-),但是因为它是 Python,所以没有什么可以阻止您将整数以外的东西放入其中!也许您会发现出于某种原因需要这样做。然后所有使用它的代码对试图理解它的人非常具有误导性,当然除非你全局更改变量的名称。
这种表示法旨在帮助您跟踪静态类型语言中的变量类型,并且可以说在一段时间内很有用。但是现在它已经过时了,即使对于静态类型的语言,考虑到 IDE 可以更好地完成这项工作。
【讨论】:
将其他类型的对象放入一个不适合它的函数中,在我看来,这听起来像是很多错误。 @DirkBoer 取决于。面向对象的方法说只依赖于对象的接口(它们的行为),而不是它们的类型(它们是什么)。【参考方案4】:正如提出的那样,匈牙利符号是一个合理的想法。因为它被应用了?它应该从轨道上被核爆(这是唯一确定的方法。)
【讨论】:
【参考方案5】:您链接到的第一个问题的接受答案同样适用于 Python:
匈牙利符号在 Java 中没有位置。 Java API 不使用它,大多数开发人员也不使用它。 Java 代码看起来不像使用它的 Java。
这对 Python 也是如此。
【讨论】:
以上是关于在解释语言中使用匈牙利符号前缀是不是有意义? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章