「メタプログラミングRuby」ことはじめ〜開発本部・TechLunch〜
医療介護の求人サイト「ジョブメドレー」の開発を担当している後藤です。
メドレー開発本部にて隔週で行われている勉強会(TechLunch)でメタプログラミングRubyをベースにメタプログラミングRuby入門について発表したのでその一部を紹介したいと思います。
メドレーとRuby
弊社では「CLINICS」、「ジョブメドレー」、「介護のほんね」と複数のプロダクトでRuby on Rails を利用しています。
スタートアップでそこまでエンジニアの数が多くないなか、エンジニアが最大限にプロダクトにコミットするために、もともとのバックグラウンドがフロントエンドエンジニアだったり、ネイティブアプリエンジニアだったりする方もRuby on Railsのコードを書いています。
Ruby on Railsはとても便利なフレームワークで、周辺の便利なライブラリや解説記事が整っていることもあり、必要な機能は検索すればあまり中身を理解せずとも実装できてしまったりもします。ただ、何か問題があった時のために利用しているフレームワークの処理を把握しておくことはとても重要です。そして、フレームワークのソースコードを読み解くにはやはりRubyの言語仕様の知識が重要になってきます。
また、Rubyの言語仕様、そして使っているフレームワークの深い理解があることでよりメンテナンスしやすい設計・実装がしやすくなるのも事実だと思います。
こういった背景のもと、社内のエンジニアのRubyに対する知見を深めることはとても価値があると感じ、「メタプログラミングRuby」をベースにメタプログラミングRuby入門の勉強会を開催しました。
メタプログラミングRuby入門
今回はメタプログラミング入門ということでRubyでメタプログラミングをする上で必要なRubyの言語仕様の話と一つの例としてmethod_missingの話を取り上げました。
Rubyのオブジェクトモデル
このRubyのオブジェクトモデルという言葉は「メタプログラミングRuby」から拝借しています。本の中では「このメソッドはどのクラスに所属するものなのか?」「このモジュールをインクルードしたら何が起きるのか」といった質問の答えが見つかる場所と記載しています。このオブジェクトモデルには以下のようなルールが存在します。
- オブジェクトは1種類しかない。それが通常のオブジェクトかモジュールになる。
- モジュールは1種類しかない。それが通常のモジュール、クラス、特異クラスのいずれかになる。
- メソッドは1種類しかない。メソッドはモジュール(大半はクラス)に住んでいる。
- すべてのオブジェクトは(クラスも含めて)「本物のクラス」を持っている。それが通常のクラスか特異クラスである。
- すべてのクラスは(BasicObjectを除いて)ひとつの祖先(スーパークラスかモジュール)を持っている。つまり、あらゆるクラスがBasicObjectに向かって1本の継承チェーンを持っている。
- オブジェクトの特異クラスのスーパークラスは、オブジェクトのクラスである。クラスの特異クラスのスーパークラスはクラスのスーパークラスの特異クラスである。
- メソッドを呼び出すときは、Rubyはレシーバの本物のクラスに向かって「右へ」進み、継承チェーンを「上へ」進む。Rubyのメソッド探索について知るべきことは以上だ。
(メタプログラミングRuby第2版 より)
BasicObject#method_missing
Rubyでメソッド呼び出しを行った際のフローは以下になります。
- Rubyはレシーバーの本物のクラスに向かってメソッド探索を始める
- 継承チェーンをBasicObjectまで辿っても呼び出したメソッドが見つからなかった場合、Rubyはレシーバーのmethod_missingを呼び出す
- メソッド探索でmethod_missingが見つからなかった場合、BasicObject#method_missingが呼び出され、例外が投げられる
この仕組みをうまく使って、BasicObject#method_missingが呼び出される前に自前のmethod_missingメソッドを呼び出すようにして動的にメソッドを定義したり動的な振る舞いをオブジェクトに加えたりすることができるのです。
勉強会の様子
ここまでお話しした内容を含め、勉強会では以下の内容を発表しました。
発表資料はこちら
発表時の個人的な裏テーマとして「あまりRubyが得意でない方にメタプログラミングRubyを読みたくなるようにさせる」というものを設定していましたが、実際の発表後にちらほらメタプログラミングRubyの話が出ていたので発表した甲斐がありました。
まとめ
今回はメドレー開発本部の技術勉強会(TechLunch)で発表した内容を紹介しました。
勉強会では、まずRubyの言語要素とメソッド実行の理解を深め、その上でBasicObject#method_missingを理解し、それを使ったgemのコードを読み進めました。
実際にRubyでのメタプログラミングに触れることでRubyへの知見が深めていけたかと思います。 メドレー開発本部で実施している「TechLunch」での発表内容は今後も定期的に紹介していくので、是非メドレーブログをチェックしてみてください。
求人
メドレーではエンジニアを積極採用しています! ご興味のある方、ぜひご応募ください。お待ちしています。