はじめに
どうも、こんにちは。
前回は簡単な例え・事例をつかって、「エージェント指向」、「サブジェクト指向」、「オブジェクト指向」について説明してきましたが、
今回は応用的な例え・事例をつかって説明していきたいと思います。(ところどころ、間違っていることもあるかもしれませんが・・・)
早速ですが、今回もどうぞお付き合いください。
本文
今回は、”自動車が走るという現象”を、エージェント、サブジェクト、オブジェクトをつかって説明したいと思います。
今までの記事を読んでくださった方なら大体察しがつくと思いますが、この場合には、
自動車が「オブジェクト」、自動車を運転するのが「エージェント」、”自動車(オブジェクト)と運転手(エージェント)の相互のやりとりを受け持つのが「サブジェクト」となります。そして、それぞれが独立したスレッドとして実行されることとします。(3者のスレッドです)。
※ここからが例え・事例的な説明となります。
ここで、運転手はすでにクルマにキーを差し、エンジンを点火させ、駐車場から出て視界の開けた道にいるとします。
運転手(エージェント)は、視界の開けた道には、横着にも道を横切ろうとする歩行者や、危険な対向車がいないとします。
まず、運転手はこれを確認します。これは、サブジェクトからエージェントに状況が通知されることに対応します。
そして、前述のとおりに安全を確認した運転手はアクセルペダルを踏みこんで加速します。これは、すでにこのときにサブジェクトからエージェントに、”アクセルペダルを踏みこんで加速することについての許可”、いいかえれば「権利・権限」が与えられているということになります。
ついで、アクセルペダルが踏み込まれたことを、自動車と運転手の相互のやりとりを受け持つ仕組みであるサブジェクトがこれを検知して、
運転手(エージェント)から自動車(オブジェクト)へと、”アクセルペダルが踏み込まれた”というメッセージをサブジェクトが送ります。
※実際には、これは、”メソッド呼び出し”によって実装されるのですが、メッセージを送る方式でもよいかと思います。
そして、メッセージを受け取ったオブジェクト側のスレッドがこれを処理します。メッセージに合わせたプロパティ(あるフィールドに対するゲッターとセッターの組)を呼び出します。このばあい、”アクセルペダルを踏みこんでいるので”、アクセルペダルの状態を変更するセッターを呼び出すことになります。そして、オブジェクト側のスレッドが、アクセルペダルがある一定以上の力で踏み込まれたことを検知して、エンジンの回転数を上げます。
つづけて、オブジェクト側スレッドが、エンジンの回転数がある一定以上上がったことを検知して、エンジンの回転数をタイヤの回転数に変換します。さらにつづけて、タイヤの回転数を速力に変換します。やはり、オブジェクト側スレッドが、速力を自動車本体の(つぎの瞬間の)位置に変換し、自動車本体のフィールドにセットします。
(ここまでは、オブジェクトの持つ「トリガー」が連鎖して呼び出されています)。
※第1回目の記事には、「トリガー」とは、”エージェントが行動をとるとき、これをイベントとして、一定の処理や手続きを実行する”ものとして定義していますが、これは間違いでした。正しくは、”エージェントが行動をとるときや、エージェントがその結果を受け取るときに操作・手続きを実行するもの”でした。
最後に、サブジェクト側スレッドが、自動車本体の位置の変更を検知して、エージェント側スレッドに依頼して、エージェントの持つフィールドにセットします。(これで、自動車の位置の変更に合わせて、これに乗っている運転手の位置も変更されることになります。)
以上が、”自動車が走るという現象”についての説明です。
ちなみに今回の余談ですが、エージェント、サブジェクト、オブジェクトのそれぞれが独立したスレッドとして実行され、この3者のスレッドにより、一つの「コンテナ」が形成されます。
つまり、コンテナとは、3者のスレッドをまとめた一つのプロセスでもあるということです。
「コンテナ」以外には、シーンという考え方もあり、まだまだ説明は尽きませんが、今回はこのくらいにしておきます。
以上が今回のお話です。
いかがでしたでしょうか?
では今回はこれで終わりにします。
どうもお付き合いくださり、ありがとうございました。