ハンガリアン記法
ハンガリアン記法(ハンガリアンきほう、英語:Hungarian notation)あるいはハンガリー記法(ハンガリーきほう)とは、プログラマがプログラムのソースコードを書く際に、変数名やクラス名などの識別子に特別な接頭文字、または接尾文字をつけることで、他の人がその識別子を見たときに、識別子の使用方法・データ型情報・スコープ範囲などを分かるようにするための命名法である。
なお、ハンガリアン記法の名称は考案者チャールズ・シモニーがハンガリー出身であることに由来する。
目次 |
[編集] 二種類のハンガリアン記法
本来、シモニーの考案したハンガリアン記法とは、変数の意味や使用目的から接頭辞を決定することであり、型では区別できない情報を変数名に付与することで、紛らわしい変数の意味を明白にし混同をさけるためのものであった。たとえば、論理座標とデバイス座標、X軸とY軸、ドルと円などで、これらは単純に型による安全性に頼ることはできない。
マイクロソフトのアプリケーション開発グループで開発されたこの記法は Excel や Word などの開発で成功を収めたため、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言語の問題でシステムハンガリアンが使用されていない。
[編集] 脚注
- ^ a b マイクロソフト (2007年11月). “一般的な名前付け規則”. MSDN ライブラリ. pp. .NET Framework 開発者ガイド. 2009年1月22日閲覧。
- ^ C++ の設計者 Bjarne Stroustrup は使用を推奨していない。
[編集] 参考
- Spolsky, Joel; 青木靖 (2005年5月11日). “間違ったコードは間違って見えるようにする”. The Joel on Software Translation Project. 2009年1月22日閲覧。
- Charles Simonyi (1999年11月). “Hungarian Notation” (英語). MSDN. 2010年1月22日閲覧。