パスワードを忘れた? アカウント作成
492718 journal

fslashtの日記: 目からウロコ:ハンガリアン記法の真意について 1

日記 by fslasht

 プログラミングにおいて変数名の前に型名などのプレフィックスをつける「ハンガリアン記法」は、コードの可読性があがりバグを未然に防げるため、さまざまな迫害wにもめげず使い続けてきました。

 ハンガリアン記法って呼ぶのは、ハンガリー出身のプログラマー(チャールズ・シモニイ@MicroSoft)が考案したからといわれています。
先日の/.のの記事ではハンガリーネタつながりで、ハンガリアン記法についてコメントがついていました(コレ)。

そのコメントで紹介されていた記事が以下のものです。
間違ったコードは間違って見えるようにする - The Joel on Software Translation Project

 が、ここで驚愕の事実を知ってしまいました。
 ハンガリアン記法でプレフィックスとしてつけてるのは、変数の型(Type)だと思っていたのですが、実はもともとは変数の役割の種類(Kind)をつけるべきものだったのです!
 げー。
 それがMicroSoft社内の標準化過程で変質していってしまったようです。

 本来の意味での使い方をアプリケーションハンガリアン、誤解された変数方を区別する使い方をシステムハンガリアンと呼んでいるようです。

(おっと、Wikipediaにも載ってるじゃん。それにしても二つのハンガリアン記法の区別についての記事って昔は見かけなかったけど、僕がしらなかっただけ?)

 記事で例にあげられている正しい例としては、ユーザーの入力した生の(危険性のある)文字列には、us(unsafeの略)をつけ、サニタイズして危険性を取り除いた文字列には、s(safeの略)をつけるという例があげれらていました。
 変数名を見るだけで、変数(や、関数の引数)の用途が「unsafe」なものか「safe」なものか判断でき、たとえば、unsafeな変数をsafeな変数に直接代入している場合、その箇所のコードを見ただけで「何かおかしい」とすぐ気づくことが出来るのです。

※ この記事のタイトルは「間違ったコードは間違って見えるようにする」ですから。

 もっとも、変数の型名をプレフィックスにする方法でも、変数型は用途によってある程度規定されることから本来の目的に近い効果はあります。
 文字列変数に数値を代入すしてるのはおかしいと分かるし、ポインタと普通の変数をごっちゃにしてしまうことも防げます。
 Windowsでは用途ごとに専用の型(hwndとかhdcとか)が用意されていたり(というこれも批判されているのだが)、クラスが使えるようになってからはオブジェクトの型名をプレフィックスにすることもあり、型名=用途というケースも多いです。
(イテレータやループ変数には、iをつけたりと用途ベースのつけかたも残ってますしね)

 実際のところでは、用途の判別として役にたてていたわけですが、根本の思想を勘違いしてつかってたなーというところで、目からウロコでした。
 変数型がわかるというもの、それはそれで便利なのでうまいこと折衷案を考えて使っていきたいと思います。

/
 
 まあ、ハンガリアン記法の是非はともかく、コードの一部を見るだけで誤りを見つけ出すための手法、または逆に阻害する要因について述べられていて面白い記事でした。
 効率化のための機能が逆に問題をわかりにくしてしまうことは、なんにでもあるものですね。

/

 しかし、ハンガリアン記法の是非はともかくスコープの区別(ローカル変数、メンバー変数、グローバル変数)は変数名をみただけで分かるよう命名をしてほしいなあと思います(Microsoft的には、メンバー変数には「m_」ってつけますね。人によっては、変数名の後に「_」とつけたりするようです。この前まねしてみました)

/

 それに、ハンガリアン記法の是非はともかく実体とポインタ(と参照)の違いは区別つくような命名をしてほしいなあと思いましたが、最近の言語では気にしなくてもいいのかな(参照渡ししかない場合は)。

/

 そういうわけで、ハンガリアン記法の是非はともかく変数名は分かりやすく!ということでお願いしたいです。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • そういえば、D言語のコーディングスタイルについて書かれているページ [kmonos.net] (原文) [digitalmars.com]に、ハンガリアン記法についての記述があって、「間違ったコードを間違いに見せるには」が紹介されていますが、ここ、数年前は「ダメ、絶対。」の一言でハンガリアン記法を切って捨てているだけだったような記憶があります。
    この例も含め、「間違ったコード〜」の登場以降、じわじわと見直されている感がありますし、今後はアプリケーションハンガリアンが広がっていくんでしょうかね。

    個人開発のアプリでは、アプリケーションンハンガリアンも含め、ハンガリアン記法を「気持ち悪い」という理由で全く使っていないのですが、アプリケーションハンガリアンなら広まるのはそれなりに歓迎したいです。

    # _name はメンバ名空間でも予約済み識別子だと思ってて name_ を使ってたけど、
    # 勘違いだということに気付いてから _name に戻ったyoh2
    --
    巧妙に潜伏したバグは心霊現象と区別が付かない。
typodupeerror

犯人は巨人ファンでA型で眼鏡をかけている -- あるハッカー

読み込み中...