匈牙利表示法的目的是将信息编码到标识符中,否则无法在类型系统中进行编码。我个人的看法是,如果此信息足够重要以进行编码,那么它就足够重要以在类型系统中进行编码,可以对其进行正确检查。如果信息不重要,那么为什么要用它来弄乱源代码呢?
或者,更简单地说:类型信息属于类型系统。(注意:它不必是静态类型系统。只要它能够捕获类型错误,我就不在乎何时捕获它们。)
其他几个答案提到度量单位是匈牙利表示法的可接受用法。(令我惊讶的是,到目前为止还没有人提及美国国家航空航天局火星气候轨道器,因为在有关匈牙利表示法的讨论中,这似乎一直存在。)
这是F#中的一个简单示例:
[<Measure>] type m
[<Measure>] type ft
let someLength = 48.15<m>
let someOtherLength = 16.2342<ft>
someLength + someOtherLength
// someLength + someOtherLength
// -------------^^^^^^^^^^^^^^^
// error FS0001: The unit of measure 'ft' does not match the unit of measure 'm'.
瞧,马,没有匈牙利人!
如果我在这里使用匈牙利表示法而不是类型,那对我没有帮助:
let mSomeLength = 48.15
let ftSomeOtherLength = 16.2342
mSomeLength + ftSomeOtherLength
// > val it : float = 64.3842
编译器让它直接通过。我现在依靠人工来发现本质上是类型错误的内容。这不是类型检查器的目的吗?
更好的是,使用Frink编程语言:
someLength = 48.15m
someOtherLength = 16.2342ft
someLength + someOtherLength
// 53.09818416 m (length)
// Wanna know the answer in a good old fashioned American unit?
someLength + someOtherLength -> yd
// 58.06888031496062992
// Are you an astrophysicist?
someLength + someOtherLength -> parsec
// 1.7207949554318336148e-15
// ... or a fundmentalist Christian who refuses to use units invented
// less than 2000 years ago?
someLength + someOtherLength -> biblicalcubits
// 95.893563822870765006
因此,总而言之:我不喜欢匈牙利符号。您永远不要使用它。
话虽如此,我认为使用匈牙利表示法是一个好主意。等一下
是! 在这种情况下,您提到了:
此外,我们的大多数代码都必须在某些怪异的DSP上运行,在这些怪异的DSP上根本不存在诸如bool或float的概念
但是,这恰恰是唯一明智的使用案例为匈牙利命名法!
PS:我全力推荐看Frink。它的手册包含一些有史以来最棒的放屁笑话。这也是一种很酷的语言:-)