オブジェクト指向設計実践ガイドを読みました

Rubyで書かれているオブジェクト指向入門書籍として有名な、オブジェクト指向設計実践ガイドを読みました。

学習のモチベーション

最近の仕事で、そこそこ大きめの機能(申込機能のようなもの)のリプレースを設計したのですが、自身のクラス設計能力不足を痛感したことがモチベーションとなり、一度腰を据えて入門書から勉強してみよう、と思ったことがきっかけです。

目的として

  • 要件変更、機能追加に柔軟に対応できるクラス設計を行えるようになること
  • 何らかの障害が発生した際に、MTTRが短く、保守性の高い設計を行えるようになること

の2つを意識していたのですが、結果としては、当初の目的に非常に合致した、良い学習になったように思います。

本書の概要

タイトルにもある通り、本書はオブジェクト指向の入門書です。

オブジェクト指向の入門書は巷にあふれているように思いますが、中でも本書を特徴づけている点は、自分が思うに次の3点かと思います。

  • 単に設計原則の解説だけでなく、その設計原則はどこから来たのか、なぜ原則を守るべきなのかについて、具体的な文献を示して踏み込んだ解説がなされていること
  • クラスよりもメッセージに基づく視点を持つことの推奨
  • コードサンプルがRubyであること

中でも、特に感銘を受けたのは、本書の中で、適切なオブジェクト指向設計を実現するために、メッセージに基づく視点を持つことが推奨されていた点です。

大まかにまとめると、設計の重点を、「クラスと、クラスが誰と何を知るか」から、「まず必要なメッセージを決め、それをどこに送るか」に移すこと。それによって、「まずクラスを決め、その責任を見つけ出す」アプローチから、「メッセージを送るべき相手は誰かを考えることから、隠されたドメインオブジェクトに気づく」アプローチをとることが推奨されているといったところです。

私自身、責任外のクラスにメソッドを定義してしまったり、必要なドメインオブジェクトに気づけなかった時は、大抵既存のクラスに意識を置きすぎていたことが原因のように感じていました。

本書で推奨されている、「メッセージに基づく視点を持つこと」は、それに対する1つの解決法だと思うので、今後積極的に活用していきたいと思っています。

また、Rubyのコードサンプルは一部古い箇所もありますが(デフォルト引数、キーワード引数を使わない冗長な方法が解決手段として解説される点など)、本質を損ねるほどのものではなく、自分で読み替えたので特に気になりませんでした。

まとめ

今後、コードレビューや設計を行う際に、何度も読み返すことになるだろうと感じています。

本書で説明された方法論を参考にしつつ、継続的にリファクタリング、リアーキテクチャを行って、設計能力を向上させていきたいと思います。

オブジェクト指向設計実践ガイド