2007-04-16

青木峰郎/Rubyist Magazine出張版 正しいRubyコードの書き方講座

たまには、プログラミングの本を読まないと、ぼくのアイデンティティが、ただのサッカー好きのおじさんになってしまう、ということで、久々に本を購入して読んでみた(ちなみに、ぼくの読書は、ほとんど図書館で読むか、図書館で借りるかで行なわれる)。

で、この本だが、るびま

http://jp.rubyist.net/magazine/

で連載されたものを、書き下ろし1章とコラムを付けて本にまとめたもの。連載の方をある程度見ていたので、本の方もサクサク読めた。

Rubyは、PerlからTMTOWTDIのポリシーを受けついで、さらにリフレクションの機能が強力なので、プログラムをどのようにも書けてしまうという特徴があるのだが、そうすると、今度は、書けることは書けるが、じゃあ、どう書くのが正しいのかという問題にぶちあたる。例えば、ぼくがCでプログラムを書くときには、読む人間がANSI Cの仕様を熟知していることを前提に、括弧は必要最低限しか書かないことにしている。こうすれば、括弧が付いているのは、アルゴリズム的に意味のあるところしかなくなるので、結合順序を知っていれば、コードは読みやすくなる、とぼくは考えている。しかし、これをRubyに適用しようと思ったら大変なことになる。括弧が省略できすぎてしまうのだ。

じゃあ、どうするかと悩んで、ぼくが出した結論は、二項演算子の結合順序は、プログラマが把握すべきだから余計な括弧は付けない、しかし、関数(メソッド)の適用の括弧は必ず付ける(引数が0のときを除く)というもの。しかし、これでもRuby的には、やや括弧を付けすぎなような気がする。他の人のソースコードを読むと、結構みんな関数の適用でも括弧を省略するんだよね。仕様を熟知すべきという前言を翻すようだが、学生時代に関数型言語に慣れ親しんだせいか、これはなんとなく気持ち悪い。

例えば、Haskellでリストの先頭の要素を取ってきて1を足すというプログラムを書くと、

head [1, 2, 3] + 1

となるだが、rubyで同じようにhead関数を定義して実行してもエラーになってしまう。なぜかと言うと、この文はHaskellでは、

(head [1, 2, 3]) + 1

と解釈されるが、Rubyでは、

head ([1, 2, 3] + 1)

と解釈されるのだ。一般的に関数型言語では、関数の適用時の括弧を省略することが多く、関数の適用はかなり強い結合順位になる。この感覚があるので、Rubyで関数適用の括弧は外したくないのだ。

括弧の話が長くなってしまったが、Rubyでは、このように細かいことでも、どう書くか悩んでしまう言語なのだ。Rubyには、歴史が浅いせいか、Cで言うところのK&Rみたいな、ある程度コンセンサスのあるコーディングスタイルというのもない。そういう中で、Ruby界の重鎮の青木氏がこの本を書いた意味は大きいと思う。

もちろん、この本に書いてあるのは、コーディングルールだけではない。protectedなどのRubyの文法の落とし穴や、少しマイナーなメソッドを使ってコードを短かく書く方法など、Rubyを書く上で役に立つことがたくさん書いてある。特に感心したのが、eval系メソッドの使ってDSL(Domain SpecificLanguage)を作るという箇所。Rubyの文法の柔軟性をうまく利用して読みやすいコードになっていた。RakeなんかもDSLにRubyをそのまま採用しているんだよな。リフレクション系は、自分でやるとなるとかどうかは悩みどころではあるのだが、Rubyの文法のポテンシャルの高さが分かった。

プログラミングの技術の習得というのは、文法を理解したあと、ひたすら他人のコードを読むことでしか身につかないんだけど、この本を読めば、Rubyの習得に関しては、随分ショートカットできると思う。プログラミングって、こういう細かいことが重要だと思うんだよね。小さい問題を解決していくと、大きな問題が見えるというか、逆に設計から考えていっても、最初はどうでもいいと思って無視していたところで、必ず躓くからね、しかも致命的に。「神は細部に宿る」ですよ。よくわからんけど。

0 件のコメント: