メタプログラミングRuby
メタプログラミングRuby 第2版 | Paolo Perrotta, 角 征典 |本 | 通販 | Amazon
なぜ読む
最近RubyやRailsを改めて学び直している中でメタプログラミングRuby第二版を結構昔に買ってから積読になってたのを思い出したので。
どんな本
RubyのモジュールやClassの継承関係/method_missing系の話/ブロックやスコープの話/動的クラス&特異メソッド系の話/eval系の話などがざっくりと全体の60%くらいかけて解説されてる。上司のボブと部下がRubyでシステムを組んでいく中でRubyの黒魔術を学んでいくスタイル。
後半はここまでで学んだ知識を元にRailsのソースコード(とりわけActiveRecord)でどのようにこれらの技術が使われているのかを学ぶ。
最後の付録にはいわゆる黒魔術と言われる技術の名称がシンプルにまとめられいる(後から参照するのに便利)。
ちなみにRuby2/Rails4までの情報という点には注意が必要
感想
第1部の座学のパートは基本といえば基本なので復習がてらサクサク読んだ。最近はTypeScriptやRustなど型がありカチッとした言語ばかり触っていたのでなんでもアリな自由さに新鮮味を感じた。
evalやmethod_missingや動的定義系は案外業務のコードでは使わないからアレだけど、クラスやモジュールの継承関係やmixinによる影響なんかは普通に黒魔術でもなんでもなく理解してないとまずいやつなので復習できてよかった。
そういやconcernsももちろん解説されてたんだけど、あれ今Railsで開発してても使い所難しいな〜と思ってる。我々はConcernsとどう向き合うか - おもしろwebサービス開発日記に書かれてる通りなんとなくロジックを外だしする場所に使われがちでいつの間にか色んなところでincludeされまくったControllerとか結構ありがちでカオスになってたりする。
https://techracho.bpsinc.jp/hachi8833/2023_01_12/124378
37signalsではむしろconcernsに外出ししまくってるらしい。リッチなドメインモデル。
第2部のRailsのソースコードを読む章ではアトリビュート(atrr_accessorとかのあれ)がRails1からRails4に至るまででどのように拡張されてきたかを解説するパートがあり、ここが結構面白かった。最初は数十行のシンプルな実装だったものがさまざまなコーナーケースに対処するためにアーキテクチャを変え実装コードを増やしバリデーションも増やしといった感じでどんどん肥大化していく。あるあるではあるが今はどうなってるんだ...と気になった。
最初からコーナーケースまで考慮した完璧な実装をするのは難しい。だからシンプルな実装から始めるのはよくあることだ。Rubyにはその際にシンプルな実装を複雑な要件を満たすための実装へ変えていく作業を柔軟にこなせる力がある、と書かれていた。
が、まぁ個人的には今となってはそういうアーキテクチャを変えるようなリファクタリングは静的型のある言語で書かれたコードの方が変な副作用とか漏れが発生しにくくて楽じゃない..?と思うんだけど、まぁコード量を減らせるとかDRYみたいな美学を重視したい観点からみると気持ちはわかる。
そういえば最後の付録Cにある魔術書でゴーストメソッドとかRubyあるあるの専門用語がまとめられてて初学者の人には便利そうだな〜と思った。
関連
Ruby on Rails API
我々はConcernsとどう向き合うか - おもしろwebサービス開発日記
読書メモ