こんにちは、エリ狐です。
社会人1年目かつエンジニア1年目の頃の話です。
変数や関数、定数の「名前」の付け方にセンスがないと言われたことがります。
レビューしてもらおう!
「名前のつけるセンスないよ…」
学校の教科書や市販の参考書ではよく「i」や「tmp」といった名前を使っていることが多いです。
これらの影響により、エリ狐も普段の開発で「i」や「tmp」を使いまくっていました。
でもこれらは「イけてないプログラミング」なので、今回はプログラミングにおける「名前」の重要性、付け方についてお話します。
知らぬ間に、イケてないプログラミングをしてることに気づいてないことも…
変数でも、関数でも、クラスでも全て気をつけなければならないことは…
「名前に情報を与える」ということです。
名前 = 「情報」 だと意識することが大切です。
短くてもいい名前をつけることができれば、それだけ多くの情報を伝えることができるからです。
それでは、どうやってつければいいのか次にまとめます。
具体的な名前にする
明確な単語と曖昧な単語
名前に情報を与えるとは、明確な単語を選ばなければなりません。
特に「その文字に意味がない」曖昧な単語は避けるべきです。
例えば「get」はあまり明確な単語ではありません。
get(url)という関数があった場合はいかがでしょう?
仮にインターネットからの取得する場合にはFetchPage()やDownloadPage()の方が明確です。
したがって、名前は明確さを求めるために、いくつかの単語と状況に応じて複数の単語を組み合わせることが大切です。
個人的によく使う辞典はweblioです。
直感的に分かりやすく
よく参考書やネットに転がっているサンプルソースでは「tmp」、「i」などが使われています。
このような名前を使うのは「名前のことは深く考えてないでーす!」と言っているようなものですので、意味のある単語や目的が分かる単語を使用しましょう。
もちろん、サンプルソースにおいては、「提示すること」「教えること」がメインですので変数の意味はそこまで重要ではないため問題ございませんが、業務では使用しないようにしましょう。
「rtnVal」を使っているプログラムを例とします。
1 2 3 4 5 6 |
var euclidean_norm = function(v){ var rtnVal = 0.0; for (var i =0; i < v.length; i += 1) rtnVal += v[i] * v[i]; return Math.sqrt(rtnVal); }; |
確かにいい名前が思いつかなければ、戻り値に「rtnVal」を使いたくなりますよね。
しかし、「rtnVal」には「これは戻り値だぞ!」という以外の情報はありません。
イケてる名前とは変数の目的や値を示すものになります。
上記のプログラムを例とすると rtnVal += v[i] * v[i]; はvを2乗の合計をしている。
したがって変数の目的としては「2乗して合計している」ということで「sum of squares」よりsum_squaresとする方が好ましいです。
sum_squares += v[i] * v[i];
このようにすることで変数の目的が分かりやすくなり、バグの発見にもしやすくなるのです。
しかし、「tmp」、「i」が全て悪いわけではありません。
1 2 3 4 5 |
if( apple < orange) { tmp = apple; apple = orange; orange = tmp; } |
ここでいう「tmp」は「一時保管」という目的しかありません。
したがって「この変数は他に役割がない」ということを意味しています。
このように他の関数に渡されたり、なんども書きかえられたりしない場合には「i」や「tmp」といった単語を使用しても問題ないです。
名前は長くすればいいものではない
みなさんが名前をつけるときに「長い名前はやめよう」と思うことや意識していることってありませんか?
確かに、イケてる名前を決めるときに「長い名前は避ける」という暗黙的な決まりうごとがあります。
「newOrganizeWrappingSettingControllerDataSorceOfClass」とか付けられたプログラムがあったら誰でもドン引きするでしょう。
長い名前は覚えられないし、エディターを占領してしまい折り返しが必要になります。
しかしながら、「長い名前はダメ」としたら1つの単語や頭文字だけになってしまいます。
ではどのように名前を選べばいいでしょうか。
それは「スコープの長さによって名前の長さを変える」ことです。
皆さんは旅行に行きますか?1泊2日で行く場合と、7泊8日で行く場合では荷物の差は変わりますよね?
プログラムも同様に使用する関数の長さが大きいほど「多くの情報を詰め込む」必要があります。
したがって、短いスコープであれば短い名前で問題ないのです。
1 2 3 4 5 |
if (debug) { map < string, int > k; lookUpNamesNumbers(&k); Print(k); } |
「k」という変数名はあまり情報量がありません。
しかし、ソースを理解すれば必要な情報が分かるので特に困りません。
しかしながら、この「k」が他の関数で使用されていたらいかがでしょう?
その場合に「k」は型や目的が分からず、イケてない名前となってしまうのです。
したがってスコープが大きくなれば、同様に名前にも十分な情報を詰め込む必要があります。
まとめ
今回は「名前の付け方」についてまとめていきました。
これらは意識してないと抜けちゃうことになるので気をつけてください。