プログラムで美しくて見やすい命名って何さ

以前、かなり巨大なプログラムを作ったのだが、
このライブラリの命名規則がかなり悲惨なものであった。
僕はこういう表記が好きなんだけどね…


どんなものかといえば、全部小文字で書いてるんですね。
えらいもんですよ。 lastturncsvdataとかいうプロパティ名がありますし、
クラス名もほとんど小文字。
なんで小文字なのかというと、打ちやすいからですね。
とはいえ、一見すると何を書いてるかわからないのが欠点ですね。
基本的にはLastTurnCsvDataのような表記が好きです。
これはPascal形式とよばれるものらしいのですが、
一応.NET Frameworkの方針はこれのようです。
ただどちらかというと、lastTurnCsvDataのような表記の方が有力なのかな。
これはCamel形式といいます。ラクダのこぶみたいなのがあるから。
Javaのライブラリはこれですね。
どちらにしても大文字小文字で語の区切りを見えやすくすると。
複合語を無理に縮めなくても、まぁ読みやすいですし、人気がありますね。


そういえばRubyの命名規則はかなり楽しい規則だった。
Rubyではクラス名は大文字から始まらないといけないんですね。
なのでmyclassはダメ。MyClassとかにしないとね。
変数名ですが、これは小文字から始まることになってます。
そのほかにいろいろルールがあるのですが、これがかなりお茶目なんですね。
$から始まるものはグローバル変数、@から始まるものはインスタンス変数、@@から始まるのはクラス変数。
グローバル変数はPerlで作るならour使いますね。our $g; とか。
けどRubyでは$を付けると。一目瞭然ですね。
インスタンス変数は、C#とかでthis.fooと書くのを、@fooと書くと。
Perlやってた人からすると、配列みたいですがそんな意味は全くありません。
メソッド名も楽しいですね。
破壊的メソッドは!、真偽を返すメソッドは?を付けると。
MyClass#isEmpty? とか、MyClass#replace! とか。
ちなみにMyClass#myMethodのように何々クラスの何々メソッドとか書くらしいですよ。
.NET Frameworkの説明はSystem.IO.StreamReader.ReadToEndメソッドとか書かれてること多いけど。
破壊的メソッドと非破壊的メソッド両方あることもありますね。
これすばらしい仕組みだと思いますよ。そりゃ打つ文字が増えてめんどくさいけど、見た目はいい。

bar=foo()
bar.next!()
puts "Field 2 is empty." if bar.next().isEmpty?()
puts "Field 1 is #{ bar.current() }"

こんな風になるのかな。まぁ想像で書いてみました。
bar.next!()はbar+=1、bar.next()はbar+1、という風な感覚で使えます。
両方とも備えられてたら楽しいかも知れませんね。
真偽値を返すメソッド名って疑問文になってること多いですよね。
そこの雰囲気からもつかみ取れたりしますけど、まぁいいんじゃないかな。


以前、ハンガリー記法という命名法があったらしい。
Wikipediaによれば、それの本義は、変数の指す内容の種類を変数名に付けましょうということ。
例えば、carSpeedとhumanSpeedという変数があった。その足し算を計算したいと。
それで、System.Console.WriteLine(carSpeed+humanSpeed); などと書いたわけだ。
けど実はcarSpeedの単位はmph(マイル毎時)、humanSpeedの単位はkm/hだったと。
それを防ぐために考えられたのがこの方法らしい。
例えば速度のうちkm/hにはkph、mphにはmphと付けましょうと決めるわけである。
すればmphCarSpeedとkphHumanSpeedの足し算となり、どうもおかしいと。
それで気付いて、System.Console.WriteLine(mphCarSpeed*1.609+kphHumanSpeed);など書いたと。
これでOKですね。
という風に目で見ておかしいと気付ける仕組みだと思いますよ。
確かに一理あると思う。C#で書いてたらXMLDocumentationで意味とか単位とか書きますけど、
勘違いを防ぐために統一的な符号を付けておくのは場合によってはいいかも。
ただこの符号、MFCなどでは型名を表す符号だったのね。

HWND CreateWindow(LPCTSTR lpClassName,LPCTSTR lpWindowName,DWORD dwStyle,int x,int y,int nWidth,int nHeight,NWND hWndParent,HMENU hMenu,HINSTANCE hInstance,LPVOID lpParam);

こんなWIN32API関数があるはず。
この引数名を見て欲しいのだが、
lpClassNameはポインタであるということでlpと付けられてる。
dwStyleはDWORD型ということでdw、hInstanceはウインドウハンドルということでh。
という非常に冗長というかなんというかよくわからない記述になってる。
こんなのは見ればすぐわかると思うのだが、意義があると思ってマイクロソフトは使ってたらしい。
まぁこの辺は昔と今は環境が違うということだと思っていいと思います。
ただ.NET Frameworkでは全面的に廃止されてることになってます。
一応インターフェースの名前はIEnumerableなど、Iから始まるという習慣がありますが、この程度ですかね。
変数名とかはこんな習慣は全くないと思いますよ。


なんやら言ってきましたが、どうも普段は変数名は全部小文字であると。
でもかっこつけたいときは大文字を適当に使って見やすくしてみたり。
ソースコード見てぱっとわかるとありがたい。
というわけで多少長くとも英語で略さずきちんと命名しましょうとか、
MSDNに行けば.NET Frameworkの世界での統一ルールがわかりますよ。
団体によってルールも違うからそんなに神経質にならなくてもいいと思うけど、
どうも見てると複合語はCamel形式かPascal形式で書くとよさそうですね。
どちらを適用するかはまちまちなのでなんとも。
あとPHPはアンダースコアが好きですね。PHPらしいですね。
また必要となれば、そういうのを調べてみようかなと思いましたね。