変数名のプレフィクス

これまでの記事で、コード中の変数名が気になった方も多いのではないでしょうか。
例えば、次のような変数名

m_nSize

「何かの大きさを表す変数であることは "Size" から分かるが、その前の m_n はいったい何ぞ?」

こうしたプレフィクス (接頭辞) にはちゃんと意味があり、私自身はこれを手掛かりにコードを呼んでいます。
今回は、その役割についてご紹介します。

1. メンバ変数の名前は m_ から始める。

メンバ関数内とローカル変数を一目で識別できるようにするため、メンバ変数の名前を m_ から始めることにしています。
このようなルールを採用していないコードは、

  • メンバ変数・ローカル変数の名前が衝突する。
  • 関数内で定義されていない変数が「唐突に」出現する
といった状況により、可読性が著しく低下します。

thisを使って明示すればよい」という意見もありますが、それでは「メンバ関数内ではオブジェクトのメンバを修飾なしで参照できる」という簡潔な記述のためのルールが無意味になってしまいます。
また、Set~ 系の関数でもメンバ変数と引数の名前が衝突しなくなるので便利です。

//「m_ルール」採用 (よさげ)
void Box::SetWidth(double dWidth){
m_dWidth =dWidth;
}
//「m_ルール」不採用 (thisが鬱陶しい。)
void Box::SetHeight(double dHeight){
this->dHeight =dHeight;
}
//「m_ルール」不採用 (アンダースコアだけでは目印として弱い。)
void Box::SetDepth(double _dDepth){
dDepthi =_dDepth;
}

このルールには例外もあって、public なメンバ変数、static const なメンバ変数には適用されません。

2. プリミティブ型は、型に応じたプレフィクスを付ける

これはハンガリアン記法として知られているもの。
いろいろと批判も多いようですが、便利なので採用しています。

データ型 プレフィクス プレフィクスの由来
配列 a array
bool, boolean, BOOL b boolean
BYTE, byte by byte
char c char
double d double precisionloating point
DWORD
(unsigned double)
dw doube word
float f floating point
HANDLE h handle
long l long
ポインタ lp long pointer
(単純に p でもよいが、なんとなくこちらを採用している。)
int n number
関数ポインタ pfn pointer for function
(これだけは lp でなく p を採用。特に理由はない。)
参照 r reference
short s short
ゼロ終端文字列 sz string with zero termination
WORD w word

このルールにも例外があります。 例えば、ループカウンタとして使用する int 型変数には、i, j など単純な名前を使用します。