ハンガリアン記法

読み:ハンガリアンきほう
外語:Hungarian Notation
品詞:名詞

Cや、その流れを汲むプログラミングで用いる変数の命名方法の一つ。

当時のMicrosoftのプログラマ、Charles Simonyi(チャールズ・シモニイ)によって発案された。

元来、C言語は変数の各型のサイズが未定義で、しかも環境によって違う。これは今でも同じである。このため改修や移植の際には非常に問題が生じた。

そこで、変数の頭に変数のサイズを表わすdw(double word)などを付け、型とサイズを明確にしようとしたのが始まりである。その後、変数がらみのバグで最も多いのは変数の型を誤ることであるということから、intergerなど、変数の型名を変数名一般に付けるような記法が誕生したと考えられている。

そういった命名方法の一つがハンガリアン記法であるが、しかし明確な仕様があるわけではないので、単にハンガリアン記法といっても様々なローカルルールが存在する。

一般的な例として、次のようなものがある。

  • boolean(MS-DOSやWindowsのC言語はintのtypedefでBOOL型、以下同様)はb
  • char型はc
  • unsigned char型(BYTE型)はby
  • int型はiやn
  • unsigned int型はuやui
  • long型はlやli
  • unsigned long型(DWORD型)はdwやul
  • floatはf
  • doubleはd
  • ポインタ変数ならp

このような小文字のプリフィックス(接頭辞)をつけ、その後に大文字から変数名を書き始める(例: iLoopCounter、pReceiveBuffer)。

さらに応用として、グローバル変数もバグの原因となりやすいので、これはg_から書きはじめることで他の変数と区別する(例: g_lIpAddress)。

同様に、C++では新たにメンバ変数という概念が増えたが、これはm_から書きはじめることで他の変数と区別する(例: m_iScreenWidth)、なども行なわれる。

ちなみに、ハンガリアン記法はMicrosoftの考えたものだからとか、C++ではユーザがタイプ定義可能なのにintなどのプリミティヴなタイプを区別するのは無意味でオブジェクト指向の障礙になる、等の理由で否定する層もいる。

これは事実であり、確かにそのとおりである。

しかし、下手糞でまともに見られないプログラムを書く輩に限って、こういった記法を否定したがるのもまた事実である。