こんにちは高木です。
以前、「C/C++迷信集」の中で[迷信] ソースコード中の即値を全廃せよという記事を書きました。そこでも触れたのですが、定数をソースコード中に直に書くのが常に悪いとは限りません。あくまでもケースバイケースなんです。
ところで、その記事では「即値」という呼び方をしました。即値(=イミディエイト)というのは機械語やアセンブリ言語で主に使う用語のようで、直値と呼ぶ方の方が多いように思います。私は古い人間なので、社会人になって最初に本格的に取り組んだのがアセンブリ言語だった名残でそのように呼んでしまっていました。今回の記事では「直値」と呼ぶことにします。
話題を元に戻します。先ほどの迷信集の記事でも取り上げた三角形の面積を求める公式など、ごく単純な式の場合、ついついソースコード中に直に書いてしまいがちです。実際私もそうしてしまうことが多いのですが、本当ならこういう「直式」こそ可能な限り避けた方がいいのではないかと最近では考えています。
直値を使うのではなく値に名前を付けましょうというのと同様、直式を使うのではなく式に名前を付けてあげた方がいいのです。
0 1 2 |
s = base * height / 2; |
と書いた場合の「2」が直値だなんだというより、この式に名前を付けてあげましょうということです。式に名前が付いていれば、その式の中で直値が使われていても意味がわからなくなることは少ないはずです。上の三角形の面積の公式に出てくる「2」の意味は、小学校を卒業された方ならどなたでも分かるはずです。
0 1 2 3 4 5 |
double area_of_triangle(double base, double height) { return base * height / 2; } |
のように式に名前を付ける(=関数化する)ようにすれば、意味は明確になります。もし効率が気になるようならインライン関数にすればいいでしょう。
ところで、area_of_triangleという程度であれば、ほとんどのプログラマーが三角形の面積のことだと分かると思います。ところが、数学の用語を英語で書くと馴染みの薄い単語も出てきます。たとえば、次のような関数があったとして、名前からそれが何を意味するかすぐに分かる(日本人の)プログラマーがどれぐらいいるでしょうか?
0 1 2 3 4 5 |
static inline double circumference(double r) { return 2 * PI * r; } |
最近は私は意識低い系の人間になったのと、コンパイラが便利になったということもあって、こんなときは迷わず関数名を「円周」にしています。そう、日本語で名前を付けています。ローマ字ではなく漢字仮名交じりで名前を付けているんです。
0 1 2 3 4 5 6 7 |
#define π 3.1415926535897932384626433832795 static inline double 円周(double r) { return 2 * π * r; } |
こんな感じで、関数名には日本語を使いますし、円周率にはPIではなくπを使います。せっかく名前を付けてあげようといっているのに、付けた名前を見て直ちに理解できないようでは意味がないからです。そんなことをすれば、誰でも知っている公式なら直式を書く方が可読性が上がると判断されてもしかたがありません。
もちろん、メンバーが英語に堪能な方ばかりであれば、英語で名前を付けてあげればいいですよ。何が正解かは、それに関わるメンバーの状況で変わってくると思います。あくまでも、私は無理をして英語にこだわらないというだけです。複雑な概念を表す名前であればなおのこと日本語で付けるようにしています。
実は、日本語での命名については数年前まで若干の躊躇がありました。移植性の問題があったからです。Visual Studioしか使わない前提なら、C++であれC#であれVisual Basicであれ、日本語の名前を付けることに躊躇はありませんでしたが、GCCを使う可能性が少しでもあると日本語は避けていました。現在は幸いなことにGCCでも多バイトの文字の識別子が普通に使えるようになったので、もはやそのような制約はなくなりました。私は格好を付けるより実利を取ります。