トップ «前の日記(2010-08-23) 最新 次の日記(2010-08-26)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2010-08-24

_ 迷宮のRuby

角さんから『メタプログラミングRuby』を頂いた(レビューに参加したから)ので、紹介します。

著者はPaolo Perrotta(どうでも良いけど、ペロッタって、日本語の語感としては相当ユーモラスな気がするのだけど。ペロッタが居るならばグリッタが居てもおかしかないし、二人合わせてペロッタとグリッタとか)というイタリアで彼女と猫と暮らしている人らしい。

で、題名の通り、本書はRubyでメタプログラミングするための方法を説明したものです。したがって、Rubyのクラスとオブジェクトとメソッドとあれやこれやがどういうつながりになっていて、何を使えば何が起きるかがいろいろ書いてある本です。

が、この本はいろいろ仕掛けがしてあって、そこがうまい。うまいというのは、読みやすく、わかりやすく、おもしろい、という意味。角さんの翻訳がうまい具合にくだけていて日本語としてもリズミカルで良い感じだというのがそれに大きく貢献している。

全体は1つの大きな物語からできている。

アノニマスな「あなた」はある会社に雇われたRubyプログラマだ。

そこにはビルがいた。

ビルはメンターにして相棒(ペアプログラミングするので文字通り)で、教えたがりで、変なやつだ。

この会社にはレガシーなRubyコードがあり、それはレガシーなコーディング、つまり非メタプログラミングでコードされている。メタプログラミングを使わないコードというのは冗長だ。したがって保守しにくい。「あなた」のミッションはビルと一緒に、そいつをいかしたコードに直していくことだ。

さらに、これまたアノニマスな上司というのがいる。どういう上司かというと(P.133)

「動くじゃない。いいわね。」上司が認めてくれた。しかし、彼女は、トップレベルのスコープにmonthly_sales()メソッドや変数target_salesなどが散らばっているのが気に入らないらしい。「こんな感じのDSLになるといいのだけど。」上司はそういってキーボードに手をかけて、猛烈にコードを書き始めた。

3.7. クイズ:より良いDSL

上司がRedFlag DSLにsetup命令を追加するよう依頼してきた。

event "空が落ちてくる" do

  @sky_height < 300

end

event "空が近づいてくる" do

  @sky_height < @mountains_height

end

setup do

  puts "空の高さを設定"

  @sky_height = 100

end

setup do

  puts "山の高さを設定"

  @mountain_height = 200

end

新しいDSLではeventとsetupを自由に組み合わせられる。これまでどおりにeventを実行するが、直接にsetupを実行する。上記のテストファイルでredflag.rbを実行すると以下が出力される。

(略)

3.7.1 ビルの逃亡

(略)

というように、その場で仕様(いきなり山のほうが空より高い)を例示してクイズを出して逃げていく上司なのだ(この箇所では)。さらに、この回ではビルまで逃げ出していく。Javaholics Anonymousクラブでディナーを取ることになっているからだ。

そこで、「あなた」は自分でクイズを解かなければならない。つまり、上のsetupだのeventだのを実装することになる。

で、(もちろん、読者はここで自分の解決策を作るべきだが)、解答案が提示され、どのような仕組みで実現したかが説明される。すると、

頭のなかでビルの声が響いている。まるでオビ=ワン・ケノービのようだ。「トップレベルのインスタンス変数@eventsと@setupsは変装したグローバル変数のようなもんだ。どうして排除しない?」

●もっと良いDSL

グローバル変数(と頭のなかのビルの声)を排除するには、「共有スコープ(119)」を使う。

(コード)

というように、リファクタリングフェーズとなる。(119)というのは、そのテクニック(魔術と呼ばれる)が説明されたページだ。

このような魔術は、全部で34個あって、付録C『魔術書』にまとめられている。

というように、ある日が始まり、ビルと二人で提示された問題を眺め(ビルが提示する場合もある。たとえば――「C#にもすばらしい機能があったのは事実だ。……「usingってカッコいいよね!」ビルが大声でいう。あなたは同意してうなずく。「じゃあ、usingのRubyバージョンを書いてみてよ」彼はそう言って、ニヤニヤ笑っている。そしてテストケースを見せてくれた。p.109――ここでもテストケースがあることに注目したいところ)、ビルがその問題を解くために必要となるRubyの仕組みを解説し、そしてコードがあり、会話があり、またコードという具合だ。

この紹介で本書の雰囲気はわかってもらえただろうか?

これはプログラミングの本であり、技術解説書であり、(ジョエルの本やポールグレアムの本のような)ハッカースタイルのユーモアにくるまれたソフトウェア開発の一つのあるべき環境の提示である。つまり、おもしろい。

メタプログラミングRuby(Paolo Perrotta/角征典)

RubyKaigiに行くのならあせってクリックしなくとも、28(土)の12:00からサイン販売会があるのでそこで買うのも良いかも(隣になぜかおれもいる)。

これ書いている時点では書影がなくてつまらないので、おまけ。

M.C.エッシャー CONTRAST [DVD]


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|

ジェズイットを見習え