オブジェクト指向プログラミングについて学んだことメモ

この記事は、PHP本格入門 下 を読んでオブジェクト指向についての学習をメモしたものです。

オブジェクト指向での設計を知ることで目指すもの

独立性について

オブジェクト指向を表す言葉として「カプセル化」と「多様性」がある。この2つのキーワードに共通する目的が、「処理の独立性を高めること」である。

よって独立性が高いクラスにすると、機能の拡張時にどのクラスを変更するべきか明確になる変更箇所が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 タイヤクラス, ハンドルクラス)

集約

上記2つの違いは、コンポジションの関係にある場合、構成物の所有者がなくなると、構成物もなくなる(自動車クラスがなくなれば、タイヤクラス、ハンドルクラスもなくなる)。一方、集約の関係にある場合、それらは独立して存在が可能(駐車場クラスは自動車クラスを持ちえるが、なくてもOK)。