恕我直言,使用 Systems Hungarian(为数据类型添加前缀)从不(*)真正有意义。您可以使用静态语言或动态语言,但编译器或解释器都负责类型系统。通过变量名称注释变量的类型只会导致歧义(例如,想象一个名为 的浮点数intSomething
)。
它与 Application Hungarian 完全不同,即以某种使用模式为前缀。我认为使用这种表示法是一种很好的做法,例如,'usValue' 表示不安全(即未经验证)的值。这为使用提供了视觉提示,并防止您混合使用具有相同类型但不打算一起使用的变量的不同用途(或者当它们打算一起使用时,您至少有一个想法到正在使用的内容,它们会在您的代码检查雷达上产生信号)。
我经常在 MATLAB 中使用这样的东西,例如idxInterest
表示双精度数组不是原始数据值,而只是以一种或另一种方式感兴趣的索引(到另一个数组中)。我经常使用selInterest
( sel
from select) 对逻辑索引做同样的事情(我同意这可能看起来像边界系统匈牙利语),但在许多情况下,两者都可以在相同的上下文中使用。
对于迭代器也是如此:我经常使用多维数组(例如 4D),在奇怪的情况下,我(par)for
在一个维度上运行 a,迭代器被称为iFoo
, jBar
, kBaz
, ... 而它们的上限通常是nFoo
, nBar
, nBaz
, ... (或numFoo
, ...)。在进行更复杂的索引操作时,您可以轻松查看索引属于哪个维度(通过前缀您知道使用了哪个数字维度,通过全名您知道该维度代表什么)。这使代码更具可读性。
除此之外,我经常使用dFoo=1;
, dBar=2;
, ... 来表示特定变量集的维数。这样,您可以很容易地看到类似的东西在s 上meanIncome = mean(income, dBar)
取均值,而不会传达相同的信息。由于您还必须设置变量,因此它还可以用作变量的文档。income
Bar
meanIncome = mean(income, 2)
d
虽然做类似iFoo + jBar
or的事情在技术上并不是不正确的kBaz + dBar
,但当这些确实出现在您的代码中时,它确实会引发一些问题,并且它们允许您更加警惕地检查该部分。这就是真正的(应用程序)匈牙利符号的意义所在。
(*) 唯一可能有意义的时刻是您的完整框架/语言要求您使用它的地方。例如,win32 API 使用它,因此当您直接与它交互时,您应该使用这些标准将混淆降至最低。但是,我认为寻找另一种框架/语言可能更有意义,甚至更有意义。
请注意,这与Perl 中使用的sigils、一些 BASIC 方言等有所不同。这些也传达了类型,但在许多实现中,这是类型定义,因此没有或很少有歧义。使用这种类型声明是否是一种好习惯是另一个问题(我不太确定我自己在这方面的立场)。