(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

Effective Ruby 読んだ

最高に面白かった。軽く紹介したいと思う。

結論から書くと掛け値なしに良い本でした。 Rails 書く人は Railser と揶揄されがちですが、 Rails を普段書いてるけど Ruby はよく分からんという人にもオススメです(無粋なツッコミする人がいるので少し補足すると、 Rails を使っていると Rails が基本的な泥臭い仕事はやってくれるのでメタプログラミングや継承階層の仕組みについてめちゃくちゃ明るくある必要がないんです( IMO だし、知ってるに越したことはないけど)。例えばメソッドフック的なことだって before_action メソッドが肩代わりしてくれるので、そのような仕組みを自分で作る機会はグッと減ります。となると、そういうことをしたいときに Ruby はどう動いててどういう仕組みでそういうことを出来るのか、ということに思いを馳せる機会は減ると思います。そういう意味で「 Ruby はよく分からない」という表現を使っています。別に Railser だから Ruby を知る必要がないと言っているつもりはないし、 Railser だからどうというつもりもないですけど、そこの表現だけを抜き取って無粋な解釈するのはやめていただきたく)

購入動機

パーフェクト JavaScript と似たようなもんだけど、仕事柄レビューをする機会がとても多い割に自分に対して周りからのフィードバックが少ないため、自分の書いている Ruby(Rails) に改善余地があるかを知りたかった。また、実践的かつ効率的な Ruby の書き方やノウハウを知ることが出来ることを期待した。

まぁ Effective シリーズ Ruby 版ということで期待は大でした。 Ruby Under a Microscope の方も気になったけど、レビューおじさん業に今すぐ活かせる知識欲しいということで Effective Ruby でした。

中身の話

章立てはこんな感じ。

第1章 Rubyに身体を慣らす
第2章 クラス、オブジェクト、モジュール
第3章 コレクション
第4章 例外
第5章 メタプログラミング
第6章 テスト
第7章 ツールとライブラリ
第8章 メモリ管理とパフォーマンス

個人の興味とか趣味の範囲で言うなら、メタプログラミングとテストの章は驚きは少なかったかなと。メタプログラミングに関しては既にある "メタプログラミング Ruby" にテストの話は RSpec なら結構書籍もあるのでそちらに求める方が良さそうという印象でした。ああ、けど本書でのテストは MiniTest 使ってるので、そちらに興味があるのなら良いと思います。

本書はサブタイトルにあるように全部で 48 項目から成っています。というわけで、興味深かった項目をちょろっと紹介したいと思います。

  • 項目 7: super のふるまいがひと通りではないことに注意しよう

super はメソッドのように使われ、そのようにふるまうが、実際には Ruby 言語のキーワードである。
Effective Ruby p25.

この一行に「えええええええ」って思ったのは僕です。いや、正確には意識したことなかったけれど。
keywords - Documentation for Ruby 2.2.0
「意識したことない」というのは良いのか悪いのか分からないけど、やっぱり Railser なんだろう。あとはモジュールをインクルードしてると super はそっちを呼びに行きかねないとか。
super を呼び出したら結果として method_missing にたどり着く可能性があるとか、なんでもありかって思った。

  • 項目 12: さまざまな等値の違いを理解しよう

今参画しているプロジェクトの中に "==" を再定義しちゃってるのあって、あちゃーって思ってたんだけど正しい定義の仕方について書いてあったから参考にしたい。
そういえば、 Ruby が左右の被演算子が交換法則を満たさないって言われてみれば感凄くあって、意識してなかったからこわって思ったとか思わなかったとか。

  • 項目 13: "<=>" と Comparable モジュールで比較を実装しよう

項目 12 で述べてあることの続きみたいなもんだけど、結構お手軽に定義出来るのでとてもよいです。

これも知らなかった。 Array メソッドめっちゃ便利やん!!ってなったので、積極的に使う機会探して行きたい。 nil を空の配列に変換したいーってとき、だいたい foo || [] みたいな書き方して nil を避ける感じだったから Array メソッドで統一的に配列作れるならやるしかない感じ。

  • 項目 21: コレクションクラスからの継承よりも委譲を使うようにしよう

これは驚いた。 Java だと継承/実装しようってノリになる気がするけど、 Ruby はそれじゃダメだから委譲を使おう!!みたいな感じ。しかも Forwardable とか使えば簡単に委譲出来るのとても良い。

  • 項目 27: スコープから飛び出したいときは raise ではなく throw を使おう

スコープから抜け出したいとか飛び出したいっていうシーンがあまり思い浮かばないから、 raise で出ようって思ったこともないんだけど raise より throw 使おうねって言われて、あ、はいという感じです。

  • 項目 30: method_missing ではなく define_method を使うようにしよう

これ、この項目が読む前から凄く気になってた。最終的に method_missing そんなに美味しくないよっていう感じで define_method を使うパターンを提示してくれた。
method_missing 使ったことは個人的にない気がするけど、気をつけたいですね。

  • 項目 31: eval の多様な変種間の違いを把握しよう

この辺は業務でも実際に多様されてるので分かってたつもりだけど、特異メソッドという言葉とちゃんと意味が紐付いてよかった。

  • 項目 39: 効果的なテストを追求しよう

ハッピーパステストを防ぐことを中心に効果的なテストというのを話している。ファズテストとプロパティテストは知らなかったので後日調べていきたいかな。

  • 項目 41: irb の高度な機能を使えるようになろう

irb そんな凄かったんや!!って思った。いや、僕が Rails 触ったときにはもう pry があったんや… irb なんていらない子だと思ってたんだ…。
結構地味に機能持ってるらしいので、気が向いたら設定とかいじってみたいと思ったけど、 pry で十分だなーとか思ったとか思ってないとか。

  • 項目 47: ループ内ではオブジェクトリテラルを避けよう

これ本当に意識したことなかった。良くないですね。よく書いちゃってる気がするので明日から直していきたい。

とざっくり適当に幾つかの項に関して書いたけど、全然他の項目も良かった。

感想

こんな記事を書いてもう 1 年近くが経過したにも関わらず、未だに自分が知らなかったことが沢山あったので驚きを隠せない感じです。ずっと「おお、 Ruby キモイな」って呟きながら読んでました。結果として満足でき、この本を買う価値はあったようです。

メタプログラミング Ruby 読んだけど、完全に内容忘れてるみたいで、特異クラスが挟まれる話とか全然覚えてなかったんだけど、 Effective Ruby で特異クラス/メソッドについてもちゃんと解説してあるので、メタプログラミングあんまりよく分からないって人でも読めると思う。
Perl 風構文書くなとか、 Hash のデフォルト値設定するの地味に効果的だよとか、 Array と Set は走査に O(n) と O(log n) の違いがあるから Set で良さそうなときは Set 使おうとか、コアライブラリのこともたまには思い出してあげてくださいとか、そういう話も沢山載ってていいです。

それから Ruby は 2.1 くらいまででだいたい書かれているので、ほぼほぼ最新の機能あたりもフォーカスして話が書いてあるのでナウいですね。モンキーパッチを使わない方法を書いてるとことか、パフォーマンス系のツールの話しているときは特に Ruby 2.0 以上で話が進みますね。この辺はこの書籍の中で今後時間が経つほど価値が薄くなるところなのかなと思ってるので、今が買いどきというかそんな感じがします。

ああ、本文もすらすら読めるし、翻訳の違和感とかはそんなに感じなかったです。結構、表現が面白くて笑ったけど。

というわけで読みましょう、 Effective Ruby

Effective Ruby

Effective Ruby