かまずにまるのみ。

文鳥とかビールとか

オブジェクト指向のこころ - 視野を広げる

オブジェクト指向のこころ」読書記録。
「第8章 視野を広げる」についての自分用まとめ。

視野を広げる

オブジェクトは責務を持つ

オブジェクトを実装の観点から見た場合、以下のように表現される。

  • 操作(メソッド)を伴ったデータ
  • 操作(メソッド)とデータの集合

オブジェクトを概念の観点から見た場合、以下のように定義できる。

  • 責務を備えた実体
  • 特定の振る舞いを保持した実体

オブジェクトを概念の観点で定義することによって、「オブジェクトがどう実装されるのか」ではなく「オブジェクトが何を実行するのか」というところに着目できるようになる。


カプセル化は何を隠蔽するのか

カプセル化あらゆるものを隠蔽すること。
データはもちろん、オブジェクトが持つ以下のものも隠蔽できる。

  • 実装
  • 派生クラス
  • 設計の詳細
  • 実体化の規則

 

流動的要素とカプセル化

流動的要素を見つけ出し、それをカプセル化する
カプセル化を利用してオブジェクト間にレイヤを作成することで、他のレイヤに悪影響を与えることなく、あるレイヤを変更できるようになる。レイヤ間の結合度低下に貢献する。


共通性/可変性分析と抽象クラス

Coplien の共通性/可変性分析(commonality / variability analysis)

  • 問題領域のどこが流動的要素となるのか(共通性分析)
  • 問題領域中の流動的要素がどのように変化するのか(可変性分析)

共通性分析によって洗い出された流動的要素は抽象クラスによって表現できる。
可変性分析によって洗い出された流動的要素は具象クラスによって実装される。


継承は何を実現するための手段か

継承を実装寄りの観点から見た場合、以下のような目的で使用される。

  • 特殊化と再利用を実現するための手段

継承を概念寄りの観点から見た場合、以下のように使用できる。

  • オブジェクトを分類するための手段
    • 同じ振る舞いを共有するものに着目する
    • 継承によってクラスへと分類する

特殊化と再利用の目的で使用する場合は問題を抱えやすい。

  • 凝集度が低下する可能性
  • 再利用の可能性が低下する
  • 変化に追随できない

 

テスト可能性

簡単にテストできるコードを「テスト可能なコード」(tastable code)と呼ぶ。

  • 凝集度の高いコード
    • ひとつのことしか行っていないのでテストしやすい
  • 結合度の低いコード
    • 考慮しなければならないやり取りが最小化される
    • テストしやすい
  • 冗長性の高いコード
    • テスト自体は難しくない場合でもテスト量は増える
    • 冗長部分が多いとテスト可能性は低下する
  • 可読性の高いコード
    • 適切なメソッド名とパラメータがそれぞれ行うことを的確に表現
    • テストしやすい
  • カプセル化されたコード
    • コード自体が他のコードとほとんど結合していない
    • テストしやすい

 

まとめ

  • カプセル化」はあらゆるものを隠蔽することと考える
  • 「継承」は同じ概念を共有する具象クラス群を抽象化する手段として考える
  • 「データに置ける流動的要素を保持させるためにデータメンバを使用する」と「振る舞いにおける流動的要素を保持させるためにオブジェクトを使用する」という考え方は基本的に同じだと考えることができる
    • どちらも保持しているデータ/振る舞いのカプセル化と拡張を可能にする
  • 共通性/可変性分析で効率的にオブジェクトの洗い出しを行うことができる


「概念」「仕様」「実装」の観点それぞれからの視点を持つことは大事(・ω・)