ハンガリアン記法

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

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

二種類のハンガリアン記法

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

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

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

具体例

アプリケーションハンガリアン

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

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

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

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

システムハンガリアン

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

文字 意味 使用例
b または f 論理型 bDirtyFlag
ch 文字型 chSeparator
by バイト型 (符号なし1バイト整数) byGrayLevel
n または i 整数型 (int, integer) nPower
l 長整数 (long) lDate
u 符号なし整数 uiCount
w ワード型 (WORD) wLanguageCode
dw ダブルワード型 (DWORD) dwSize
fp または f 単精度浮動小数点 fpPrice
db または d 倍精度浮動小数点 dPi
p または lp ポインタ lpDirectSound
s 文字列 sPlayerName
sz ゼロ終端文字列型 szFileName
fn 関数ポインタ fnCallback
h ハンドル型 hThread
hwnd または h ウィンドウハンドル型 (Windowsのみ) hMainWindow
g_ グローバル変数 g_iErrorCode
c_ 定数 (const) c_nBufferSize
s_ 静的変数 (static) s_pLookupTable
m_ クラスのメンバー変数 m_nLength
C クラス CHoge
tag 構造体タグ tagRECT

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

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

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

批評

システムハンガリアン

積極的批判

  • C++C#のような言語では型付けが存在するためにシステムハンガリアンを使用することによる利点はない[6][7]

消極的批判

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

脚注

  1. ^ a b c d e Spolsky, Joel; 青木靖 (2005年5月11日). “間違ったコードは間違って見えるようにする”. The Joel on Software Translation Project. 2019年3月17日時点のオリジナルよりアーカイブ。2009年1月22日閲覧。
  2. ^ Simonyi, Charles (1999年11月). “Hungarian Notation” (英語). Microsoft Docs. 2019年10月5日閲覧。
  3. ^ a b マイクロソフト (2007年11月). “一般的な名前付け規則”. Microsoft Docs. 2019年10月5日閲覧。
  4. ^ Windows Ribbon Framework | Microsoft Docs
  5. ^ Sutter, Herb; Alexandrescu, Andrei (2004-10-25) (英語). C++ Coding Standards: 101 Rules, Guidelines, and Best Practices (C++ In-Depth Series). Addison-Wesley Professional. ISBN 978-0321113580 
  6. ^ Stroustrup, Bjarne (2017年9月30日). “Stroustrup: C++ Style and Technique FAQ” (英語). 2019年10月5日閲覧。
  7. ^ Stroustrup, Bjarne. “Stroustrup: C++ Glossary” (英語). 2017年10月22日閲覧。

関連項目

外部リンク