ハンガリアン記法

ハンガリアン記法（ハンガリアンきほう、）あるいはハンガリー記法（ハンガリーきほう）とは、プログラマがプログラムのソースコードを書く際に変数名やクラス名などの識別子に特別な接頭文字ないし接尾文字をつけることで、他の人がその識別子を見たときに識別子の使用方法・データ型情報・スコープなどが分かるようにするための命名法である。
ハンガリアン記法という名称は考案者チャールズ・シモニーがハンガリー出身であることに由来する。
二種類のハンガリアン記法.
本来、シモニーの考案したハンガリアン記法とは、変数の意味や使用目的から接頭辞を決定することであり、型では区別できない情報を変数名に付与することで、紛らわしい変数の意味を明白にし混同をさけるためのものであった。たとえば、論理座標とデバイス座標、X軸とY軸、ドルと円などで、これらは単純に型による安全性に頼ることはできない。
マイクロソフトのアプリケーション開発グループで開発されたこの記法は Excel や Word などの開発で成功を収めたため、Windows 開発グループでも採用された。その際、シモニーの論文中の "type" がデータ型のことであると誤って解釈され、変数名にデータ型を表す接頭語や接尾語をつける記法だと誤解された。シモニーの意図していた記法をアプリケーションハンガリアン、誤解に基づく記法をシステムハンガリアンと呼ぶ。Windows APIおよびMFCはほとんどがシステムハンガリアンに従っている。システムハンガリアンは批判されることが多く、.NET Frameworkでは使われていない。COMもシステムハンガリアンが伝統的に使われていたが、.NETの登場後に新しく追加されたコンポーネントに関してはシステムハンガリアンを採用しないものが増えている。
ハンガリアン記法に二種類あることは、単に「ハンガリアン記法」と言及された場合でも、システムハンガリアンの意味で用いられていることが多い。
具体例.
アプリケーションハンガリアン.
アプリケーションハンガリアンは、間違えたコードを間違えて見えるようにする記法である。
たとえば、相対座標にRelative Positionのcodice_1、絶対座標にAbsolute Positionのcodice_2という接頭辞を付けることにした場合、ウィンドウの位置を設定する codice_3 のような記述は誤りであることが明確に分かる。
また、ドルの接頭辞をcodice_4、円の接頭辞をcodice_5とした場合、codice_6 のような計算は間違いであることが明確である。
このように、間違っているコードが間違っていると分かるようにするための記法が本来のハンガリアン記法である。
システムハンガリアン.
すべて接頭で使用する。C言語およびC++特有の言語仕様、言語機能および型名に依存する規約がほとんどである。
なお、これらは組み合わせて使われることもある。例えば「codice_7: ゼロ終端文字列へのポインタ」「codice_8: メンバー変数の符号なし長整数」などといった具合である。
ゼロ終端を表す「z」は、ほとんどの場合ゼロ終端文字列を表す「sz」の形で表れるが、まれに番兵として0やNullを配置している可変長配列やリストなどのデータ構造を示すために用いられている例もある。
グローバル変数やメンバー変数を表す接頭辞は、変数の型ではなくスコープを区別するためのものであるので、システムハンガリアンとは区別する見方もある。これの類似の例として、ローカル変数やプライベート変数など、外部から参照されない変数を判別するために接頭辞・接尾辞をつけるプログラミング作法も存在する。例えばC#コードを自動生成するフレームワークなどではprivateフィールド名先頭に"_"を付けたり、"C++ Coding Standards"などの書籍ではメンバー変数名末尾に"_"を付けたりする慣習が使われることがある。