ハンガリーの表記法は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やHashrefなどは、この辺りで混乱を招くことになり、Perl-Dataタイプの問題が非常に頻繁に発生することになります。 (また: $oValue
?あなたはどれほど一般的になれますか?どんなオブジェクトですか?)
代わりにセマンティックユニットハンガリーの表記をください: $size_bits
, $size_bytes
, $size_kb
, $size_blocks
, $size_mb
, $size_gb
. 。基礎となるデータ型? 1秒あたり10メガバイトに3バイトを追加し、13を取得するほど重要ではありません。 それか 何らかの形のハンガリー語の表記が役立つ場所です。
静的にタイプされた言語が必要な場合は、それらを見つける場所を知っています...
しかし、ハンガリーの表記は、技術データ型に関するものではありませんでした(ただし、その悪い担当者のほとんどが誤解され、技術データ型に適用されていることを獲得しています)。元々それを発明したハンガリー人(チャールズ・シモニー)はそれを伝えるつもりだった セマンティック 情報、例: row
と col
行と列のインデックスを混同しないように、テーブルを扱うコードのプレフィックス。
ハンガリー語の表記の目的は、セマンティックな注釈を埋め込むことです
- それ以外の場合は、言語、特にタイプシステムで表現することはできません
- コンテキストからは明らかではありません
変数の名前。現在、Perlには静的タイプシステムがないため、ハンガリーの表記法はかなり一般的であるべきだと思われるかもしれません。しかし、ハンガリー語の表記法の価値については、信頼されていないデータの起源を追跡する標準的な例を挙げてください。
ハンガリー語の表記のよく引用された例の1つは、いずれかのアプリケーションですべての文字列変数をプレフィックスすることです。 s
また u
(為に 安全 と 安全でない)、文字列が信頼できるソースから来た(または消毒された)か、信頼されていないソースから来たかに応じて。ただし、交換するだけです 安全でない と 汚染されています そして、あなたはPerlでの汚染についての完全な説明を持っています。したがって、この場合、Perlには静的タイプシステムがありませんが、 動的 言語内で信頼されていない/信頼されていないセマンティクスを表現できるため、ハンガリーの表記法は余分なものです。 (そして、タインティングの内蔵サポートのない言語でさえ、通常、サブタイピング(Python、Ruby、Smalltalk、...)、Annotations/Attributes(Java、C#、...)、Metadataなど、はるかに優れた方法があります。 (Clojure、...)および静的タイピング(Haskell、ML、...)。
また、Perlはかなり表現力豊かであるため、頭の変数のコンテキスト全体を(または1つのスクリーンフルのコード内)保持する方がはるかに簡単です。したがって、多くの場合、周囲のコードからセマンティクスが明らかになります。
もちろん、良い命名も役立ちます。
覚えておいてください:ハンガリーの表記はCのために発明されました。これは表現力豊かで、冗談のパンチラインとしてのみ使用のみが使用される静的タイプシステムを持っています。
リファレンスの使用が明らかになるので、私はこれをしません。例えば:
$a->{key}; # hash
... if @$b; # array
$c->foo; # object
それらが表すものを伝える変数の名前を選択することは、長い道のりを歩むでしょう。 Perlは言語学者によって設計され、自然言語から借用されているため、コンテキストが重要です。私たちの脳は、この種の処理のためにすでに配線されています。あなたのコードの構造でそれを利用してください!