ハンガリアン記法(ハンガリアンきほう、Hungarian notation)あるいはハンガリー記法(ハンガリーきほう)とは、プログラマがプログラムのソースコードを書く際に、変数名やクラス名などの識別子に特別な接頭文字、または接尾文字をつけることで、他の人がその識別子を見たときに、識別子の使用方法・データ型情報・スコープ範囲などを分かるようにするための命名法である。
なお、ハンガリアン記法の名称は考案者チャールズ・シモニーがハンガリー出身であることに由来する。
目次
1 アプリケーションハンガリアンとシステムハンガリアン
2 アプリケーション ハンガリアン記法の例
3 システム ハンガリアン記法の例
4 システムハンガリアンに対する批判
5 脚注
//
本来、シモニーの考案したハンガリアン記法とは、変数の意味や使用目的から接頭辞を決定することであり、型では区別できない情報を変数名に付与することで、紛らわしい変数の意味を明白にし混同をさけるためのものであった。たとえば、論理座標とデバイス座標、X軸とY軸、ドルと円などで、これらは単純に型による安全性に頼ることはできない。
マイクロソフトのアプリケーション開発グループで開発されたこの記法は Excel や Word などの開発で成功を収めたため、Windows 開発グループでも採用された。その際、シモニーの論文中の "type" がデータ型のことであると誤って解釈され、変数名にデータ型を表す接頭語や接尾語をつける記法だと誤解された。シモニーの意図していた記法をアプリケーションハンガリアン、誤解に基づく記法をシステムハンガリアンと呼ぶ。システムハンガリアンは現在批判されることが多く、.NET Framework では使われていない。
ハンガリアン記法に二種類あることはあまり知られておらず、単に「ハンガリアン記法」と言及された場合でも、システムハンガリアンという意味で用いられることが多い.
アプリケーション ハンガリアンは、間違えたコードを間違えて見えるようにする記法である。 たとえば、論理座標にRelative Positionのrp、絶対座標にAbsolute Positionのapというプレフィックスとした場合、ウィンドウの位置を設定するwindow.SetPosition(rpX, rpY);のような記述は明確に誤りであることがわかる。 また、ドルにプレフィックスdol、円にプレフィックスyenとした場合、dolIncome + yenDepositのような計算は間違いであることが明確である。
このように、間違えているコードを間違えているように見えるように記述するのが元々のハンガリアン記法である。
文字使用位置意味使用例
b または f接頭論理型bDutyFlag
by接頭バイナリ型byCount
n または i接頭integerなどの整数型nPower
dw接頭double word型dwSize
fp または f接頭単精度浮動小数点型fpPrice
db または d接頭倍精度浮動小数点型dPi
p または lp接頭ポインタ型lpDirectSound
s接頭文字列型sPlayerName
sz接頭ゼロ終端文字列型szFileName
fn接頭関数ポインタ型fnCallback
hwnd または h接頭ウィンドウハンドル型(Windowsのみ)hMainWindow
m_接頭クラスのメンバ変数m_nx
_接尾クラスのメンバ変数ny_
C接頭クラスCHoge
tag接頭構造体tagRECT
なお、これらは組み合わせて使われることもある。例えば「lpsz: ゼロ終端文字列へのポインタ」などといった具合である。
積極的批判
システムハンガリアンを使っているソースコードを修正してデータ型を変更した際、同時に変数名も変更するコストがかかる。変更を怠ると、たちまち不整合となり,保守の障害となるだけで一利もない。
システムハンガリアンに慣れているプログラマ以外にとっては可読性の低い記法である。
C++やC# のような言語では型付けが存在するためにシステムハンガリアンを使用することによる利点はない[1]。
移植性を阻害する。
消極的批判
いわゆる良書と呼ばれるようなC++本で、現在システムハンガリアンを採用している例が皆無。
かつてハンガリアンを(MFCで)全面的に採用していたMicrosoft自身が、(.NET Frameworkで)ハンガリアンを禁止[2]している。
脚注^ ⇒C++ の設計者 Bjarne Stroustrup は使用を推奨していない。
^ 禁止しているハンガリアンが、システムかアプリケーションかについては口を閉ざしている。