「メタプログラミング 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」での発表内容は今後も定期的に紹介していくので、是非メドレーブログをチェックしてみてください。
お知らせ
メドレーでは医療業界に存在する課題に IT を駆使して取り組んでいきたいデザイナー・エンジニアを募集中です。
皆さまからのご応募お待ちしております。
www.medley.jpwww.medley.jp