トップ «前の日記(2015-09-30) 最新 次の日記(2015-10-08)» 編集

日々の破片

著作一覧

2015-10-07

_ メタプログラミングRuby 第2版

オライリーからメタプログラミングRuby 第2版をいただいた。どうもありがとうございます。

本書の初版はアスキーから出ていたが、ドワンゴへの移動やらなにやらの前の微妙な時期に第2版が出たのでオライリーに翻訳権が移動したらしい。出版社は変わったが、訳者は同じく角さん(というかkdmsnr)。

ざっと見たが、初版とえらく雰囲気が異なる。

章立てはほぼ同じなのだが、初版の特徴だった、「あなた」とビル(先輩というかメンターというか)が、課題に出会い、メタプログラミングでうまく処理するというユースケースドリブンな筋立てというか、仕事ハッキングライフスケッチみたいな雰囲気は薄まっているように思う。どうも物理的に行間が詰まっているせいで、読み物っぽさが薄まったように感じるみたいだ。

その分、よりプログラミングの本らしくなっている(行間が詰まった分だけ本の厚みも減っている)。

訳語では、属性がアトリビュートとカタカナに変わったのが一番目立つ(目次レベルで変わるからだ)。

第2部のRailsは章立てからガラリと変わっていて、

初版は

・第7章 ActiveRecordの設計

・第8章 ActiveRecordの中身

・第9章 安全なメタプログラミング

・モンキーパッチを防ぐ

だったのが第2版では

・8章(「第」が取れている)Railsツアーの準備

・9章 Active Recordの設計

・10章 Active SupportのConcernモジュール

・11章 alias_method_chainの盛衰

・12章 アトリビュートメソッドの進化

・13章 最後の教訓

と変わった。

9章にあった「モンキーパッチ」対策はどこへ行ったの? と思うと、2章の「モンキーパッチは悪いこと?」という囲み記事の違いを読んだ時点で明らかになる。

初版の該当囲み記事は

モンキーパッチを管理する防御的な技術については、「9.2 モンキーパッチを防ぐ」で触れる。

なわけだが、第2版では

本書では、至るところでモンキーパッチの代替案を目にすることになる。このあとすぐに説明するが、Refinementsを使えば、モンキーパッチが安全に使えるようになる。ただし、(後略)

というわけで、Ruby 2.xにあわせてrefinementされているのが大きい。

それにしても本文も相当ブラッシュアップされている。

初版でモンキーパッチの代わりに特異メソッドを利用する箇所は

「Stringクラスにモンキーパッチして、title?()メソッドを追加するのはどうですか?」あなたが提案する。「それもダメだな」と、ビルが答える。「このメソッドは文字列が段落のときにしか使えない。その他の文字列にとっては無意味なんだ。あーどうしよう!」

同僚が悩んでいるのは辛い。こんなときは行動あるのみ。Googleで検索したところ、数分で解決策が見つかった。(P.150)

なのが、第2版では

「Stringクラスにモンキーパッチして、title?()メソッドを追加するのはどうですか?」あなたが提案する。「それもダメだな」と、ビルが答える。「このメソッドは文字列が段落のときにしか使えない。その他の文字列にとっては無意味だ」。

ビルはRefinementsでStringクラスにパッチを当てようとしているが、あなたはGoogleで解決策を探そうと決めた。(P.118)

となっている。

ビルは「あーどうしよう!(モンキーパッチは嫌いだし、このメソッドには意味的にあまり適合もしない)」と言う代わりにさっさとRefinementsしようとし出すわけだ(でも、この後、「あなた」にGoogleが教えてくれた特異メソッドを使うことになる)。

というわけで、既にRuby2.x時代なのだから、1.8時代のテクニック集だった初版を持っていても買い直す価値はあると思う(特にRailsユーザーであれば買い直すべきだろう)。

まつもとさんの序文は同じだが、何度読んでも「Rubyは君を信頼する」というのは良い言葉だ。

メタプログラミングRuby 第2版(Paolo Perrotta)

いずれにしてもこの本は、とても簡潔かつシンプルに、どういう場合にメタプログラミングを使うべきで、そのためにはどのような考え方でプログラミング言語の機能を生かすのかが、実にうまく書かれている。

デザインパターンを頭に入れておくことで、考え方の再考えが不要になるように、本書の内容を頭に入れておけば、プログラムの作り方をパターン化しやすくなる。

これは本当に重要なことなのだ。

メタプログラミングと言わないまでも、手続き型言語をうまく使うには、手続きをそのままプログラミングするのではなく、

・手続きに共通のものがあれば関数に括り出してパラメータを変えて再利用

・より大きな流れが共通であればクラスベースでテンプレートメソッドパターンを使う

・または、大枠を処理するメソッドに対して関数パラメータを与えて個別処理をさせる

・おれは細かなクラスを配列化してチェインオブレスポンシビリティを適用するのが好きだな

といった方法を取ることで格段にプログラムが読みやすくなり(コードの総量が減り、相違点のみが強調されるからだ)、書きやすくなり(パターン化されるからだ)、修正しやすくなる(読みやすくなるのと同じ理由)。

メタプログラミングは、そのような手続きの抽象化をより楽にする技法で、手続き型言語でのプログラミングには必須のものだ。

というわけで、強くお勧めする。

別にプログラミング言語としてRubyを直接使わなくても問題ない。

メタプログラミングの考え方を具体的に学べる一番読みやすい書籍としてもお勧めできるからだ。


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|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|

ジェズイットを見習え