最終更新日: 2007-09-16
WEB+DB PRESS Vol. 39 に向けて書いた記事の元の原稿です。
「プログラミングに関する雑多な事柄」がテーマの本連載、第2回の今回は「コーディングスタイル」について取り上げたいと思います。
コーディングスタイルは、コードの書き方に関するスタイルです。インデントの仕方や、変数名・関数名の表記法などはコーディングスタイルで扱われる要素の代表例です。
コーディングスタイルが異なると、同じ意味のプログラムでも見た目はだいぶ変わります *1。
for (i = 0; i < 10; i++) { printf("%d\n", i); }
for (i = 0; i < 10; i++) { printf ("%d\n", i); }
スタイルをごちゃまぜにするとコードが非常に読みづらくなるため (イライラの原因にも)、ひとつのプロジェクトの中ではコーディングスタイルの一貫性を守ることが重要です。
スタイルにも個人の趣味というものがありますが、個人の趣味よりもプロジェクト内での一貫性の方が重要です。あるスタイルで書かれたコードを修正するときに、自分の趣味に合わないからといって、部分的に自分の趣味を取り入れても浮いてしまうだけです。ここは、郷に入っては郷に従え、を実践しましょう。
まれに、オープンソースのプロジェクトへのパッチで、元のプログラムと異なるコーディングスタイルを使っているものを見かけますが、これはあまり歓迎される方法ではありません。パッチを受けつける側からすれば、パッチを当てた後で、スタイルを修正するという手間がかかるためです。
プログラミング言語によっては、開発者のコミュニティ内でスタイルに関する同意がとれているものがあります。たとえば、CPAN に登録されている Perl モジュールのコードは大体、同じスタイルで書かれています。Java の場合は Code Conventions for the Java Programming Language *2という Sun のオフィシャルの文書があります *3。このような場合、それに従うに越したことはありません。
一方、C や C++ ではさまざまなスタイルの慣習があり、厄介です。ゼロからプロジェクトを始めるなら、広く使われている慣習の中から自分の気に入っているもの、気に入ったものを選ぶとよいでしょう。まったく独自のスタイルを新たに編み出すのは得策とはいえません。いずれにしても、どのスタイルを使うかよりも、スタイルの一貫性の方が重要です。
コーディングスタイルは開発者の間での議論を呼びやすいトピックです。というのも、スペースを入れるの入れないのといった事柄は誰でも口をはさむことができますし、厳密な優劣などつけられない問題ですから (大体は慣れの問題です)、議論が紛糾することもめずらしくありません。
一方で、高度なアルゴリズムの詳細に関する議論などでは、口をはさめる人がいないため、議論はあっさり収束したりします。このような現象は「自転車置場の議論」として FreeBSD のコミュニティで知られています *4。
複数のメンバーで開発をする上では、コーディングスタイルをあらかじめ決めておくと無用な混乱を避ける役に立ちます。とはいえ、スタイルを決めておいたとしても、解釈に曖昧性が生じたり、想定外のケースがでてきたりすることはよくあります。
私の見る限り、生産性の高いプログラマはコードだけでなく、議論を早く片づけることも得意のようで、スタイルに関する瑣末なことをうだうだと議論しないで、さっさとけりをつけてしまいます。あるいは、はじめからそんな議論には参加しません。スタイルの一貫性を守ることは大切ですが、微妙なケースに関しては変にこだわりすぎないことも大切のようです。
とはいうものの、瑣末なことをうだうだ議論するのは、食事どきなどの害のない時間にやる分には、案外楽しかったりします。 filename か file_name か、HTTPServer か HttpServer か、ファイル名に使う記号は - か _ か、など、どっちがいいともつかないような事柄を議論していれば、あっという間に時間が過ぎるはずです。
ありがちなパターンは、昔の XX BASICでは変数名が短い方が実行が速かったとか、昔は雑誌に載っているプログラムを入力してゲームで遊んでいたものだとか、いつのまにか全然関係のない昔話に脱線して、さらに無駄な議論が長引くというものです。その場にいる人の大半がついていけなくなるまで時代を遡るとようやく終わりを迎えます。
今回はコーディングスタイルについて書きました。コーディングスタイルはプログラミングの生産性を高めるひとつの手段です。スタイルを守ってコードの読みやすさを保っていれば、プログラミングにおけるもっと難しい問題に集中できるはずです。
*1Cのコードのスタイルは indent というツールで変換できます
*2http://java.sun.com/docs/codeconv/
*3さらに、それをチェックする
checkstyle というツールがあります
http://checkstyle.sourceforge.net/
*4http://0xcc.net/blog/archives/000135.html