オブジェクト指向の本質を学ぶために,オブジェクト指向のこころを読みました.

読んだ理由

主な動機は,

  • パターンの本質を身につけるため.
  • パターンを適用するベースとなるオブジェクト指向を深く理解するため.

以下の記事の NextAction で選んだ本だった.

オブジェクト指向の本質を学べる本として, ネットで評判が高かったので購入.

また, 今年の目標としてデザインパターンを理解することをあげていたので, デザインパターンという言葉自体に惹かれた.

内容

OOP の 2 大原則とは?!

オブジェクト指向のこころとは, ズバリ以下だ.

  • 流動的要素を探し出してカプセル化する
  • クラス継承よりもオブジェクトの集約を多用する

この 2 つの概念は書くページの至る所に現れる. この 2 つの概念を説明するために, 他のページが書かれているといってもいい.

そして, これを実現するための手段がデザインパターンだ. 本質から導いた結果を,

“ほら, これが Gof では xxx パターンと名づけられているんだよ”

といわれる. これが デザインパターンとともに学ぶ という副題の意味.

Bridge Pattern に OO の本質あり

そして, この原則を解説するために, Bridge Pattern が詳解されている.

Bridge Pattern については, こちらも参照.

登場するパターン

すべてのパターンが出てくるわけではない. オブジェクト指向のこころを解説するための例として, パターンを引用しているに過ぎない.

  • Facade
  • Adapter
  • Bridge
  • Strategy
  • Abstract Factory
  • Decorator
  • Observer
  • Template Method
  • Singleton
  • Factory Method

パターンで考える

この本の独特な手法は, パターンで考える方法が載っていること.(第 13 章)

  • Facade
  • Adapter
  • Bridge
  • Abstract Factory

以下がその手順.

  • パターンの洗い出し … コンテキストに存在するパターンをまずは列挙.

  • パターンの分析・適用 ここで大事なのは, このコンテキストに置いて

    • “なにか問題なのか?”
    • “なにを解決したいのか?”

    をかんがえること. 1-4 を繰り返す.

    1. パターンの並べ替え
    2. パターンの選択と設計の拡張
    3. 追加のパターンの洗い出し
    4. 繰り返し
  • 設計の詳細

詳細は書籍を.

Java と UML の知識が必要

パターンを表現するために クラス図と Java のサンプルコードもふんだんに載っている.

そのため, 本の前半には, UML を解説するページも少し割かれている.

感想

なんども読み返した

読み始めたのは半年以上前. 興味がある部分からつまみ読みをはじめた.

一回読んでも大抵は忘れてしまう. この本には, オブジェクト指向設計とはなにかについて, 凝縮した言葉でかかれているため,同じページを何度も読み返した.

Web での評判は本物.これからも折に触れて読み返すことになるだろう.

パターンは暗記するものではなく, 導出するもの

この本を読む前, デザインパターンは暗記してすぐに思い出せるように しておく必要があると思っていた.

実はそうではなくて, 本質だけ押されておいて, 自然とデザインパターンは導き出すことが大事だと思った.

大学受験の数学も, ひたすら公式を暗記しても応用問題が解けない. 逆に理論的なところを抑えれば, 公式を暗記しなく立って導出できるし, 応用も効くようになる.

それと同じことかもしれない.

学習メモ

オブジェクト指向設計

名詞/ 動詞 抽出法

  • 問題領域に存在する名詞を洗い出し, それらを表現するオブジェクトを生成する.
  • 名詞に関連した動詞を洗い出し, それらを表現するメソッドを追加する

共通性/ 可変性 分析法

  • 共通性分析:時間が経っても変化しにくい構造を見つけるもの 共通性分析によってまとめられた概念を抽象クラスによって表現
  • 可変性分析:変化しやすい構造を洗い出すもの 可変性分析で得た流動的要素は抽象クラスの派生クラスによって実装される

設計手順:

  • (抽象クラス) このクラスが持つ責務をすべて全うするにはどうようなインターフェイスが必要か?
  • (派生クラス) この特定実装の中でどうのようにして与えられた仕様を実装できるのか?

Jim Coplien が提唱. p235 第 15 章から抜粋.

  1. Links

カプセル化の視点で整理

カプセル化がデータ隠蔽というのは狭義の定義.

カプセル化とはあらゆるものを隠蔽すること.

  • データ
  • メソッド
  • 実装
  • 派生クラス
  • 設計の詳細
  • 実体化の規則

流動的要素を探し出してカプセル化する. 委譲は手段.

この観点から, デザインパターンをとらえ直すと,

流動的要素 Pattern


アルゴリズム Strategy 状態 State 振る舞い Decorator パターンマッチ, 型 Visitor 動作, 要求 Command 実装 Bridge 変化への反応 Observer 相互作用 Mediator 生成 Factory Method, Abstract Factory , Prototype 一意性 Singleton, Flyweight 構造の生成 Builder 集合の巡回構造 Iterator インタフェース Adapter システム Facade 設計の詳細 Template Method

これからどうするか

暗記はやめよう

デザインパターンをただ暗記する態度は改めなければ.

本質から導けば, 覚える量も減るし, 応用も効くはず.

暗記ではなくて, 本質を繰り返し唱えること.

問題を考えよう

何か問題でパターンによってなにが改善されるかを考える癖をつけよう.

デザインパターンは, 概して複雑. 実際に仕事で利用するには, 工数 との兼ね合いを考えるようにする.

保守なんてされないだろうコードを, たくさん工数をかけてデザインパターンを駆使して書いても, 価値はない.

問題が保守性だとして, 保守する必要がなければパターンは適用する必要はない.

OO から距離をおいてみてみる

今年の目標は OO を理解することだったので, かなりの時間を OO に割いてきた.

来年の目標は関数型パラダイムを理解することなので, 一旦 OO の世界からは距離を置こうと思う.

OO と関数型を比較しつつ, 距離を追いてみることで, また見える世界が変わるかもしれない.