匈牙利语符号适用于Perl吗?

Eug*_*ash 13 perl types naming-conventions hungarian-notation

在Perl中,对任何东西的引用都是一个简单的标量,并且有$sigil.有时很难说它是什么样的参考.

我个人为带有字母的引用添加变量名称,这表示引用类型.例子:

my $aValues = [];                # arrayref
my $hValue  = {};                # hashref
my $oValue  = bless {};          # object
my $sValue  = \(my $s = 'foo');  # scalarref
...
Run Code Online (Sandbox Code Playgroud)

我见过这种符号的支持者和反对者.你用它吗?它有任何缺点吗?

小智 18

咩.Arrayrefs和hashrefs等并不会让人感到困惑,因为这个问题经常出现在我们的Perl数据类型中.(另外:$oValue?你有多通用?它是什么类型的对象?)

给我语义单位匈牙利表示法来代替:$size_bits,$size_bytes,$size_kb,$size_blocks,$size_mb,$size_gb.基础数据类型?没有像每秒增加3个字节到10兆字节并获得13那么重要.就是某种形式的匈牙利符号有用的地方.

  • +1.这就是匈牙利的符号*首先应该用于*. (6认同)

sle*_*man 16

就个人而言,我觉得匈牙利语符号难以阅读.我只是使用英语惯例:

my $values; # is an array
my $value;  # is a scalar
my $value_hash; # is a hash
Run Code Online (Sandbox Code Playgroud)

我通常将对象视为与标量相同,因为它的使用方式使它足够明显,它是一个对象.但是,如果我发现需要使用:

my $value_obj;  # is an object
Run Code Online (Sandbox Code Playgroud)


Mic*_*rdt 10

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

但匈牙利语符号从未打算用于技术数据类型(尽管它已经使大多数不良反应被误解和应用于技术数据类型).最初发明它的匈牙利人(Charles Simonyi)打算传达语义信息,例如在处理表格的代码中使用rowcol前缀,这样就不会混淆行索引和列索引.


Jör*_*tag 6

匈牙利表示法的目的是嵌入语义注释

  • 不能在语言中表达,尤其是类型系统AND
  • 从上下文来看并不明显

在变量的名称.现在,由于Perl没有静态类型系统,可能看起来匈牙利符号应该相当普遍.但是,采用匈牙利符号值的规范示例:跟踪不受信任数据的来源.

匈牙利表示法中常被引用的示例之一是为应用程序中的所有字符串变量添加前缀su(对于安全不安全),具体取决于字符串是来自可信来源(或已被消毒)还是不受信任来源.但是:只需用污染替换不安全的东西,你就可以完美地描述Perl中的污染.因此,在这种情况下,即使Perl没有静态类型系统,它也有一个动态类型系统,允许您在语言中表达可信/不可信的语义,因此匈牙利符号是多余的.(甚至在没有内置支持污染的语言中,通常有更好的方法,例如子类型(Python,Ruby,Smalltalk,...),注释/属性(Java,C#,...),元数据(Clojure,...)和静态类型(Haskell,ML,...).)

此外,Perl非常具有表现力,因此在头脑中(或在一个代码屏幕内)保持变量的整个上下文要容易得多,因此,通常从周围的代码中可以看出语义.

当然,良好的命名也有帮助.

请记住:匈牙利符号是为C发明的,它不具有表现力,并且具有静态类型系统,其几乎只用作笑话的妙语.