ショートカット
ファシリテーター × あり方
コーディングの向こう側
Hello, ANOTHER world!
オブジェクト指向のはなし
プログラミングのはなし
C言語実力診断クイズ
eSkillBooks
プログラミングのはなし

私の命名法

変数や関数などの識別子に名前をつけるという作業はプログラミングをするうえで避けて通れません。それだけに識別子の命名法について考えてみる価値はあります。

そもそも人間は「名前をつける」という一種の抽象化によってものを認識します。逆に「適切な名前をつけることができない」ということは、その変数や関数の意味を正確に把握していないという証拠です。ですから、識別子には必ず意味のある名前をつけるよう心掛けましょう。たったそれだけのことで、アルゴリズムが明確になり、初歩的なバグは激減します。

ここでは、私が実践している命名法を少し紹介します。

大文字と小文字

まず一般的な規則について。識別子のスタイルには大きく分けて次の3つのパターンがあります。

  1. HowToNameIdentifiers
  2. howToNameIdentifiers
  3. how_to_name_identifiers

私は 1. のような名前をつけるようにしています。この書き方が、この後で述べるプレフィックスやサフィックスと最も組み合わせやすいからです。

変数のプレフィックス

変数の型の違いによって、例えば次のようなプレフィックスをつけるようにしています。

  • n ... 普通の整数
  • ch ... 文字を表す整数
  • b ... ブーリアン
  • p ... 一般的なポインタ
  • pc ... 文字列へのポインタ
  • pv ... void ポインタ
  • str ... 文字列(C++ の文字列オブジェクト)
  • fp ... ファイルポインタ
  • fd ... ファイルデスクリプタ
  • h ... ハンドル
  • wnd ... ウィンドウ
  • dlg ... ダイアログ ウィンドウ
  • btn ... ボタンコンポーネント

例をいくつか挙げておきます。

  • 接続中かどうかを表すフラグ "bConnected"
  • ファイル名を表す文字列型の変数名 "strFileName"
  • ダイアログ上の「OK」ボタンコンポーネントの名前 "btnOK"
変数のサフィックス

変数が表すものの内容によって、例えば次のようなサフィックスをつけるようにしています。

  • Cnt ... カウント(個数)
  • Idx ... インデックス(添字、項目番号)
  • Sz ... サイズ
  • Ctrl ... コントロール
  • Name ... 何かの名前
  • Pos ... 位置
  • Len ... 長さ
  • Gen ... ジェネレータ
  • Msg ... ユーザーへのメッセージ

次のようなサフィックスはあいまいなので使わない方が良いでしょう。

  • Num ... Number of (〜の数)なのか Index of (〜の添字)なのかわからない。

例をいくつか挙げておきます。

  • エラーの発生回数 "nErrCnt"
  • メモリ不足メッセージの文字列 "strNoMemoryMsg"
  • ファイル名の長さ "nFileNameLen"
対義語

反対の意味を表す言葉は慎重に対応付けるべきです。たとえば Begin の反対は Stop ではないし、Top の反対は End ではありません。正しい対義語の例を挙げます(「正しい」と言っても英語として正しいという意味ではありません。プログラミング上の慣例として正しいという意味ですので注意して下さい)。

  • Begin ⇔ End
  • Start ⇔ Stop
  • Top ⇔ Bottom
  • High ⇔ Low
  • Big ⇔ Small
  • Create ⇔ Destroy
  • Previous ⇔ Next
  • Allocate ⇔ Free
  • Attach ⇔ Detach
  • Get ⇔ Set
  • Get ⇔ Put
  • Input ⇔ Output
  • Show ⇔ Hide
  • Go ⇔ Back
  • Up ⇔ Down
  • Upper ⇔ Lower
関数名

関数には大きく分けて次の2種類があります。

  • 動作を行う関数 - fopen, fflush, putchar など
  • 値を返す関数 - strlen, ceil, rand など

前者の名前には動詞を、後者の名前には名詞を使うようにするのが良いでしょう。例をいくつか挙げておきます。

  • ログを出力する関数(動詞) "OutputLog"
  • 配列をソートする関数(動詞) "SortArray"
  • リストの次のノードを返す関数(名詞) "NextNode"
ブーリアン変数の名前

ブーリアン(true, false の2つの値のどちらかを持つ型)の変数名は、どちらが true でどちらが false なのかがはっきりわかるようにつけます。たとえばエラーがあったかどうかを表すのに bResult という変数名を使ってしまっては、エラーがあったときに true なのか、なかったときに true なのかわかりません。こういう場合は bSuccess とか bError とかいう名前を使うようにすると、どちらの状態が true なのかが明確になります。

ブーリアン関数の名前

ブーリアンを返す関数は "Is〜" という名前にすることが多いです。例えば接続中かどうかを知る関数は IsConnected 、可視かどうかを知るには IsVisible 、オープンされているかどうかを知るには IsOpen などという関数名が適しています。もちろんどちらの状態が true なのかが明確な名前にするというのはブーリアン変数名の場合と同様です。

ブーリアンをパラメータにとる関数は、一般的に避けた方が良いでしょう。たとえばウィンドウの表示/非表示を制御する関数として

void ShowWindow( bool bShowOrHide );

というプロトタイプを設計するのは良くありません。ウィンドウを非表示にするときに ShowWindow(false); と書くのは分かりやすいとは言えないからです。こういう場合は次のように2つに分けた設計にします。

void ShowWindow();
void HideWindow();

VC を使っている人は、ダイアログを作るときのコマンドで UpdateData(TRUE/FALSE) というのを知っているでしょう。これなんか、ゲゲーッですね。どっちがどっちだか、いちいちわからなくなります。

長さ

一般的に、変数名は長いほど目立ちます。そこで目立たせたい(重要な)変数名ほど長い名前をつけるようにします。

もちろん短い変数名にも意味があります。例えばループカウンタには i や j が使われることが多いですが、特に注意をひきたい場合以外でループカウンタに長い名前をつけると混乱を招きます。

スコープのプレフィックス

スコープによって、変数にプレフィックスをつけるようにすると良いでしょう。例えば次のようにします(この方法は完全に私の我流なので、あくまで例としてとらえてください)。

  • fs_ ... ファイルスコープの変数
  • gs_ ... グローバルスコープの変数
  • m_ ... クラスや構造体のメンバ変数

例えば出力ファイルポインタをファイルスコープで持っている場合、その変数は

static FILE *fs_fpOutputFile;

などとなります。

スコープについては次のトピックで詳しくお話することにしましょう。

(「プログラミングのはなし」は1998年1月から1999年1月にかけて作成されたコンテンツです。)