もっと早く読みたかった―良いオブジェクト指向設計とは何かを教えてくれる名著『オブジェクト指向設計実践ガイド』

オブジェクト指向設計実践ガイド』として和訳されている本の第2版であるSandi Metzによる"Practical Object-Oriented Design, An Agile Primer Using Ruby"を読みました。

以前からオブジェクト指向プログラミングに関する名著という評判は聞いていましたが、その期待を裏切らないとても良い本でした。

オブジェクト指向設計とは何か、良い設計をどう実現するか、といったことから、最後はテストの書き方までカバーしてあります。

目次

タイトル

ちなみに、海外では原著初版のタイトルである"Practical Object-Oriented Design in Ruby"から頭文字を取ってPOODRと呼ばれています。略称がある本としてはSICP計算機プログラムの構造と解釈 第2版)やCLRS(アルゴリズムイントロダクション 第3版 総合版:世界標準MIT教科書)などの名著がありますが、そこに並べても引けを取らない本だと思います。

なお、本のタイトルにRubyが含まれていますが、どの言語で設計する場合にも適用させることができる汎用的なことが書かれてあります。ただ単に例としてRubyを取っているだけだと公式FAQにも書かれています。

オブジェクト指向設計とは

著者はプログラミングにおいて変更要求は摩擦や重力のようなもので、避けて通れないものだと書いています。

そして、オブジェクト指向設計とは依存性の管理であると述べています。そのあとで、どういった場合に依存性があるのか、といったことをまず説明し、それをどう管理するか、といったことを解りやすく教えてくれます。

設計の考え方の基盤となる2章、3章が特に面白かった

具体的に継承やコンポジションをどう実装するかという後半も面白く読みましたが、クラスの責務についての2章、依存性の管理についての3章が特に響きました。

何をするか(What)だけではなく、なぜ(Why)を教えてくれたからです。設計の手法は知識として知っていましたが、その前にある段階の考え方に抜けている部分があることに気づけました。

また、後半も、どのように(How)設計をするのかを、実際に自転車や旅行といった具体的なドメインを例に取りながら、コードをリファクタリングにより改善しながら教えてくれます。

メッセージベースで考える

特に腑に落ちた考え方として、設計をする時に、クラスベースではなくメッセージベースで考える、というものがありました。

まずシーケンス図を書いてみることで、どういったメッセージがやりとりされるか洗い出し、そこからどういったクラスが必要なのかを考え出すというものです。ドメインオブジェクトはすぐに気づきやすいですが、その間にあるクラスが浮かび上がることなどを助けてくれる、というわけです。

どういう人が読むとよいか

この本を読むタイミングとしては、入門書を読んである程度オブジェクト指向プログラミングを経験したあと、デザインパターン本やリファクタリング本などを読む前の段階で読むとその後が続きやすくてベストかなと思います。

和書のプログラミング入門書では、継承までは言語仕様として触れますが、コンポジションやテストといったところまで踏み込んでいるものは少ないように感じます。入門書の次の本としてこの本は最適だと思います。

僕は学生の頃、基本情報技術者試験を受ける際に結合度や凝集度といった言葉を勉強しましたが、まだ実務経験がない段階で何のこっちゃさっぱりでした。言葉を詰め込む前にこの本でそういった用語が具体的にどういうものなのか理解できてたら良かっただろうなと思います。

原著初版と2版の違い

僕が読んだ原著2版は公式サイトのFAQによるとハッシュをキーワード引数に変えたりといったRubyの機能をよりいい形で取り入れたマイナーアップデートのようなので、2版が出ている今でも初版の訳書を読んで全然問題ないと思います。

まとめ

良いオブジェクト指向設計とは、クラスの責務が明確で、依存性がきちんと管理されている、ということにまとめられるのではないかと思います。この本ではそれを適度にまとまった形で実践的に教えてくれます。

著者はデザインに答えはなく、コードを整えるアートであると述べています。
完璧なコードを書くことはとても難しいですが、より良いコードを書けるよう、日々試行錯誤し、いい設計が少しでもできるよう考え抜いていきたいと思いました。

リンク