13

Perl では、あらゆるものへの参照は単純なスカラーであり、$シジルがあります。それがどのような種類の参照であるかを言うのは難しい場合があります。

私は個人的に、参照の変数名の前に文字を付けて、参照タイプを示します。例:

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

私は、そのような表記法に対する支持者と反対者の両方を見てきました。使いますか?欠点はありますか?

4

5 に答える 5

18

うーん。Arrayrefs や hashrefs などは、Perl のデータ型で頻繁に問題が発生するほど混乱することはありません。(また: $oValue? どこまで一般化できますか? それはどのような種類のオブジェクトですか?)

代わりに意味単位のハンガリー語表記法を教えてください: $size_bits, $size_bytes, $size_kb, $size_blocks, . 基礎となるデータ型? 毎秒 10 メガバイトに 3 バイトを追加して 13 を取得するほど重要ではありません。これは、何らかの形式のハンガリー表記が役立つ場所です。$size_mb$size_gb

于 2010-01-25T22:05:33.787 に答える
16

個人的にはハンガリー語表記が読みにくい。私は英語の慣習を使用しています:

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

私は通常、オブジェクトをスカラーと同じように扱います。これは、オブジェクトがどのように使用されるかによって、それがオブジェクトであることが十分に明白になるためです。ただし、必要がある場合は、次を使用します。

my $value_obj;  # is an object
于 2010-01-25T21:57:10.327 に答える
10

静的に型付けされた言語が必要な場合は、それらを見つける場所を知っています...

しかし、ハンガリー語の表記法は、技術的なデータ型に関することを意図したものではありませんでした (ただし、誤解され、技術的なデータ型に適用されるという悪い評判のほとんどを獲得しています)。これを最初に発明したハンガリー人 (Charles Simonyi) は、行インデックスと列インデックスを混同しないように、テーブルを扱うコードで接頭辞と接頭辞を使用するなど、セマンティック情報を伝えることを意図していました。rowcol

于 2010-01-25T22:13:37.620 に答える
6

ハンガリー語表記の目的は、意味的な注釈を埋め込むことです。

  • それ以外の場合は、言語、特に型システム AND
  • 文脈から明らかではない

変数の名前で。さて、Perl には静的型システムがないため、ハンガリー語表記がかなり一般的であるように見えるかもしれません。しかし、ハンガリー語表記の価値を示す標準的な例を見てみましょう。それは、信頼できないデータの出所を追跡することです。

ハンガリー語表記のよく引用される例の 1 つは、文字列が信頼できるソース (またはサニタイズされている) または信頼できないソースから来たかどうかに応じて、アプリケーション内のすべての文字列変数の前にsor u( safeunsafeを表す) を付けることです。しかし: unsafetaintedに置き換えるだけで、Perl での汚染の完全な説明が得られます。したがって、この場合、Perl には静的型システムがありませんが、動的型システムがあります言語内で信頼できる/信頼できないのセマンティクスを表現できる型システムであるため、ハンガリー語表記は不要です。(また、汚染のサポートが組み込まれていない言語であっても、サブタイピング (Python、Ruby、Smalltalk、...)、注釈/属性 (Java、C#、...)、メタデータなど、通常ははるかに優れた方法があります。 (Clojure、...) および静的型付け (Haskell、ML、...)。

また、Perl は非常に表現力が高いため、変数のコンテキスト全体を頭の中に (または 1 画面分のコード内に) 保持しておく方がはるかに簡単です。

もちろん、良いネーミングも役立ちます。

覚えておいてください: ハンガリー語表記法は C 用に発明されたもので、C は表現力がなく、静的な型システムを持ち、ほとんどの場合、ジョークのオチとしてのみ使用されます。

于 2010-01-26T00:41:47.357 に答える
4

参照の使用法がそのことを明らかにするので、私はこれをしません。例えば:

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

変数が何を表しているかを伝える変数の名前を選択することは、大いに役立ちます。Perl は言語学者によって設計され、自然言語から借用しているため、コンテキストが重要です。私たちの脳は、この種の処理のためにすでに配線されています。コードをどのように構成するかでそれを利用してください!

于 2010-01-25T21:58:02.257 に答える