ハンガリアン記法

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

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

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

二種類のハンガリアン記法[編集]

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

マイクロソフトのアプリケーション開発グループで開発されたこの記法は ExcelWord などの開発で成功を収めたため、Windows 開発グループでも採用された。その際、シモニーの論文中の "type" がデータ型のことであると誤って解釈され、変数名にデータ型を表す接頭語や接尾語をつける記法だと誤解された。シモニーの意図していた記法をアプリケーションハンガリアン、誤解に基づく記法をシステムハンガリアンと呼ぶ。システムハンガリアンは現在批判されることが多く、.NET Framework では使われていない[1]

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

具体例[編集]

アプリケーションハンガリアン[編集]

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

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

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

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

システムハンガリアン[編集]

すべて接頭で使用する。

文字 意味 使用例
b または f 論理型 bDutyFlag
by バイナリ byCount
n または i integerなどの整数型 nPower
l long整数 lDate
u 符号なし整数 uiColor
dw double word dwSize
fp または f 単精度浮動小数点 fpPrice
db または d 倍精度浮動小数点 dPi
p または lp ポインタ lpDirectSound
s 文字列 sPlayerName
sz ゼロ終端文字列型 szFileName
fn 関数ポインタ fnCallback
hwnd または h ウィンドウハンドル型(Windowsのみ) hMainWindow
g_ グローバル変数 g_iErrorCode
m_ クラスのメンバ変数 m_nx
_ クラスのメンバ変数 ny_
C クラス CHoge
tag 構造体 tagRECT

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

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

グローバル変数やメンバ変数を表す接頭辞は、変数の型ではなくスコープを区別するためのものであるので、システムハンガリアンとは区別する見方もある。これの類似の例として、ローカル変数やプライベート変数など、外部から参照されない変数を判別するために接頭辞・接尾辞をつけるプログラミング作法も存在する。

アプリケーションハンガリアンに対する批判[編集]

  • 間違えたコードが機械的に検出される手法が利用可能ならば、間違えたコードが間違えて見える手法より明白に勝る。そして、エラー検出に関連する技術は、ハンガリアン記法が考案され成功を収めた当時と比べ大きく進歩している。
  • コードを間違える原因の中で、変数の意味(=型)の取り違えに由来するものが下位にあるとは言い難い。

システムハンガリアンに対する批判[編集]

積極的批判[編集]

  • システムハンガリアンを使っているソースコードを修正してデータ型を変更した際、同時に変数名も変更するコストがかかる。変更を怠ると、たちまち不整合となり、保守の障害となるだけで一利もない。
  • C++C# のような言語では型付けが存在するためにシステムハンガリアンを使用することによる利点はない[2]
  • 移植性を阻害する。
  • 総称型メタプログラミングとの相性が悪い。

消極的批判[編集]

  • いわゆる良書と呼ばれるようなC++本で、現在システムハンガリアンを採用している例が皆無。
  • かつてMFCにおいてハンガリアンを全面的に採用していたMicrosoft自身が、.NET Frameworkではハンガリアンを禁止[1]している。
  • 日本では、情報処理技術者試験などのC言語の問題でシステムハンガリアンが使用されていない。

脚注[編集]

  1. ^ a b マイクロソフト (2007年11月). “一般的な名前付け規則”. MSDN ライブラリ. pp. .NET Framework 開発者ガイド. 2009年1月22日閲覧。
  2. ^ C++ の設計者 Bjarne Stroustrup は使用を推奨していない。

参考[編集]

関連項目[編集]