匈牙利命名法适用于Perl吗?

13
在Perl中,任何引用都是简单标量,并且具有$符号。有时很难说它是哪种类型的引用。
我个人使用一个字母作为前缀来表示引用类型,以指示变量名称是引用。例如:
my $aValues = [];                # arrayref
my $hValue  = {};                # hashref
my $oValue  = bless {};          # object
my $sValue  = \(my $s = 'foo');  # scalarref
...

我看到过对这种表示法支持和反对的观点。你使用它吗?它有什么缺点吗?


11
诀窍在于让每个变量的作用范围尽可能短,这样你只需要查看周围几行代码就能找到它的作用。 :) - brian d foy
5个回答

18

呃,这里的数组引用、哈希引用等等并不会让我们的 Perl 数据类型变得混乱到经常出现这种问题。(另外:$oValue?你能再泛泛一点吗?它是什么样的对象?)

给我语义单元的匈牙利命名法: $size_bits$size_bytes$size_kb$size_blocks$size_mb$size_gb。底层数据类型?不如将每秒增加 3 字节到 10 兆字节并得到 13 这样重要。这就是某种形式的匈牙利命名法有用的地方。


6
这就是最初匈牙利命名法的*预期使用方式。 - Michael Kristofik
我会说,这些例子都不是真正的匈牙利命名法,你只是使用了完整的描述性名称,而不是一个丑陋、难以理解的前缀。适当的名称 > 匈牙利甚至应用程序中的匈牙利命名。 - jk.

16

个人而言,我发现匈牙利命名法很难阅读。我只使用英语约定:

my $values; # is an array
my $value;  # is a scalar
my $value_hash; # is a hash

通常我会将对象视为标量,因为使用方式很明显表明它是一个对象。 但是,如果我有需要的话,我会使用:

my $value_obj;  # is an object

这通常是我尝试做的事情。 - brian d foy
+1 我也使用这个。在大多数情况下,匈牙利命名法似乎过于简洁了。为什么不直接拼出变量的含义呢? - Eric

10

如果你想要静态类型语言,你知道在哪里找到它们...

但是匈牙利标记法并不是为了处理技术数据类型而发明的(尽管由于误解和应用于技术数据类型而获得了大部分负面评价)。最初发明匈牙利标记法的匈牙利人 Charles Simonyi 所希望传达的是语义信息,例如在处理表格的代码中使用 rowcol 前缀,以免混淆行和列索引。


6
匈牙利命名法的目的是在变量名称中嵌入语义注释,这些注释通常无法通过语言本身(尤其是类型系统)表达,并且从上下文中也无法明显看出。现在,由于Perl没有静态类型系统,因此匈牙利命名法似乎应该相当常见。但是,以匈牙利命名法的价值为例:跟踪不受信任数据的来源。其中一个经常引用的匈牙利命名法的例子是,在应用程序中为所有字符串变量添加前缀s或u(表示“安全”和“不安全”),具体取决于字符串来自可信源(或已过滤)还是不可信源。但是:只需将“不安全”替换为“污染”,就可以完美地描述Perl中的污染。因此,在这种情况下,即使Perl没有静态类型系统,它也有一种动态类型系统,允许您在语言内部表达可信/不可信的语义,因此匈牙利命名法是多余的。(即使在没有内置支持污染的语言中,通常也有更好的方法,例如子类型化(Python、Ruby、Smalltalk等)、注释/属性(Java、C#等)、元数据(Clojure等)和静态类型(Haskell、ML等)。)此外,Perl非常富有表现力,因此很容易将变量的整个上下文保留在头脑中(或者在一屏代码内),因此通常从周围的代码中就可以明显看出语义。当然,良好的命名也有帮助。请记住:匈牙利命名法是为C语言发明的,而C语言不够表达力,并且其静态类型系统几乎只用作笑话的结尾。

4

我不这样做,因为参考的使用将清楚地说明它的事情。例如:

$a->{key};  # hash
... if @$b; # array
$c->foo;    # object

选择能够传达变量所代表含义的名称将有很大帮助。Perl是由一位语言学家设计的,并借鉴了自然语言,因此上下文非常关键。我们的大脑已经适应了这种处理方式。在编写代码时,请充分利用它!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接