2010年06月04日

閑話休題その3 変数の名前、どのように名づけますか?

プログラムを書いているときに、いつも悩むことがあります。
それは変数の名前です。
ひと目でどのような変数なのかわかり、短く、センスよく名づけたいものです。
int a = 0;
スコープがものすごく限定的で、for文などの一時変数でない限り
上記のような変数は論外です。
これがクラスのメンバ変数などだったら、そのプログラムの保守は
限りなく大変なものになることが予想されます。

変数の名前は、特にプログラムの動作に影響しないので、
各プログラマによって様々な手法があると思います。
前置きとして、ここに書かれていることはあくまで私が変数をつけるときの考えであり、
これが正しいというわけではありません。


私が変数の名前を決めるときに、根底として頭によぎるのは次のことです。
●クラスのメンバ変数(フィールド)
●グローバル変数
  長さにこだわらず、なるべく意味の通る名前にする

●ローカル変数
  できるだけ短い名前にし、できれば意味の通る名前にする

外部に公開する場合や、他のクラスと連携するような、多岐にスコープが渡る場合、
長さを気にせず、とにかく意味がわかるような名前にします。
こうすることで、ドキュメントを見ずとも、雰囲気でプログラムがわかるようになります。
グローバル変数の場合には、嫌味なほど長くてもかまわないと思っています。
そもそもグローバル変数は悪であり(と私は思っています)、多用を防ぐためでもあります。

逆に、ローカル変数など、スコープが限定される場合、特に長さにはこだわらず、
むしろ短くすることを良しとします。
これは外部に出す必要がなく、その関数内で完結するため、意味を持たせることにあまり意味を持たないからです。
ローカル変数を長くすることは、必然としてプログラムが長くなってしまい冗長となってしまいます。


大文字や小文字の取り扱いにも、色々な方法があります。
代表的なものは次のとおりです。
●アンダースコア記法
  単語ごとに区切り文字としてアンダースコアを用いるものです。
  (例)is_action_state
  
●ラクダ記法
  単語ごとにその先頭文字を大文字にするものです。
  (例)IsActionState
  
●ラクダ記法(第1単語小文字)
  ラクダ記法の第1単語を小文字にするものです。
  主に動詞が小文字になります。
  (例)isActionState
これらは、特にどれが良いというものはないので、個人的な好みになります。
但し、プログラムに一貫してその記法を突き通すというのが原則です。

また、関数の名前と記法を変えることにより、
それが関数であるか変数であるかを判断しやすくなる方法があります。
例えば、関数名にラクダ記法(第1単語小文字)を用い、
変数に、アンダースコア記法を用いるといった感じです。


さて、記法のひとつとしてハンガリアン記法というものがあります。
これは、接頭文字、もしくは接尾文字に特殊な意味を持たせるというものです。
実は、Win32APIもこのハンガリアン記法に則って記述されています。

具体的には、接頭文字に変数の型を表現するというものです。
次のようなものがあります。
型     文字    例     
BOOLbまたはfbFlag
BYTEbybyCount
LONGnnNumber
DWORDdwdwSize
floatffTax
doubleddPrice
ポインタpまたはlppPointer
ハンドルhhWnd
こうすることにより、その変数がどのような型であるのか、瞬時で判断できます。

これはあくまで一例であり、変数の型を接頭文字にすることが
すなわちハンガリアン記法ではありません。
重要なのは、接頭文字に特殊な意味を持たせるというところにあります。

この部分を強調したのは、この記法にはある変数の定義が変更されたときに、
リアルの型と、記述上での型が不一致になりうる可能性があるデメリットがあるからです。
実際にマイクロソフトでは、後発の.NETFrameforkでは、この記法が廃止されています。

あくまで、型を示すものに使用するのではなく、特殊な状況が生まれる場合に使用することに
そのメリットが生まれます。
例えば、その変数がメンバであるのかローカルであるのか、ポインタであるのか、配列であるのかなど、
また、その変数が税金なのか、貯金金額なのか、利率なのかなど、
誤用しそうなところに、接頭文字を持たせることでその効果が発揮されます。
タグ:ふわ猫
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。