オブジェクト指向パラダイムでは、オブジェクトという概念を中心に据えたものの考え方です。
このためオブジェクトという観点からすべての物事を見ることになります。つまり、
問題領域を機能に分解していくのではなく、オブジェクトに分解していくわけです。
オブジェクトとは「データ+操作」ではありません。決して「賢いデータ」程度の物ではないのです。これは実装の観点からしか見ていない、狭いものの見方です。なおオブジェクトが保持するデータには、数値や文字列のような単純なものから、他のオブジェクトまで、さまざまなものがあります。
"オブジェクトを使用することで責任を局所化する"
オブジェクトを使用する利点は、オブジェクト自体に責任を持たせて物事を定義できるという点です。
オブジェクトには責任が課され、自らのことについて責任を持つことになるため、やって欲しいことを他のオブジェクトに伝える方法が必要となります。ここでオブジェクトには自らに関するデータ、および、要求された機能を実装するためのメソッドがあったことを思い出してください。オブジェクトが用意するメソッドの多くは、他のオブジェクトからも呼び出し可能になります。こういったメソッドの集合を、オブジェクトの公開インターフェイスといいます。
"オブジェクトには他のオブジェクトが使用するためのインターフェイスがある"
それではオブジェクトとは何か。オブジェクトとは「責任」です。責務を備えた実体です。そして、それは先の「概念レベル」「仕様レベル」から考察した結果導き出されるものです。実装レベルを混ぜてはいけません。「オブジェクトがどう実装されるか」ではなく「オブジェクトが何を実行するのか」に着目しなければならないのです。
開発の手順
オブジェクト指向に沿ったソフトウェア開発の手順はこうなります。
1. 詳細をすべて考慮することなく、予備的な設計を行う
2. その設計を実装する
つまり、まず概念レベル(=責任)で考えることになります。そして、責任を果たすために、他のオブジェクトが使用するためのインターフェイスを考えます。これを「公開インターフェイス」といいます。実装をそのインターフェイスの背後に隠蔽することで、実装とそれを使用するオブジェクトを分離しているのです。
実装レベルで考えているだけだと、結局機能分解の時と同じ問題が発生します。つまり、変更から守られないということです。差分プログラミング的な、誤解されたオブジェクト指向もこの範疇に入ります。
一方、概念レベルでコミュニケーションをはかり、別のレベルで(実装)要求を遂行する、という風に分けて考えると、リクエストする側は何が起こるかの概略だけ知っていればよいことになります。つまり、その概略(責任・インターフェイス)をそのままに、実装詳細の変更から、リクエスト側を守ることができるということです。
なんかコピペしても伝えたいことをうまく伝えられねぇ…。
素直に「-デザインパターンとともに学ぶ-オブジェクト指向のこころ」を読んで欲しいなぁ。
最終更新:2009年06月12日 04:38