命名法を考える

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

そもそも人間は「名前を付ける」という一種の抽象化によってものを認識します。逆に「適切な名前を付けられない」ということは、その変数や関数の意味を正確に把握していない証拠です。

そのため、識別子には意味のある名前を付けるよう心掛けましょう。たったそれだけのことでアルゴリズムが明確になり、バグも減ります。

また、識別子に名前を付ける際には、ある程度ルールを決めておくことが大切です。命名のしかたがバラバラだと、プログラムが読みづらくなってしまいます。

このとき重要なのは、一貫性があるかどうかよ。どのような命名法がもっとも優れているか、という話ではないの。
え、そうなんですか!?
チームで開発をするときはとくに、全員が同じルールで名前を付けるようにすることが大切ね。
なるほど。そうすれば意思疎通もスムーズにできそうですね。
そういうこと。ここからは、命名法について私が普段から使っている方法や考え方を紹介していくので参考にしてね。
はい。お願いします!

ルール1:大文字と小文字

まずは、大文字と小文字の扱いについて考えてみましょう。

識別子のスタイルには、大きく分けて次のような4つのパターンがあります。

  • アッパーキャメルケース:HowToNameIdentifiers
  • ローワーキャメルケース:howToNameIdentifiers
  • スネークケース:how_to_name_identifiers
  • スクリーミングスネークケース:HOW_TO_NAME_IDENTIFIERS

C言語によるソフトウェア開発が主流だった頃には、スネークケースが使われる場面が多くありました。

いろいろなプログラミング言語が使われている現在では、

  • クラスなどの型の名前にはアッパーキャメルケース
  • メソッドや変数の名前にはローワーキャメルケース

と、使い分けることも多くなっています。

というわけで、何をどのパターンで命名するかルールを決めておきましょう。

ルール2:関数やメソッドの名前

関数やメソッドには、大きく分けて次の2種類があるわよ。

  • 動作をともなう関数:fopen()malloc()など
  • 値を返すだけの関数:strlen()ceil()など

前者には、「何かをするぞ」という意味を込めて動詞を使った名前を付けるのがおすすめです。後者については、「この情報が見たい」という意味で名詞を使った名前にするとよいでしょう。

例えば、線形リストのデータを扱う関数なら、次のような感じです。

  • ノードを追加・削除する関数は動詞:AppendNode()RemoveNode()など
  • ノードを取り出す関数は名詞:FirstNode()NextNodoe()など

ルール3:変数名のプレフィックス

変数名には、「データの形式」と「データの意味」が両方とも分かるような名前が付いていると便利なときがあるわよ。

C言語やC++では変数名をローワーキャメルケースにして、最初の単語を「型を表すプレフィックス」にしておくのがおすすめです。プレフィックスには、次のようなものが考えられます。

  • n:整数値を表す
  • b:ブーリアンを表す
  • p:ポインタを表す

例えば、次のように使います。

int nValue = 123; /* ← 整数値 */
int *pValue = &nValue; /* ← ポインタ(より明確に pnValue とするのもあり) */

ちなみに、最近の(モダンな)プログラミング言語では、こういったプレフィックが必要になる場面はそれほどありません。

ルール4:ブーリアンの意味

ブーリアンには、どちらがtrueでどちらがfalseなのかがはっきり分かる名前を付けましょう。

例えば、エラーの有無を表す変数がbResultだと、エラーがあったときにtrueなのか、なかったときにtrueなのか分かりません。こういう場合は、bSuccessbErrorのような、判定のしかたで迷わない名前を付けます。

ブーリアンを返す関数についても、同じようなことがいえます。例えば、通信の接続状態を返す関数に名前を付けるとしたら、ConnectionStatus()とするよりIsConnected()としたほうが、どちらがtrueなのか明確ですね。

ルール5:よく使う省略形

いろいろな名前に繰り返し現れる単語については、省略形(短縮形)を決めておくと便利です。

省略形には、次のようなものが考えられます。

  • Cnt:Countの略(個数を表す)
  • Idx:Indexの略(項目番号や添字を表す)
  • Pos:Positionの略(位置を表す)
  • Len:Lengthの略(長さを表す)

ちなみに、Numberを略してNumとするのは、おすすめしません。「Number of(〜の個数)」なのか、それとも「Index of(〜の項目番号)」なのかが、一目で分からない場合が多いためです。

もちろん、省略形を使わないルールにするのもありです。

ルール6:よく使う対義語

対になる単語をリストアップしておくと、名前を付けるときに迷うことが少なくなります。

例えば、「Start」の反対は「End」なのか「Stop」なのかなど、基本とするルールを決めておきましょう。

  • StartStop
  • BeginEnd
  • CreateDestroy
  • LHSRHS(「左側(Left Hand Side)」と「右側(Right Hand Side)」のこと)

ルール7:名前の長さ

変数や関数に名前を付けるときは、長さも意識しましょう。

長い名前を付けた変数や関数は、プログラム中でよく目立ちます。目立たせたい(重要な)ものほど、長くてしっかりとした名前を付けるようにしましょう。

これとは反対に、変数にあえて短い名前を付けると良いこともあります。例えば、ループカウンタにはiという名前が使われることが多いですね。これは、一時的な変数だということを表すのに適した名前だといえます。


なるほど〜。名前の付け方一つで、プログラムの意味や意図をうまく表せるんですね。
そういうこと。どういうふうに名前を付けると伝わりやすいかを、常に意識しておくと良いわね。
ここがポイント!
識別子には、意味のある名前を付けましょう。伝わりやすさを意識しながら、全員が同じルールを採用することが大切です。一貫性のある命名法は、スムーズな意思疎通やバグの削減にもつながります。

チームで開発をするときはもちろん、ひとりで開発をするときもこれらの命名法を意識しておくのがおすすめです。作ってから時間が経ったとしても、どんなプログラムにしたかを思い出しやすくなるでしょう。