68.命名慣習には従うべし
命名慣習
Javaの命名慣習はJLS6.1にうまくまとまっている。
大雑把にいって、命名慣習は表記的なもの(typographical)と文法的なもの(grammatical)に分けられる。
typographical
パッケージ名、モジュール名
パッケージ名、モジュール名はピリオドで区切られたコンポーネントで階層化されて表現される。
コンポーネントはアルファベットの小文字(とまれに数字)で表される。
組織外で使用されるパッケージには、組織のインターネットドメイン名を逆さにしたものから始める(com.googleなどのように)。このルールはjavaとjavaxから始まる標準パッケージに関しては適用範囲外である。ユーザーはjava、javaxで始まるパッケージ、モジュールを作成してはならない。
インターネットドメイン名をパッケージの接頭辞にする詳しいルールはJLS6.1に書いてある。
パッケージ名の残りは、1つ以上のコンポーネント名から構成される。
コンポーネント名は一般に、8文字以下の短い文字列(略語など)であることが推奨される。
クラス名、インターフェース名
列挙型、注釈型含むクラス名、インターフェース名の名前は、各単語の先頭一文字を大文字にした単語で構成する。
頭字語とmax、min等の一般的な略語を除いて、略語の使用は控えるべきである。
頭字語について、全部大文字で記載するか、先頭一文字のみ大文字にするか、議論の分かれるところであるが、見やすさの観点からここでは先頭一文字を大文字にする法を推したい。
メソッド名、フィールド名
メソッド名、フィールド名は基本的に、最初の一文字目を小文字にする、というところ以外はクラス名、インターフェース名の規則と同じである。
この規則の唯一の例外は、定数フィールドでは大文字の単語をアンダースコアで区切るようにする。(NEGATIVE_INFINITY)
ローカル変数
ローカル変数の命名慣習は、フィールド変数のそれとほぼ同じであるが、ローカル変数では文脈に沿った略語を命名することが認められている(i,denom,houseNum等)。
引数となる変数に関しては、メソッドのドキュメントに統合するものとなるので、注意深く命名してやる必要がある。
型パラメータ
型パラメータは基本的に一文字で構成される。
Tは任意の型、Eはコレクションの要素の型、KとVはmapのキーと値の型、Xは例外の型、Rは戻り値の型をあらわす。
また、任意の型を複数使う場合の順序は、T、U、VまたはT1、T2、T3である。
grammatical
命名に関する文法的な規則は、表記規則より柔軟で議論の余地がある。
パッケージ名、モジュール名
パッケージについては文法上の命名規則はない。
クラス名、インターフェース名
列挙型を含む、インスタンス化可能なクラスは、単数名詞、名詞句で名前が付けられる(Thread,PriorityQueue,ChessPieceなど)。
インスタンス化しないクラスは、名詞の複数形で命名されることが多い(Collectors,Collectionsなど)。
インターフェースは、クラスと同様の命名規則であったり(Collection,Comparatorなど)、末尾が形容詞的な終わり方になっていたり(Runnable,Iterable,Accessibleなど)する。
注釈型については、様々な用途があるので、これまでに出てきたいずれにも当てはまらない。名詞、動詞、前置詞、形容詞すべてよく使われる(BindingAnnotation, Inject, ImplementedBy,Singletonなど)。
メソッド名
何らかのアクションを実行するメソッドは、一般的に、動詞、動詞句で命名される(append,drawImageなど)。
booleanを返すメソッドは、isまたはhasで始まり、名詞、名詞句、または形容詞として機能する言葉が続くように命名される(isDigit, isProbablePrime, isEmpty, isEnabled, hasSiblingsなど)。
boolean以外の値を返すものや、オブジェクトの属性を返すメソッドは、名詞、名詞句、getで始まる動詞句で名前が付けられる。
getで始まる動詞句だけが認めれるとする声があるが、その根拠は乏しい。
名詞、名詞句の命名方法を使ったほうが、たいていは可読性が上がる。
if (car.speed() > 2 * SPEED_LIMIT)
generateAudibleAlert("Watch out for cops!");
いくつかのメソッド命名規則には特別な言及が必要である。
インスタンスの型を変換し、独立したオブジェクトとして返すメソッドはtoTypeメソッドと呼ばれたりする(toString、toArrayなど)。
受け取ったオブジェクトと異なる型のオブジェクトを返すメソッドはasTypeメソッドと呼ばれたりする(asListなど)。
呼び出されるオブジェクトと同じ値のプリミティブな値を返すメソッドはtypeValueメソッドと呼ばれたりする(intValueなど)。
ファクトリメソッドの一般的な名前はinclude from, of, valueOf, instance, getInstance, newInstance, getType, newTypeなどがある(Item1)。
フィールド名、ローカル変数
フィールド名の文法規則はそれほど重要でない。なぜなら、ちゃんと設計されたAPIでは、公開されるフィールドがほとんどないからである。
boolean型のフィールドはアクセサメソッドの最初の文字列だけ消えたものが採用されることが多い(initialized,compositeなど)。
その他のフィールドでは名詞、名詞句であることが多い(height,digits,bodyStyle)。
ローカル変数の文法規則はフィールドよりもっと緩い。