neputa note

『オブジェクト指向のこころ』を読んだ

初稿:

更新:

- 7 min read -

img of 『オブジェクト指向のこころ』を読んだ

概要

本書は、オブジェクト指向パラダイムを有効にするためのデザインパターンの中から、重要度の高いものを厳選し、解説しています。その際、要求における流動的要素や、要求の変化という観点から、さまざまな事例について丁寧な考察を行うことによって、デザインパターンそのものを導き出すというユニークなアプローチを採っています。オブジェクト指向パラダイムのメリットを120%引き出したいと考えている方に、まず本書をお薦めすることができます。 丸善出版 より引用

感想

概要の解釈

タイトルの「こころ」は、つまり「本質」とか「本来の力」に置き換えるとわかりやすい。

原題は「Design Patterns Explained」(のSecond Edition)なので、主にデザインパターンの説明が大半を占める。

「オブジェクト指向のこころ」と題し、でも原題が「デザインパターンの説明」って結局どういう内容なのか?というとこんな具合だろうか。

  1. システム設計において有効な「デザインパターン」を学ぼう
  2. だが「デザインパターン」を用いるには、「オブジェクト指向」が持つその特徴と概念を理解しておく必要がある
  3. だから「オブジェクト指向」を学ぼう

オブジェクト指向原則

そんなわけで、さっそく第1部・第1章は「オブジェクト指向」についての説明。著者は一般的になされるオブジェクト指向に関する説明を否定気味に訂正し、「オブジェクト指向のこころ」を丁寧に説明してくれる。

著者がオブジェクト指向原則のサマリとして述べている内容は以下のとおり。

  • オブジェクトとは、適切な責務を伴うものである。
  • オブジェクトは、自らに対する責務を有している。
  • カプセル化とは、あらゆる種類の隠蔽を意味している。
  • データの隠蔽
  • 実装の隠蔽
  • クラスの隠蔽(抽象やインタフェースの背後への隠蔽)
  • 設計の隠蔽
  • 実体化の隠蔽
  • 振る舞いやデータに存在する流動的要素は、共通性/可変性分析によって抽象化する。
  • インタフェースを用いて設計する。
  • 継承は、既存オブジェクトを特殊化するためのものではなく、流動的要素を概念化するための手段として捉える。
  • クラス中に存在する流動的要素から、異質な流動的要素を切り出す。
  • 結合度を低くするよう努める。
  • 凝集度を高くするよう努める。
  • オブジェクトを使用するコードと、そのオブジェクトを生成するコードを分離する。
  • 「OAOO(一度だけ)」ルールを厳守する。
  • 「意図によるプログラミング」と意図を明確に表すネーミングルールを用いて、コードの可読性向上に努める。
  • コーディングを開始する前に、コードのテスト可能性を考慮する。 — 本書より引用

本書には、上記各項について詳細に説明がなされている。

実際、これまで学んできた書籍等における説明のされ方とはだいぶ異なる。

よくある説明は、オブジェクト指向の持つ一側面を語っているに過ぎない。その本質ともいえる部分を学ぶには、デザインパターンと照らし合わせていくと、なぜ「オブジェクト指向で作るのか」をより理解しやすい、ということか。

そして次章以降、オブジェクト指向の説明を時折はさみながら、デザインパターンについて実例やコード(Java)を交えつつ説明してくれる。

読後感

とてもわかりやすく納得感のある説明が多く、また重要なポイントをしつこいぐらいに繰り返し述べているところが学ぶ側にとってとてもありがたい。

ただ、著者自身の体験を用いて説明を行っていることから、実用部分のみ説明が欲しい人には自分語りの箇所などが余計に感じるかもしれない。

ちなみに本書に掲載されているデザインパターンは、GoFのデザインパターンを網羅しているわけではない。掲載されているパターンは下記の通り。

  • Facade
  • Adapter
  • Strategy
  • Bridge
  • Abstract Factory
  • Decorator
  • Observer
  • Template Method
  • Singleton
  • Double-Checked Locking
  • Object Pool
  • Factory Method

本書をベースにオブジェクト指向とデザインパターンの基本的な部分を学び、GoF本にチャレンジするのが良いのかも。

もっと早くに、いやできれば発売当初の2005年に読んでおきたかった。

ということでGoF本を入手せねば…

サンプルコードについて

本書掲載のコードはJavaで、C++およびC#のサンプルをダウンロードできるとあるが、該当URLはさすがに存在せず(初版2005年)、下記URLからページ下部の、Annotated table of contents and related articles > Second editionよりJavaとC++のコードを参照できる。C#は見つからず

Design Patterns Explained A New Perspective on Object-Oriented Design (2nd Edition)

目次