リーダーブルコードを読み学んだ変数や、関数、クラスなどに対しての命名方法をまとめる。
##名前に情報を詰め込む
名前は短いコメントだと思えばいい。短くてもいい名前をつければ、それだけ多くの情報を伝えることができる。
以下は情報を詰め込んだ名前をつけるための方法をまとめる。
###明確な単語を選ぶ
「名前に情報を詰め込む」には、情報が明確に伝わる単語を選ぶべき。
class BinaryTree {
int Size();
...
}
Size()メソッドが何を返すかわからない?? ツリーの高さ? ノードの数? ツリーのメモリ消費??
伝わる名前をつけるなら、それぞれHeight( ), NumNodes( ), MemoryBytes( )になる。
###汎用的な名前は避ける
エンティティの値や目的を表した名前を選ぶ
例えば、i・j・kなどの名前はインデックスやループイテレータでよく使われるが、より伝わるようにするべきである。
for (int i = o; i < clubs.size(); i++)
for(int j = o; j < clubs[i].members.size(); j++)
for(int k = 0; k < users.size(); k++)
if(clubs[i].members[k] == users[j])
cout << "user[" << j << "] is in club[" << i << "] << endl;
if文にあるmembers[]とuser[]のインデックスが逆になっているが、一目見ただけではバグがわからないだろう。
i,j,kではなく、club_i・members_i・users_iのような説明的な名前にすることで、バグば目立ちやすくなる。
###接尾辞や接頭辞を使って情報を追加する
絶対に知らせなきゃいけない大切な情報があれば、「単語」を変数名に追加すればいい。
時間やバイト数のように計測できるものであれば、変数名に単位を入れるといい。
var start_ms = (new Date)).getTime()
上記のようにすることで、start_msがミリ秒を返すことがわかり、バグが発生しにくくなる。
名前の長さを決める
スコープが小さければ短い名前でもいい。下記ではmという変数名には情報が含まれていないが、コードを理解するのに必要な情報がすぐそばにあるから把握できる。
if (debug) {
map<string, int> m;
LookUpNamesNumbers(&m);
Print(m);
}
mがクラスのグローバル変数では、コードが読みにくくなるので、やめるべき。スコープが大きい時は、名前に十分な情報を詰め込んで明確にする必要がある。
名前のフォーマットで情報を伝える
定数は大文字などと決めておけば、コードの理解がしやすくなるので、フォーマットは意識すべきである。
参考:リーダブルコード