.NET Frameworkの命名規則や各情報によると、「ハンガリアン記法は使わないように」というような情報はよく目にするが、正直なところ当方の場合はハンガリアン記法は目にはしているものの、基本的に使わないコーディングスタイルを採用しているため、あまり意識することはなかった。ここでは自分なりにハンガリアン記法について調べたことを書いてみたい。
ハンガリアン記法の由来
ハンガリアン記法のハンガリアンというのは、簡単に言ってしまえば「ハンガリー人」のことで、この記法を考案したチャールズ・シモニー氏がハンガリー出身だったことに由来するというものである。
ハンガリアン記法は大きく2種類ある
まず、ハンガリアン記法と言うものだが、これには大きく分けて2種類ある。一般的に「ハンガリアン記法」として知られている「システムハンガリアン」と、本来のシモニー氏が意図した用法である「アプリケーションハンガリアン」である。
システムハンガリアン
まず、「システムハンガリアン」についてだが、これは各変数のデータ型などをもとに変数名の接頭に何らかの文字列を加える記法である。例えば以下のよう例がある
文字 | 意味 | 用例 |
---|---|---|
b/f | 論理型(boolean/flag) | bEnabled/fEnabled |
n/i | 整数型(number/integer) | iCount/nCount |
l_ | ローカル変数(local) | l_value |
g_ | グローバル変数(global) | g_value |
m_ | メンバー変数(member) | m_value |
上記のような例がある。今日では型を使うプログラミング言語では基本的に変数の型が明示的に指定されることと、変数のスコープなどでもわざわざ接頭をつけなくても変数の定義された場所から分かることから、必要性が薄いだけでなく、変数の型が変わった時の弊害も指摘される。例えば論理型から整数型に変更した時に書き換えないと不整合が生じるなどである。
動的プログラミング言語など明示的には型を扱わない言語では変数の型が明示されないという意味ではまだ分かる部分はあるものの、上記の弊害があるため、基本的には使うべきではないだろう。
アプリケーションハンガリアン
次に「アプリケーションハンガリアン」だが、これこそ本来のハンガリアン記法とも呼ばれているものである。
これは、データ型や修飾子などの言語仕様では区別できない、その変数が何の目的で使われているのかを変数名に付与することによって、間違えているコードをはっきりと間違えているように見えるようにするための記法である。例えば、以下の記法が考えられるが、これははっきりと間違っていることが考えられる例である。
const int minX = 10;
const int maxX = 50;
const int minY = 5;
const int maxY = 20;
// ここでのsomeFunc()は、10〜100の範囲内の乱数を取得する関数を想定する
int x = someFunc(minX, maxX);
if (x < minX || maxY < x) { // <- Xの判定で間違っていることがわかる。
// 何かする
}
ほかにも、日本円を意味するjpy
やアメリカドルを意味するusd
などをプレフィックスとして使うこともアプリケーションハンガリアンの例として扱われている。
アプリケーションハンガリアン自体は間違っているコードをはっきりと間違えているように見せるための記法であり、現在でもコーディングする上での考え方としては有効ではある。
もっとも、変数が何を意味しているのかをわかりやすいようにするということを意識すれば、多くの場合、自然とアプリケーションハンガリアン、もしくはそれで求められているものを十分満たせる記述になる。
そういう意味では、アプリケーションハンガリアンも意識して書く必要性はあるとは言えない。
最後に
今回、ハンガリアン記法について簡単に説明した。
今日のプログラミングではシステムハンガリアンは基本的に弊害が大きいので使うべきではないものといえる。
アプリケーションハンガリアンはその目的は有用ではある一方、わかりやすいコードを書くということを意識すれば、多くの場合、自然とアプリケーションハンガリアンの目的を満たしたコードになるため、わざわざアプリケーションハンガリアンで書く必要性はない。
ただ、古いプロジェクトを中心にハンガリアン記法で書かれたコードがあるため、こういう書き方があるというのは是非とも覚えておきたい。
ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。主にスマートフォン向けアプリやウェブアプリの開発を携わっています。ご用の方はコメントかコンタクトフォームにて。