トップ «前の日記(2014-11-15) 最新 次の日記(2014-11-23)» 編集

日々の破片

著作一覧

2014-11-20

_ Effective Ruby

早くもアマゾンに書影が出ているので、広告します。

来年早々に、翔泳社からピーター・J・ジョーンズ(僕は知らない人なんですが)のEffective Rubyの翻訳が出ます。

翻訳は安定と安心のロングテール長尾さん、僕が監訳しています。

当然、全部読んだのですが、これは相当お勧めです。

Effective Ruby(Peter J. Jones)

Effectiveと銘うっているだけに、どう使うべきか、どう使うべきでないか、といったことが大雑把な章立ての下に並んでいます。コードはほとんどが断片(irbを使って動かせるようにはなっている。当然、僕は全部試したけど(2.1と2.2プレビュー)。とはいえ、最後のほうではpryを使えと言い出しますが、基本はRubyのコア、添付ライブラリが優先)で、試せるようになっています。

ただ、特にテストの章がおもしろいので実際に打ち込んで(当然irbというわけには行かないので独立したファイルにするわけで、ここで原著から逸脱する)みると、行数節約のためだと思うけど自明な元クラスの読み込みとかを省略していたりして当然動かないので、そのへんは気持ちとして訳注で補ったりしました(が、そういうのがすべて残るかどうかは紙数の関係があるので別問題)。

最初の章が「Rubyに身体を慣らす」と題してRubyっぽい、でも慣れないと驚き最大の法則みたいな点で肩慣らし。まずはCを知っているほどひっかかるtrueについて。0はfalseではない問題(問題ではなく仕様だけど)ですね。そして、Perlを知っていれば余裕なところをやめろと切り捨てる。といった感じ。

2章がクラス、モジュール、オブジェクト。書き方がこなれているからか、Rubyの特異な特異点もみんなが使い始めて15年、その前合わせて20年以上の歴史があるからか、やたらとわかりやすいです。

この章を読んでStructが好きになった。あと、僕は@@大好きなんだけど、@@ではなくクラスのインスタンス変数を使うべきと説得されました。

3章はコレクション。著者はreduce(injectは好きではないらしい)がとにかく好きらしいのだけど、いろいろ参考になった。その他ハッシュのデフォルト値とか、いろいろためになる良い章。

4章は例外。さすがにここはおれにはいらないなぁとか読んでいたけど、raiseではなくthrowを使うというのは、知らなかった。

5章がメタプログラミング。

とにかく著者はevalが大嫌いで、いかにevalやmethod_missingせずにメタプログラミングするかを説明してくれる。prependとか最近のメソッドについても参考になる。この章はメタプログラミングRubyとは違った意味で良い章だった。

6章がテスト。おれはtest/unitで止まっているので、なかなか参考になる。この章をチェックしているまさにその時に、ククログにRubyのテスティングフレームワークの歴史(2014年版)(直しました。ありがとうございます。)が掲載されたので参考になりました。ククログありがとう。

この章はどこまでカタカナにしてどこまでを漢字+カタカナ(単体テストか、ユニットテストか、ユニットテスティングか、といったこと)、どこまでテスティングとしてどこまでをテストとするか、と監訳し甲斐があるというか、なかなか難しい章でもある(読者にはあまり関係ない)。基本、アジャイル文脈までのテストはテスティングとカタカナと切り分けてみたけど、それでも文句がある人は文句あるんだろうなぁとかは思います。

7章がツールとライブラリ。rdocはともかく、bundleとgemのバージョン指定とか、寝っ転がって読める書籍で要領よく説明してあるので良いと思った。というか、参考になった。

8章がメモリ管理とパフォーマンス。プロファイラの使い方(種類と)が重要だけど、2.1のGC制御変数の使い方も興味深い(2.2のエデンを管理する変数は現時点ではないみたいなので、しばらくは現役で使えると思う、今の時点では)。あとはメモ化とかループ内リテラルの重さとか、知っていればお得な情報とか。

特にプロファイラの項はたかだか7ページ(Effectiveシリーズっぽく、1項あたりは短い)だけど要領よく書いてあるので、実際に書いてある通りに試して起動方法と見方さえ覚えれば後は応用できると思うし、実際に利用すべきなので良い項だと思います。

その他。

著者はわりと昔ながらのOOPの人っぽくて、すぐにオブジェクトへメッセージを送るんだけど、ここはちょっと考えた。でもオブジェクトのメソッドを呼び出すとせずに、気分として著者がメッセージを送ると感じたところをメッセージパッシングとして書いているのだろうから、そこは全部生かしています。ここも人によっては文句あるだろうなぁとは思いますが原著者の意思尊重。

一方、原著者の好みらしい言い回しが2個ほど出てくるのだけど(具体例は書かないけど、たとえば日本語の「ここはラインマーカーだ」みたいな文)それは普通の言い回しに変えました(上の例だと「ここは重要だ」みたいに)。

というわけで、結構Rubyを使ってわかっているつもりでも知らない(Structを使わなくても困らないから使っていなかったけど、なるほど確かに使ったほうが良い点が多いといったことを学べるとか。同様なことはコレクションの章にも強く言える)ことが見つかったり、reduceとか(今風な名前)実に参考になりました。しかも読んでいておもしろかった。1項あたりの短さから来る読ませるテンポが良いみたいです(長尾さんの訳に対する好き嫌いってのもあるだろうからそこは個人差はあるだろうけど)。

お勧めします。

追記:この著者はevalが嫌いなだけでなく、モンキーパッチも大嫌いらしく、いかにフックを使うかとかエイリアスメソッドチェインを使うかを力説していて、これもきっとEffectiveだと思います。だいたいMacOSのジャンプテーブルのパッチのことを書いたりしているから、著者は相当なベテランっぽい。というわけで、Refinements一押しだったりして、なるほどRefinementsはこう使うのかとわかったり(僕はモンキーパッチ+オープンクラス大好きだからね)。

本日のツッコミ(全1件) [ツッコミを入れる]
_ kou (2014-11-22 15:36)

ククログの記事のURLは http://www.clear-code.com/blog/2014/11/6.html の方がより長くアクセスできるURLです!


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|12|

ジェズイットを見習え