ハンガリアン記法

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

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

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

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

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

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

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

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

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

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

文字意味使用例b または f論理型bDirtyFlagch文字型chSeparatorbyバイト型 (符号なし1バイト整数)byGrayLeveln または i整数型 (int, integer)nPowerl長整数 (long)lDateu符号なし整数uiCountwワード型 (WORD)wLanguageCodedwダブルワード型 (DWORD)dwSizefp または f単精度浮動小数点型fpPricedb または d倍精度浮動小数点型dPip または lpポインタ型lpDirectSounds文字列型sPlayerNameszゼロ終端文字列型szFileNamefn関数ポインタ型fnCallbackhハンドル型hThreadhwnd または hウィンドウハンドル型 (Windowsのみ)hMainWindowg_グローバル変数g_iErrorCodec_定数 (const)c_nBufferSizes_静的変数 (static)s_pLookupTablem_クラスのメンバー変数m_nLengthCクラスCHogetag構造体タグtagRECT
なお、これらは組み合わせて使われることもある。例えば「lpsz: ゼロ終端文字列へのポインタ」「m_ul: メンバー変数の符号なし長整数」などといった具合である。

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

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

 批評 

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

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

 脚注 

 関連項目 
 命名規則 (プログラミング)
 Leszynski命名規則
 キャメル記法
 F# - 「測定単位」() という構文で数値型に単位情報を付加することができ、互換性のない単位の取り扱いをコンパイル時に検出することができる。

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

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