Coding is freedom(犬井ヒロシ風)
プログラミングは自由です[1] 。たとえば「コネクションに接続できないときの例外クラス」が必要になったら、「 FatalConnectException」「 CannotConnectException」「 ExternalConnetException」といったふうに、いかようにも作成することができます。設計やアーキテクチャの決定なども組み合わせは無限にあり、どれを選択するかに絶対的な決まりはありません。今回は自由だからこそ難しい「名前付け」についてのお話です。
良い名前をつけよう
プログラミングを行っていると、変数名、メソッド名、クラス名など「名前」を考える場面が多々あります。良い名前は重要です。
大切なことなので、もう一度言います。
なぜ重要なのかということは、あとで詳しく説明します。ここでは、いつものように代表者の方々に「名前付け」についてコメントしてもらいましょう。
良い仕事をしたい普通のプログラマ
達人プログラマを目指す初級~中級のプログラマ
達人プログラマ
お、なんだか、達人プログラマのキャラが前回 と変わって人間が大きくなっています。達人はやっぱこうあるべきですよね。
良い名前の条件
それでは、良い名前の条件とはどのようなものでしょうか? いくつか挙げていきます。
説明的で意味・意図を表している
良い変数名、メソッド名、クラス名は、名前がその中身を正しく表しています。そのような名前はコメントを読むまでもなく、名前を見るだけでその役割を理解できます。良い名前はコードの理解を助けますが、悪い名前は読む者を混乱させ、勘違いを生み、バグの発生を助長します。
一例を見てみましょう。「 消費税金額を3桁ごとのカンマ区切りの文字列に変換して出力する」処理です。
// 消費税をカンマ区切りに変換
String s = fmt(value);
// 整形済み消費税出力
out.println(s);
変数名(s、value) 、メソッド名(fmt)がとても短いので、名前を見ただけでは何の役割を持つのかわかりません。そのため、1行ごとに役割を伝えるコメントが必要になっています。
String formattedConsumptionTax =
insertGroupingSeparators(consumptionTax);
out.println(formattedConsumptionTax);
それに対して上記は、変数名(formattedConsumptionTax、consumptionTax) 、メソッド名(insertGroupingSeparators)ともにたいへん長いです。名前で役割を説明しているので、コメントなしでも理解が容易です。つまり、こちらのほうが良い名前が付いていると言えます。
しかし、いささか名前が長過ぎますよね。あまりにも名前が長いと、逆にコードの可読性が落ちてしまいます。その場合、次のように短く省略するとよいでしょう。
String formattedTax = insertGroupSeps(consumptionTax);
out.println(formattedTax);
すっきりしてずいぶんコードが読みやすくなりました。これくらいであれば、名前を短くしても意味は十分に伝わります。省略によって意味がわかりにくくなってしまっては本末転倒ですので、その点を注意した名前付けが重要です。
省略のコツはいくつかあります。上の例では、
先頭の数文字を残す(Sep)
ingの削除
単語の削除
を行っています。そのほかにも、
語頭以外の母音を削除する(image→img)
強い音を残す(server→svr)
略語の利用(database→db)
などがあります[2] 。
一貫性がある
良い名前は、コード全体を通して一貫したポリシーで名前付けが行われています。たとえば、
対称性を保つこと
begin/end、write/read、on/offなど
単語の組み合わ方の一貫性
scoreAvg、scoreAverage、avgScoreなどを同時に使用しないなど
などが大切です。
イディオムに従っている
言語ごと、対象領域ごと、会社やチームごとに命名に関するイディオム(慣習)があります。たとえばJavaであれば、メソッド名は小文字から始まるのが標準的ですが、C#では大文字から始まります。C++ではメンバ変数にプリフィックス「m_」を付けるのが一般的です。イディオムに従った名前は、誰が見ても驚きが少なく、わかりやすい名前と言えます。
コーディング標準に従っている
上記の良いコードの条件を満たすためにも、コーディング標準や命名規約を定めてチームメンバー全員が合わせることが重要です。
最近では、言語の標準的なコーディング標準も公開されています(表1 ) 。また、Seasar2、Ruby on Railsなどのフレームワークや、Maven2などのビルドツールでは、ディレクトリ構成やパッケージ構成、クラス名などの命名規約があらかじめ定められています。これらの枠組みに乗っかることで、悩むことなく名前付けの標準を定めることができます。
●表1 言語別コーディング標準
良い名前を付けるための習慣
良い名前を付ける上でのポイントをいくつか紹介します。
常に良い名前付けに意識的になる
良い名前を付けるには、まず「名前付け」に対し、意識的になることが重要です。これは「A」という名前がいいのか? それとも「B」という名前がいいのか? 慎重に検討し、適切な名前を決定するプロセスを繰り返してください。それによりネーミングセンスが鍛えられ、良い名前付けができるようになってきます。
コードリーディングやレビュー
自分が知らないまったく新しい概念の名前が、突然ひらめくことは滅多にありません。コードリーディングやコードレビュー、誰かに相談するなどして、名前の引き出しを少しずつ増やしていきましょう。
Column イディオムの流行
命名のイディオムには流行があります。
一例を挙げると、昔はJavaのフィールド名にアンダーバーを付けるイディオムがありました。
private String name_;
public void setName(String name) {
name_ = name; // バグを生みにくい
}
これは、フィールド名に特徴を持たせることで、次のような「パラメータ変数への代入」などの単純なバグを防ぐことが目的です。
private String name;
public void setName(String name) {
name = name; // パラメータ変数に
// 代入してしまっているバグ
}
しかし、EclipseやNetBeansなどの最新の開発環境では、これらのバグはエディタ上でリアルタイムに警告を発します。ですので今では、アンダーバーのイディオムはあまり見かけないようになってきています。