2012年7月26日木曜日

命名規則 (naming convention)

softies projectの使用言語は Cであるが、命名規則は Kernighan und Ritchieの伝統を基礎に、オブジェクト指向に対応するためのいくつかの制約と拡張を試みている。


基本原則

K&Rに掲載されている典型的な変数名、関数名を次に示す。
  1. line
  2. getword
  3. day_of_year
  4. op2
  5. _iob
これらは英小文字と下線'_'、2文字目以降には数字を使用する。1つの名前が 2つ以上の単語で構成される場合は空白で区切ることができないため、単語を続けて記述する方法と下線'_'で繋ぐ方法があるが、後者の方が比較的読みやすい。しかし、我々は '_'をパッケージ名やクラス名の区切りとして使用するために通常の単語の区切りとしては使用しないことにした。代わって各単語の先頭を大文字にする CamelCase方式を採用することにした。これは X Window Systemなどで使用されてる。

オブジェクト指向の構成要素を区別しやすくするためにパッケージ名は英小文字と数字のみ、クラス名は英大文字で始める UpperCamelCase、関数や変数名は英小文字で始める LowerCamelCase、そして定数は英大文字と数字そして下線で記述する。


クラス名(class name)

たとえば、Threadクラスのスタックトレース出力を行う関数を表現する場合は次のようになる。
Thread_dumpStack()

_の前は Threadがクラス名(class name)、_の後は dumpStackが関数名(function name)、オブジェクト指向的にいえば、操作名(operation name)あるいはメソッド名(method name)である。

さらに、この Threadクラスが lwd:langパッケージに属する場合は次のようになる。
lwd_lang_Thread_dumpStack()

このように変数名や関数名に接頭辞のごとくクラス名をつけることには訳がある。プログラムの中で名前の衝突を回避しなければならないことがあり、大規模になるほど名称の管理は難しくなる。クラス名や後に述べるパッケージ名をつけることにより、衝突の回避がしやすくなる。たとえば、Streamクラスと Textクラスに各々 read関数を定義されていても良い。

パッケージ名(package name)

パッケージ名(package name)は 1つ以上の名前空間(name space)で構成されている。各々の名前空間は前述のとおり英小文字か数字で表現するため、名前空間は '_'で区切ることができる。

悪い例(bad example)
lwd_Lang_Thead_Dump_Stack

パッケージ名、クラス名、関数名等に各々大文字を使用したり、単語の区切りに '_'を使用してしまうと、どこまでがパッケージ名、クラス名、関数名なのか区別できなくなる。
同様の理由で、名前空間の名称の単語を '_'で区切ったり、変数名や関数名を '_'で始めたり、終えたりすることはしない。


定数(constant)

定数は、#defineて定義される記号名に加え、メモリに配置される const値も、単語を '_'で繋いだ英大文字および数字で表記する。 つぎに示す例は、前述の Threadクラスで定義される最大優先順位を示す名称。
lwd_lang_Thread_MAX_PRIORITY


局所名(private name, local name)

ソースモジュール内でのみ有効な privateな変数、関数の名称はグローバルではないため名称の衝突を心配する必要はない。また、関数内でのみ使用されるローカル変数の名前も同様である。これらはパッケージ名やクラス名を省略してできるだけ単純な名前をつけるのが良い。

例)
dumpStack


補足

これまで説明したとおり、パッケージ名まで表現しようとすると長い名前になる。しかし、これは冗長というわけではない。

K&Rで推奨している 8文字には収まりそうも無い。しかし近代的な処理系であっても名称の長さの上限がなくなったわけではない。255文字に収まるのが適当と思われる。


四川は、まるでレーザービーム

0 件のコメント:

コメントを投稿