匈牙利表示法适用于 Perl 吗?[关闭]
-
22-09-2019 - |
题
在 Perl 中,对任何事物的引用都是一个简单的标量,并且具有 $
印记。有时很难说它是什么样的参考。
我个人在引用的变量名前加上一个字母,表示引用类型。例子:
my $aValues = []; # arrayref
my $hValue = {}; # hashref
my $oValue = bless {}; # object
my $sValue = \(my $s = 'foo'); # scalarref
...
我见过这种表示法的支持者和反对者。你用它吗?它有什么缺点吗?
解决方案
我个人发现匈牙利符号很难阅读。我只是使用英语惯例:
my $values; # is an array
my $value; # is a scalar
my $value_hash; # is a hash
我通常将对象与标量相同,因为它的使用方式使它变得足够明显以至于它是一个对象。但是,如果我发现需要使用:
my $value_obj; # is an object
其他提示
嗯。 Arrayrefs和hashrefs等最终不会在这里感到困惑,以至于我们的perl-data类型经常出现。 (还: $oValue
?你有多通用?它是什么样的对象?)
给我语义单元匈牙利符号: $size_bits
, $size_bytes
, $size_kb
, $size_blocks
, $size_mb
, $size_gb
. 。基础数据类型?不像每秒增加3个字节至10兆字节并获得13个字节。 那 是匈牙利对某种形式的符号有用的地方。
如果您想要静态键入的语言,您知道在哪里可以找到它们...
但是,匈牙利的符号从未打算与技术数据类型有关(尽管它赢得了大部分不良代表被误解和对技术数据类型的应用)。最初发明了它的匈牙利人(查尔斯·西尼尼)打算传达它 语义 信息,例如使用 row
和 col
代码中的前缀处理表,因此您不会混合行和列索引。
匈牙利表示法的目的是嵌入语义注释
- 不能以其他方式在语言中表达,尤其是类型系统 AND
- 从上下文中看不出来
在变量的名称中。现在,由于 Perl 没有静态类型系统,因此匈牙利表示法似乎应该相当常见。但是,以匈牙利表示法的值为例:跟踪不可信数据的来源。
匈牙利表示法经常被引用的示例之一是将应用程序中的所有字符串变量添加为前缀 s
或者 u
(为了 安全的 和 不安全),具体取决于该字符串是来自受信任的源(或已被清理)还是不受信任的源。但:只需更换 不安全 和 被污染的 你对 Perl 中的污染有一个完美的描述。因此,在这种情况下,尽管 Perl 没有静态类型系统,但它有一个 动态的 类型系统允许您在语言中表达可信/不可信的语义,因此匈牙利表示法是多余的。(即使在没有内置污染支持的语言中,通常也有更好的方法,例如子类型(Python、Ruby、Smalltalk 等)、注释/属性(Java、C# 等)、元数据(Clojure,...)和静态类型(Haskell,ML,...)。)
另外,Perl 的表达能力非常强,因此更容易将变量的整个上下文保留在您的头脑中(或在一屏代码中),因此,语义通常从周围的代码中显而易见。
当然,好的命名也有帮助。
记住:匈牙利表示法是为 C 发明的,它不具备表达能力,并且具有静态类型系统,其几乎唯一的用途是作为笑话的妙语。
我不这样做,因为参考的用法将清楚其清楚。例如:
$a->{key}; # hash
... if @$b; # array
$c->foo; # object
为您的变量选择名称,以传达其代表的内容将有很长的路要走。 Perl是由语言学家设计的,并从自然语言中借用,因此上下文是关键。我们的大脑已经针对这种处理了。利用它在您的代码结构方式中!