オブジェクト指向の「見方」はわかりました。次はどうやって実現するかの「手段」部分です。これにはオブジェクト指向で提供されている様々な技術を使います。
クラスとは
オブジェクトの共通する作業やデータをオブジェクト毎に持たせるのは効率的ではありません。そこで「クラス」を使用します。クラスには以下の要素が含まれています。
* オブジェクトが保持するデータ項目
* オブジェクトが実行出来るメソッド
* データ項目やメソッドにアクセスするための方法
型としてのクラス
クラスは「抽象データ型(abstract data type : ADT)」の機能を持っています。抽象データ型の表現方法がクラスといってもいいかもしれません。「オブジェクト指向プログラミング入門」によると、抽象データ型は以下の特徴をもっています。
* 型定義を公開できること。
o プログラマがデータ型を定義。
* インスタンスに対する操作が利用出来ること。
o 「do(data)」ではなく「data.do()」。
* 内部のデータを保護し、上記の操作のみがアクセス出来ること。
o 情報隠蔽。
* 複数のインスタンスを作れること。
o マルチプルインスタンス。
継承の用途
型が定義できるようになっても、まだ問題があります。例えば様々な種類の学生型をコレクションで保持したい場合などです。この種類のバリエーションから、ある型のグループを包含するような汎用の型、つまり抽象型の必要性がでてきます。これがいわゆる抽象クラス(基底クラス)と呼ばれるもので、それを継承しているそれぞれの型は具象クラスと呼ばれます。
抽象クラスは実体化できないというだけのクラスではありません。これは実装レベルで考えた狭い考えで、概念レベルから見ないと本当の理解はできません。抽象クラスは、それが表現している概念を具体化したクラスの実装を格納するための場所を提供する、という意味です。つまり、抽象クラスによって関連のあるクラス群に名前を割り当てる方法が与えられ、関連のあるクラス群を1つの概念として扱えるようになるわけです。継承はこのように「オブジェクトの分類」に使用します。
継承の問題点
「継承は特殊化と再利用の手段である」というのは本質ではありません。濫用すると問題があります。
例をあげます。図形で5角形を表現するPentagonクラスがあるとします。ここで継承を使って「縁」機能を持つPentagonBorderを作成します。すると、以下のような不具合が発生します。
* 凝集度が低下する可能性がある
o Pentagonの責任にBorderは関係ない。
* 再利用の可能性が低下する
o 縁機能ロジックが他の図形で再利用出来ない。
* 変化に追随できない
o 違った観点の変更に対応出来ない。
o 次に「網掛け」機能が必要になったら、クラスの組合わせが爆発してくる。
継承はかつて実装的側面で語られることが多かったといいます。しかし、いわゆる「差分プログラミング」と称して推奨された特化の継承にはこのような問題点もあったわけです。これ以外にも、継承に関して多くの問題点が指摘されています。そのキーはやはり「責任」という概念だと思います。オブジェクトは「責任」であり、さらに責任とは「責任をもった者同士の委譲である」といいます。継承は同じ責任内で働くため、委譲をうまく取り扱えません。
カプセル化とは
カプセル化は、オブジェクトが自らのことに対して責任を持ち、必要のない物は見せない、という事です。単純なメンバデータの隠蔽的な意味で使われることがありますが、これは誤解です。カプセル化はあらゆる種類の隠蔽を意味しています。枚挙にいとまはありませんが、例えば以下のようなことも含んでいます。
* 派生クラス
o ポリモーフィズムにより、実際の具象クラスを知らなくても良い。
o 「型のカプセル化」(抽象が具象を隠してる)といえる。
* 実装
o 実装する側は、インターフェイスが決まっているので、呼び出し側を気にしないで変更出来る。
o 「メソッド(実装)のカプセル化」(メソッドの実装を隠せる)といえる。
* 設計の詳細
o 使用する方から、その詳細を気にしなくても良いようにする。
o 「メソッド(使用)のカプセル化」(メソッドの実装を気にしない)といえる。
* 実体化の規則
o 別途実体化専門の役割がいて、使用する側は気にしなくても良い。
o 「生成のカプセル化」といえる。
* サービス
o アダプタオブジェクトの背後の何かを隠し、実際に動作しているサービスクラスを使用する側は気にしなくて良い。
o 「オブジェクトのカプセル化」といえる。
オブジェクト指向技術の目的
オブジェクト指向技術を使うとき重要なのは「変更に強いソフトウェアを作る」という目的意識です。実装に便利な仕組みが提供されているため、意識しないとすぐに実装よりの考え方に陥ってしまいます。
「変更に強いソフトウェアを作る」には、流動的要素をカプセル化します。これにより、システムの変化を特定部分に封じ込めると、そこ以外の部分を再利用することができます。つまり流動的要素を見つけ出し、それをオブジェクト指向の技術を利用してカプセル化することが「変更に強い再利用可能なソフトウェア」を作ることになるのです。
最終更新:2009年06月12日 04:43