ObjectSquare [1999 年 4 月号]

[Happy Squeaking!!]


2.自分を省みるオブジェクト

2.1 イントロスペクション


山田さん宅に見知らぬ人がいきなり訪問してきたとします。山田さんはその人に対しどのようにコミュニケーションを試みるでしょうか?
まずは、その人が一体「何者であるか」という情報をつかみたいと思うのではないでしょうか。つまり「新聞の販売員」か、「健康食品のセールスマン」か、「医者」か「遠い親戚」なのかといった情報です。そこで山田さんは「どなたですか」といったメッセージによってその人に対するバックグラウンドの情報を得ました。その結果、「新聞の販売員」ということがわかったので、続いて「あと3ヶ月延長してください」といったメッセージを送ることができ、コミュニケーションが成立しました。
この場合、「尋ねてきた人」はインスタンスとして考えることができます。「山田さん」は「尋ねてきた人」にその人のクラスを尋ねるメッセージを送ることによって「尋ねてきた人」が「新聞の販売員」に属するというメタ情報を得たわけです。
このように、実体に対して「そもそもあなたは何なのか」といった質問を投げかけることができるのは非常に大事なことです。メタ情報が得られることで、インスタンスの正体がわかり、メッセージ送信側は、本来ダイレクトにメッセージが送れないような疎遠なインスタンスに対してさえ、柔軟にコミュニケートしていくことが可能になります。

今度はもうすこしコンピュータよりの例でみてみましょう。
RDB(リレーショナルデータベース)は、データを表の集まりとして蓄積するデータベースです。通常は、RDBから、既に知っている表構造(社員表)の中に存在する実データ (社員:山田) を取り出しています。しかし場合によっては、データを取り出す側が、RDB内の全ての表構造についての情報をあらかじめ把握できない場合があります。例えば、表の内容をテキスト出力する汎用的なデバッグ用ツールを作成する場合には、特定の表を想定するということはできません。また、データウェアハウスなど、非常に多量、多種のデータがデータベースに格納されている場合には、やはりクライアント側ですべての表構造を知っておくというのは困難になります。そこで使われるのがメタ情報です。RDBでは、現在格納されている表の名前、カラムの各項目の名前、型といった、データそのものではなく、そのデータを定義するためのメタなデータを必ず問い合わせることができるようになっています。社員そのもののデータではなく、その社員が存在するために必要な「社員表」の構造に関するデータを取り出すわけです。このような機構を提供しておくことで、クライアント側のデータベースに対する相互の依存関係を減らし、より柔軟なシステムの構築ができるようになるのです。

また分散オブジェクト(CORBA)の世界では、通常、相手先のオブジェクトのインターフェースをあらかじめ知った上でのオペレーション起動(静的起動)に加えて、相手先のインターフェスを尋ねてからのオペレーション起動(動的起動)がサポートされています。ここでは、インターフェースリポジトリというメタデータが一元管理されるデータベースが背後で活躍しています。

疑似コード風に書くと以下のようになります。

"クライアント側"
server := aNamingContext.resolve('Server'). "'Server'という名のサーバを検索"
interfaceDef := server interface. "サーバのインターフェースを取り出す"
interfaceName := interfaceDef name. "インターフェースから名前を取得"
(interfaceName = "newspaperSales")  "新聞屋さんであれば"
	ifTrue:[		
		request := interfaceDef operationAt: ' prolongNextMonths:'.
		result := request invokeWith: 3. ].
" prolongNextMonths: というオペレーションを引数3で起動"

分散システムや、Webのシステムのように非常に広範囲で動作するシステムの場合には、あらかじめ起動するクライアント側が、サーバの提供するサービスをすべて知っておくということは実質不可能なことです。このために、不特定のサーバという実体に対して、どのようなインターフェースを持つか(何者であるかを)尋ねる機能が非常に有効になるのです。

このように、システムが自分自身を省みて「自分は一体なんなのか」を把握できること機能を、イントロスペクションといいます。
イントロスペクションは「自らを振り替える(自己反省)」という意味です。オブジェクト指向の場合では、特定のオブジェクトに対して、「あなたはいったいどのようなオブジェクトですか」とメッセージが投げられたときに、その実体のメタ情報を得ることができれば、イントロスペクション機能かサポートできているということになります。


© 1999-2001 OGIS-RI Co., Ltd.

Prev.

Index

Next