『メタプログラミング Ruby 第 2 版』を読んだ

数週間前になりますが『メタプログラミング Ruby 第 2 版』を読みました。

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

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

Ruby でのメタプログラミング技術がわかるのはもちろん、Ruby 自体の動作原理の理解にもつながる、とても有用な本だと思ったので、書評を書いておきます。

概要

この本は 2 部構成になっています。

I 部では、Ruby でのメタプログラミング技術について、同僚プログラマとの対話という形式で解説しています。

II 部では、I 部で紹介された技術をもとに、Rails の内部でどのようにメタプログラミングが利用されているかを解説しています。

I 部「メタプログラミング Ruby」

I 部を読むことで、メタプログラミングについて理解が進むとともに、関連する Ruby の言語機能(クラス、メソッドなど)の仕組みが深く理解できます。また、メタプログラミングを使う前と後のコード例を示しながら、その効果が説明されています。これにより、メタプログラミングの有効性が腑に落ちやすいです。

個人的に参考になった部分について、キーワードを列挙しておきます。

  • オブジェクトモデル
    • オブジェクト、クラス、モジュール、特異クラスの関係性
    • メソッド探索
      • 右に行って上に登る
    • Refinements
  • メソッド
    • 動的メソッド (define_method) とゴーストメソッド (method_missing) の利点欠点
    • ブランクスレート (BasicObject) の使いかた
  • ブロック
    • スコープのフラット化
    • eval 族 (instance_eval, class_eval, etc.)
    • Proc と lambda の違い
  • フックメソッド (Module#included) を使ったクラスメソッドの定義

II 部「Rails におけるメタプログラミング」

II 部では、Rails の中で使われているメタプログラミング技術について、実際の例を通じて解説しています。例として利用されているのは以下の機能です。

  • ActiveRecord
  • ActiveSupport::Concern
  • alias_method_chain
  • アトリビュートメソッド

メタプログラミングは徐々に複雑になるソフトウェアの設計を最適なものにするための道具として有用みたいです。例えば、クラスへインスタンスメソッドとクラスメソッドの両方を取り込むために、includeextend によるトリックを使っていた部分が include の連鎖などで複雑化してしまったとき、より DRY にするために ActiveSupport::Concern を導入したそうです。

逆に言うと、最初からあまり凝ったことをしてしまうと可読性を落とすだけという結果になりそうなわけですが、その点についても以下のように言及されています。

“私がコードを書くときは、最初から完璧な設計は目指さない。
必要になるまで複雑なメタプログラミングの魔術は使わない。
コードをシンプルに保ち、その仕事を成し遂げるための最も明白な技法を使う。
おそらくある時点から、コードが複雑になったり、排除しにくい重複が見つかったりするだろう。
メタプログラミングのような切れ味の鋭いツールに手を伸ばすのはそのときだ。”

感想

13 章の章タイトルとなっている「メタプログラミングはただのプログラミング」の言葉通り、Ruby という言語では、コードを書くときに自然にメタプログラミングとされる技術に触れることになります。よって、それらに対する知識をつけておいたほうが、Ruby らしい、可読性が高くメンテしやすいコードを書けるようになるでしょう。そのためにも『メタプログラミング Ruby』は役立つと思いました。

余談ですが、この本では、includeprepend での継承チェーンへのオブジェクト挿入や、特異クラスの話など、オブジェクトモデルについての話が多くあります。その点で、Ruby の内部動作について解説した本である『Ruby のしくみ』とも少し関連する内容となっていると思います。

『Ruby のしくみ』は Ruby の内部(C の構造体)や YARV のコードも含めた解説になっているので、『メタプログラミング Ruby』よりも詳細に踏み込んでいるといえます。ですので、Ruby の内部動作について知りたい場合は、『メタプログラミング Ruby』→『Ruby のしくみ』の順番で読めば、だんだんブレイクダウンしていく感じになり、理解しやすいのではと思いました。私は逆の順で読みましたが……

というわけで、普段のプログラミングに使える技術と Ruby の動作の両方を知ることができる『メタプログラミング Ruby 第2版』はおすすめです。