『オブジェクト指向設計実践ガイド』を読んだ

概要

オブジェクト指向設計実践ガイド』を冬休みの課題図書として読み始め、なんやかんやで先日ようやく読み終わったので、その感想を記します。

ざっくりいうと、Rubyを使ったプログラミングの設計の一つのプラクティスについて書かれた本です。訳者あとがきにも

オブジェクト指向設計にまつわる知識はまだまだあります。原則、パターン、手法にしても、本書で紹介されているものは一部です。また、実践も到底足りるものではありません。

と記されており、オブジェクト指向設計の奥深さに軽いめまいを覚えましたが全体的に面白く読めました。

すごく納得できたところ

個人的には、「第3章 依存関係を管理する」でいわゆるDependency injection(依存性の注入)が納得できました。

はじめてDependency injectionという言葉に触れてから8年。ようやく理解できました。

また、「第6章 継承に依って振る舞いを獲得する」はsuperをやたらと書いてしまうコード(P170からの記述)も工夫次第で結合度を減らせるということを学びました。

よく分からなかったところ

「第4章 柔軟なインターフェースをつくる」に書かれている「デメテルの法則」に関する部分(P111から)は結局何が言いたいのかが理解できませんでした。法則と仰々しい名前がついているので「絶対に守らなきゃ」って話ではないってことは分かったのですが、で?って感じを覚えました。

ポジショントーク

ちょっと同意しにくいところはP135から書かれている「静的型付けと動的型付け」の記述です。特にP138に書かれている

動的型付けは、コンパイル時の型検査、つまり、コストが高い割にわずかな価値しか得られない深刻な制約を、コンパイル/ make サイクルを取り除くことによって得られる莫大な効率性と交換してくれます。この交換は破格です。しない手はありません。

という記述は、たしかにコンパイル時の型検査がすべての型チェックをカバーするっていうように信じるのはどうかと思うけど、それにしても言いすぎじゃないかなと引っかかりました。本書の最後に出てくる「9.5 ダックタイプをテストする」(P270)は静的型付けならコンパイラチェックだけでOKなのでは?と思ったりしました。

Rubyを題材に選んでいるためこういう書き方になっているように思うのですが、ちょっと要注意かなと。

ちょっと古い

原著は「Practical Object-Oriented Design in Ruby」という本で、2012年に出た本です。

Practical Object-Oriented Design in Ruby: An Agile Primer (Addison-Wesley Professional Ruby)

Practical Object-Oriented Design in Ruby: An Agile Primer (Addison-Wesley Professional Ruby)

そういうところで、記述がちょっと古いところがあります。自分が見つけたのは、

  • 「初期化の際の引数にハッシュを使う」(P73)については、Ruby 2.0からはキーワード引数がある(訳注に記載あり)
  • MiniTestを使ったテストがMiniTest::Unit::TestCaseを使っている。今はMinitest::Test(P249に記載あり)

ぐらいです。訳注も書かれているので引っかかることは少ないかなと思います。

まとめ

最初はRubyだけじゃなくJavaなどのオブジェクト指向言語一般的に使えるかなと思って読み進めましたが、思ったよりもRubyがベースになっていました。ということで、Rubyエンジニアは勉強になる一冊かなと思います。