この記事は、PHP本格入門 下 を読んでオブジェクト指向についての学習をメモしたものです。
オブジェクト指向での設計を知ることで目指すもの
- アプリケーションを構成する部品を直感的に理解できるようにする
- アプリケーションに変更を施す際、1箇所の変更で済むようにする
独立性について
オブジェクト指向を表す言葉として「カプセル化」と「多様性」がある。この2つのキーワードに共通する目的が、「処理の独立性を高めること」である。
-
独立性が低いクラス
クラス1つ1つの役割が曖昧で、依存しあっていたり、1つのクラスの変更が他のクラスにまで影響してしまう。
-
独立性が高いクラス
クラスが自立していて、1つのクラスの変更が、他クラスに影響しない。
よって独立性が高いクラスにすると、機能の拡張時にどのクラスを変更するべきか明確になる。変更箇所が1つで済む。
カプセル化
-
関連性の高いデータ(プロパティ)とふるまい(メソッド)を1つのクラスにまとめること。
-
1つのクラスの中で、外部に見せたくないデータを隠蔽すること。
-
1つのクラスの中で、外部に見せたくないふるまいを隠蔽すること。
うまくカプセル化されたクラスは、手段は隠蔽され、目的を実現する処理が外部から使えるようになっている。
多様性
「継承」と結びつきが強い言葉。
あるクラスのインスタンスを利用する別のクラスが、そのインスタンスの具象が何であるかを意識しなくていいというメリットをもたらす。
独立性を高める 「凝集度」と「結合度」
独立性が高いクラスは … 凝集度が高く、結合度が低い
独立性が低いクラスは … 凝集度が低く、結合度が高い
クラスA、クラスBがあるとする。
結合度が高い状態というのは、Aの中でBを呼び出したり、Bのメソッドを使用したりしている状態で、依存していると言える。
また2つ以上のクラスが相互に依存している場合などは、片方のクラスの変更時にもう片方のクラスも変更しなければならない、みたいなことが発生する。
また、AがB に依存している時、 A はクライアント、Bはプロバイダという言葉でも表せる。
クラスの関係性を表す is-a関係 と has-a関係
is-a関係
継承の関係を表す。
乗り物クラス、自動車クラス、飛行機クラス があるとき、
自動車は乗り物である(自動車クラス is a 乗り物クラス)
飛行機は乗り物である(飛行機クラス is a 乗り物クラス)といえる。
has-a関係
コンポジションまたは集約の関係を表す。
コンポジション
自動車クラス、タイヤクラス、ハンドルクラスがあるとき、
自動車は、タイヤ、ハンドルを用いて構成される(自動車クラス has a タイヤクラス, ハンドルクラス)
集約
駐車場クラス、自動車クラスがあるとき、
駐車場は、自動車を持ちえる(駐車場クラス has a 自動車クラス)
上記2つの違いは、コンポジションの関係にある場合、構成物の所有者がなくなると、構成物もなくなる(自動車クラスがなくなれば、タイヤクラス、ハンドルクラスもなくなる)。一方、集約の関係にある場合、それらは独立して存在が可能(駐車場クラスは自動車クラスを持ちえるが、なくてもOK)。