読者です 読者をやめる 読者になる 読者になる

キャメルケースよりスネークケースで。

設計

 プログラムを書くとき、たいていは何らかの命名規則に従って識別子を書くわけですが、その種類はだいたい 2 つじゃないかと思います。
 ・スネークケース:スペースをアンダースコアに置き換えた表現。( chocolate_pie, candle_cake, ... )
 ・キャメルケース:スペースを詰めて次の語を大文字から始める表現。( chocolatePie, CandleCake, ... )
 プログラムってのは名前が 8 割とか言うひともいますけども、なんだかんだと複合語を記述する場面は死ぬほどありますし、しかも多くのプログラミング言語がスペースをトークンの区切りとしている以上、何かルールを設けないといけないんですよね。そうしないと「複合語の中にあるスペース」と「トークン区切りとしてのスペース」を区別できない。区別できないっていうかプログラム書けない。 
 で、どういうルールで書くかっていうと標準ライブラリの記法に沿うのが常套手段かと思います。例えば C++ だとスネークケースです*1し、Java とか Scala とか C# はキャメルケースですね。
 で、僕の主観なんですけども、両者を較べるとスネークケースの方が表現方法として優れているように思うんですよね。そりゃもう圧倒的に。

● 1. スネークケースは横方向の幅を変えない。
 例として stackoverflow.com から拾ってきた一文をそれぞれの方法で表現 すると↓こんな感じ。
*2
 スネークケースでは横幅が変わらないですが、キャメルケースでは縮んでしまいます。
 横方向の幅が変わるということは、読むときの速度感が変わるってことだと思うんですよね。キャメルケースだと、元々あったはずの空間が消えるのでトークン区切りのスペースが相対的に際立ちます。これって、読む速度の強弱が原文よりも強力になってしまってると思うんですよ。あぁもちろん「プログラムソースも原文と同じ速度で読めなくてはいけない」と主張するつもりは無いんですけども、複合語だからという理由だけで空間を詰めるのはやや乱暴な気がするんです。

● 2. スネークケースは、名詞を名詞のままで書ける。
 僕は英語に長けていないです。しかしそれでも、英語表現において大文字と小文字の区別に何らかの意義があることは理解できます。なんていうか大文字のところは周りと比較して強調されてる感じありますね。名詞なんかが特にわかりやすいのですが、キャメルケースでは強弱関係を壊してしまうように思うのです。例えば↓こんなの。
*3
 キャメルケースだけは「a」が大文字になります。これによって、もともと「R」だけが大文字だったのに「a」も大文字の「A」になってしまって、相対的に「R」の強調が弱くなってしまうような気がするんです。このようにスネークケースは大文字小文字の差異をそのままコードに落とせるという点でキャメルケースより優れているような気がします。

● 3. スネークケースの中にも 2 種類あるけど片方は滅んで欲しい。
 スネークケースといっても、定数を書くときは全部大文字で書くっていう習慣がありますよね。「CONSTANT_VALUE」みたいなやつです。この書き方は、上で説明したような「大文字 - 小文字の関係」を潰してしまうのであんまり好きじゃありません。さっさと滅んで欲しいです。
 そもそも「定数であることを、読む人がすっと分かるようにした方が良い」という意見が正しいならば、その理由は「その値が変更できない性質であることを分かりやすくする」ことでしょう。ということは「この変数は int 型であることを、読む人がすっと分かるようにした方が良い」という意見も正しいはずですよね。これすなわちハンガリアンですね。ハンガリアンはやめましょう、やめましょうと散々言われていますよね。従って「定数であるかどうか」を字面で表現する必要も無いように思います。

● 4. クラス名とそれ以外は区別すべきか否か?
 Java においてクラス名は 1 文字目が大文字( StringBuffer とか )ですし、メソッド名は 1 文字目は小文字( toString とか )です。これも、字面でそれが何であるかをぱっと識別するためのルールです。C# は違いましたっけ...?よく知らないですけども。
 ここまで書いてきた通り、識別子において「大文字 - 小文字の関係」はすごく大切なものだと僕は思ってるので、そんなルールは嬉しく無いわけです。とはいえ、クラス名はプログラムにおいてきっと物凄く大切なので、クラス名をメソッド名などと区別するということには価値があるのかもしれません。前節で紹介した定数も、じつは物凄く大切だから区別することに価値があるのかもしれません。でもそんなこと言い出したらキリが無いので、こういう「何が大切なのか」とかいうルール付けはもうエディタに任せてしまえないかなぁとか思います。
 というわけで、これからのプログラミング言語は標準ライブラリから何からスネークケースで書かれてると僕は嬉しい!というのが今回言いたかったこと。

● 5. ところで
 キャメルケースのキャメルってラクダのことですけども、別にラクダっぽく無いと思いませんか。むしろスネークケースよりもうねうね感が目立って蛇っぽい。あと、ラクダ本を擁する Perl がスネークケースで書かれてるっていうことに気づいたんですけど、まぁそれはどうでもいいですね。一方、スネークケースですけども、実は snake-case じゃなくて snail-case (snail はカタツムリ) なんだよ、というのをどこかで読んだ気がするんですけども気のせいだったのかなーとか。

*1:C++ の場合、キャメルケースで書かれてるライブラリもたくさんあるのでごちゃごちゃしちゃうんですけども

*2:「how to pass」は複合語じゃない?あ、そう。

*3:実際のプログラムで the は書かない?あ、そう。