このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

c2fとか名付けていたトッツァン(僕)が、関数や変数のネーミングについて最近思うこと

ウチのワカイシじゃないけど、某所ワカイシに言い忘れたことをここにオシャベリとして書いておこう、っと。一般論だと思うので。



ケン・トンプソン(Ken Thompson)が、「UNIXを設計し直すとしたら、どこを直したいですか」と聞かれて「creat のスペルに e を付けたいね」と答えたという話があります*1。ニヤリと笑える話だし、人によっては教訓を引き出したりするのかもしれません。

それにしても、トンプソンはなんで最後のeを省いたのでしょう。昔のコンパイラだと、名前(変数や関数の識別子)が8文字までなんて制限がありました。6文字のものさえあったと聞きます。もし、リンカーが6文字までしか識別しないとすると、多くのコンパイラが関数名の先頭にアンダスコアを付けるので、_createと7文字。やべっ*2、これが理由か? トンプソン、そんなセコイこと考えていたのかぁ?

creatはともかく、昔は、関数名に短い名前を使ってました。僕が他人に文句言われた記憶があるものでは、extractPersonalInfo を xtrctpi とかね。そういうネーミングをしていたので、X Window SystemAPI名にはビックリしましたよ。大文字小文字混じりだしフルスペルだし。

今じゃ、名前の長さに制限もないし、名前補完機能が一般化しているので、長くても説明的な名前が推奨されます。しかし、ものごとにはなんだって案配というかバランスってもんがあってね、次はどうよ。


public static float calcAverageAge(int[] arrayOfAges) {
int numberOfMembers = arrayOfAges.length;
int totalAmountOfAges = 0;
for(int counterOverArrayOfAges = 0;
counterOverArrayOfAges < numberOfMembers; counterOverArrayOfAges++) {
totalAmountOfAges += arrayOfAges[counterOverArrayOfAges];
}
float totalAmountOfAgesAsFloat = (float)totalAmountOfAges;
float averageAge = totalAmountOfAgesAsFloat / numberOfMembers;
return averageAge;
}
確かにとっても説明的で、よーく読めばよーく事情が理解できます。が、これウザウザ過ぎ。

これ(↓)くらいだって事情は分かりますがね。


public static float a(int[] a) {
int n = a.length;
int t = 0;
for (int i = 0; i < n; i++) {
t += a[i];
}
return ((float)t)/n;
}
いやっ、さすがにメソッド名1文字はひどすぎるか。

public static float averageAge(int[] ages) {
int n = ages.length;
int t = 0;
for (int i = 0; i < n; i++) {
t += ages[i];
}
return ((float)t)/n;
}



もうひとつ例題を。

摂氏温度を華氏温度に変換する関数(メソッド)を書くとしましょう。今風の「長い名前」傾向に迎合すれば、float convertCelsiusToFahrenheit(float celsius) といった感じでしょう。昔の僕なら float c2f(float c) だろうね。

「2」って何かって? 昔は文字数の制限がきびしかったから、toに2、forに4なんて代替表現を使っていたんですね。convertCelsiusToFahrenheit を、convertCelsius2Fahrenheit と書いても察してくれる人は今でも多いと思います。でも、もともと26文字あるものを1文字節約しても意味ないですね。convertC2Fなら? いやっ、もうさすがにこういう古い習慣は捨ててもいいと思うよ。

XML仕様のひとつにDOM(Document Object Model)があるけれど、これにはレベル1、レベル2、レベル3(未完)があって、現状はレベル2、つまりDOM2が主流。同じくXMLの仕様であるSAX(Simple API for XML)もバージョン2はSAX2と呼ばれてます。DOMとSAXの相互変換はよくやる操作だけど、その関数(メソッド)をconvertDom22Sax2とかにすると、「ドム・ニジュウニってなんだよ?」てなことになりますから、普通にconvertDom2ToSax2にすべきでしょう。たかだか1文字節約で誤解を招くのもバカバカしい。

ここからは僕の趣味に過ぎませんが、関数型言語を使うときや手続き的言語でも純関数であるなら、動詞を使わないで名詞中心の名前がいいと思います。つまり、convertCelsiusToFahrenheit より単に、celsiusToFahrenheit。さらに言えば、ほとんどのプログラミング言語で「引数→戻り値」の方向が右から左なので、toの代わりにfromを用いて float fahrenheitFromCelsius(float celsius) のほうが自然だと感じます。もっとも、「自然な感じ」が人によって違うのが問題ですがね。

*1:IT都市伝説のたぐいである可能性もあるけど、『Life with UNIX』に載っていたと思う。

*2:eが切り落とされるだけで、他の名前とかぶらない限り実はたいしてやばくないけど。