ハンガリアン記法

ハンガリアン記法（ハンガリアンきほう、）あるいはハンガリー記法（ハンガリーきほう）とは、プログラマがプログラムのソースコードを書く際に変数名やクラス名などの識別子に特別な接頭文字ないし接尾文字をつけることで、他の人がその識別子を見たときに識別子の使用方法・データ型情報・スコープなどが分かるようにするための命名法である。

ハンガリアン記法という名称は考案者チャールズ・シモニーがハンガリー出身であることに由来する。

二種類のハンガリアン記法 
本来、シモニーの考案したハンガリアン記法とは、変数の意味や使用目的から接頭辞を決定することであり、型では区別できない情報を変数名に付与することで、紛らわしい変数の意味を明白にし混同をさけるためのものであった。たとえば、論理座標とデバイス座標、X軸とY軸、ドルと円などで、これらは単純に型による安全性に頼ることはできない。

マイクロソフトのアプリケーション開発グループで開発されたこの記法は Excel や Word などの開発で成功を収めたため、Windows 開発グループでも採用された。その際、シモニーの論文中の "type" がデータ型のことであると誤って解釈され、変数名にデータ型を表す接頭語や接尾語をつける記法だと誤解された。シモニーの意図していた記法をアプリケーションハンガリアン、誤解に基づく記法をシステムハンガリアンと呼ぶ。Windows APIおよびMFCはほとんどがシステムハンガリアンに従っている。システムハンガリアンは批判されることが多く、.NET Frameworkでは使われていない。COMもシステムハンガリアンが伝統的に使われていたが、.NETの登場後に新しく追加されたコンポーネントに関してはシステムハンガリアンを採用しないものが増えている。

ハンガリアン記法に二種類あることは、単に「ハンガリアン記法」と言及された場合でも、システムハンガリアンの意味で用いられていることが多い。

具体例

アプリケーションハンガリアン 
アプリケーションハンガリアンは、間違えたコードを間違えて見えるようにする記法である。

たとえば、相対座標にRelative Positionのrp、絶対座標にAbsolute Positionのapという接頭辞を付けることにした場合、ウィンドウの位置を設定する window.SetPosition(rpX, apY); のような記述は誤りであることが明確に分かる。

また、ドルの接頭辞をdol、円の接頭辞をyenとした場合、dolIncome + yenDeposit のような計算は間違いであることが明確である。

このように、間違っているコードが間違っていると分かるようにするための記法が本来のハンガリアン記法である。

システムハンガリアン 
すべて接頭で使用する。C言語およびC++特有の言語仕様、言語機能および型名に依存する規約がほとんどである。

なお、これらは組み合わせて使われることもある。例えば「lpsz: ゼロ終端文字列へのポインタ」「m_ul: メンバー変数の符号なし長整数」などといった具合である。

ゼロ終端を表す「z」は、ほとんどの場合ゼロ終端文字列を表す「sz」の形で表れるが、まれに番兵として0やNullを配置している可変長配列やリストなどのデータ構造を示すために用いられている例もある。

グローバル変数やメンバー変数を表す接頭辞は、変数の型ではなくスコープを区別するためのものであるので、システムハンガリアンとは区別する見方もある。これの類似の例として、ローカル変数やプライベート変数など、外部から参照されない変数を判別するために接頭辞・接尾辞をつけるプログラミング作法も存在する。例えばC#コードを自動生成するフレームワークなどではprivateフィールド名先頭に"_"を付けたり、C++ Coding Standardsなどの書籍ではメンバー変数名末尾に"_"を付けたりする慣習が使われることがある。

批評

システムハンガリアン

積極的批判 
 C++やC#のような言語では型付けが存在するためにシステムハンガリアンを使用することによる利点はない。

消極的批判 
 かつてWindows API/MFCにおいてハンガリアンを全面的に採用していたマイクロソフト自身が、.NET Frameworkではハンガリアンを禁止している。

脚注

関連項目 
 命名規則 (プログラミング)
 Leszynski命名規則
 キャメル記法

外部リンク 
 Hungarian Notation
 ハンガリアン記法 by Doug Klunder

プログラミング
プログラミング言語の構文
命名規則