以下、添付図面を参照しながら本発明の実施の形態を説明する。図面において同一、又は類似の参照符号は、同一、類似、又は等価な構成要素を示している。
以下、添付図面を参照して、本発明によるコンピュータシステムの構築方法、コンピュータシステム、及びコンピュータシステムの動作について実施の形態を説明する。本実施の形態では、コンポーネント指向ソフトウェア構築によって構築されたコンピュータシステムについて、戦闘シミュレータを一例に説明する。
(アーキテクチャ)
図3は、本発明によるコンポーネント間の接続アーキテクチャ(コンポーネントの拡張アーキテクチャ)の一例を示す概念図である。図3を参照して、本発明に係るフレームワークは、コンポーネント3間の接続処理のうち、複数の階層に共通する制御を行うフレームワークコア1と、コンポーネント3間の接続処理のうち階層化された責務に応じた処理を行うコンポーネントフレームワーク2の2層構造となっている。フレームワークコア1は、コンポーネント3が持つ設定ファイル4を取得し、設定ファイル4の記述で要求されている接続先となるコンポーネント3を2層構造のフレームワークに接続されたコンポーネント3から検索して特定する。フレームワークコア1は、特定した接続先コンポーネント3と設定ファイル4の参照先のコンポーネント3との間の接続処理を行う。その際、コンポーネント3が属する階層に応じた接続処理は、コンポーネントフレームワーク2が行う。コンポーネント間の接続処理に関するクラスは、フレームワークコア1、コンポーネントフレームワーク2、コンポーネント3において継承関係を持つ。又、オブジェクト指向言語の特性の1つであるポリモフィズムを利用することで、フレームワークコア1からコンポーネントフレームワーク2、フレームワークコア1からコンポーネント3の特定のメソッド(関数)を呼び出すことができる。本発明では、この2つの特徴によって、図3で示した複数の階層を越えた接続処理が実現される。
図3に示す一例では、フレームワークコア1上に第n階層のコンポーネントフレームワーク2−nと第n+1階層のコンポーネントフレームワーク2−(n+1)が構築されている。又、2つのコンポーネント3−nA、3−nBが第n階層のコンポーネントフレームワーク2−nに属し、コンポーネント3−(n+1)が第n+1層のコンポーネントフレームワーク2−(n+1)に属している。
本願発明によるコンピュータシステムでは、コンポーネント3間の接続(コンポーネント3の拡張)に関わる基本処理は、フレームワークコア1が行う。但し、コンポーネント3間の接続(コンポーネント3の拡張)に関わる接続処理において、コンポーネントフレームワーク2に応じた差分(階層毎に受け持つ責務に依存した処理)は、コンポーネントフレームワーク2が担う。又、コンポーネント3の接続先コンポーネント(拡張先コンポーネント)は、コンポーネント3毎に設定された設定ファイル4によって指定される。システム構築の際、コンポーネント3間の接続は下層側から上層側に対して行われる。この際、フレームワークコア1は、例えば、設定ファイル4−nAに基づいてコンポーネント3−nAの接続先となるコンポーネント3を特定し、設定ファイル4−nBに基づいてコンポーネント3−nBの接続先となるコンポーネント3を特定する。
コンポーネント3−(n+1)は、コンポーネントフレームワーク2−(n+1)に接続することにより、コンポーネント3−(n+1)の接続先として指定されたコンポーネント3−nA、3−nBのいずれか又は双方とプラグイン接続する。これにより、コンポーネント3−nA、3−nBからコンポーネント3−(n+1)へアクセスする入り口として、コンポーネントフレームワーク2−(n+1)からプラグインコンポーネントファサードが提供される。その後、コンポーネント3−(n+1)が、プラグインコンポーネントファサードに対し責務をアタッチ(登録)することで、コンポーネント3−nA、3−nBのいずれか又は双方とコンポーネント3−(n+1)とが接続される。
図3(a)に示す一例では、設定ファイル4−nAによって、コンポーネント3−nAの接続先としてコンポーネント3−(n+1)が指定される。これにより、コンポーネント3−(n+1)は、フレームワークコア1及びコンポーネントフレームワーク2−(n+1)、2−nを介してコンポーネント3−nAと接続される。本願発明では、設定ファイル4を変更することで、コンポーネント3間の接続先を変更することができる。例えば、図3(a)で示した設定ファイル4−nAからコンポーネント3−(n+1)を接続先とする指定をはずし、設定ファイル4−nBにコンポーネント3−(n+1)を接続先として指定することを規定する。これにより、図3(b)で示すように、コンポーネント3−nBの接続先としてコンポーネント3−(n+1)が指定され、当該コンポーネント間が接続されることとなる。すなわち、本発明によるコンピュータシステムでは、設定ファイル4を変更するだけでコンポーネント3の接続先を変更することが可能となる。又、コンポーネント3間の接続は、フレームワークコア1及びコンポーネントフレームワーク2において行われているため、接続先を変更するために、グルーコンポーネントを用意することや、コンポーネント3のソースコードを変更する必要はない。
本発明に係る問題領域は、それぞれの階層が受け持つ責務が明確な複数の階層を有する。このため、コンポーネント3が有する責務に応じて、当該コンポーネントが属する階層が決まる。尚、問題領域とは、システム化の対象となる領域(Problem Domain)を示し、ワードプロセッサ、複合機、戦闘シミュレータ等に例示される。図4は、本発明によるコンポーネントの階層化構造の一例を示す概念図である。図4に示すように、第n階層に責務C、Dが割り当てられ、第n+1階層に責務Eが割り当てられている場合、責務C、Dを有するコンポーネント3−nAや責務Dを有するコンポーネント3−nBは、第n階層に属し、責務Eを有するコンポーネント3−(n+1)は、第n+1階層に属することとなる。
階層が受け持つ責務を明確化することで、コンポーネントフレームワーク2が呼び出す責務が階層毎に明確となる。これにより、階層間におけるコンポーネント3の接続のうち責務の呼び出しに関する処理を、コンポーネントフレームワーク2において吸収することが可能となる。例えば、図4に示す一例では、第n階層のコンポーネントフレームワーク2−nは、第n+1階層が受け持つ責務Eを事前に把握している(そのように設計される)。このため、第n+1階層のコンポーネント責務の実現手段がアタッチ(登録)される第n+1階層用のプラグインコンポーネントファサードを用意することで、第n層に属するコンポーネント3−nは、当該ファサードを介して第n+1階層のコンポーネント責務を呼び出すことが可能となる。この際、プラグインコンポーネントファサードは、接続先(拡張先)のコンポーネントに対応して用意される。このため、コンポーネントフレームワーク2−nは、第n階層に属するコンポーネント3−nA、3−nBの第n+1層における接続先コンポーネント3さえ特定できれば、当該コンポーネント3間を接続することが可能となる。本発明では、設定ファイル4によって接続先のコンポーネントを指定できるため、設定ファイル4を変更することで、コンポーネント3のコード(接続仕様)を変更することなく、コンポーネント3の接続先(拡張先)を変更することが可能となる。
(ハードウェア構成)
図5及び図6を参照して、本発明によるコンピュータシステム900のハードウェア構成の一例を説明する。図5は、本発明によるコンピュータシステムの構成の一例を示す図である。図5を参照して、本発明によるコンピュータシステム900は、バスを介して相互に接続されるCPU901、インタフェース902、記憶装置903を具備する。記憶装置903は、フレームワーク904、アプリケーションプログラム905、設定ファイル906を格納する。
CPU901は、記憶装置903内のフレームワーク904やアプリケーションプログラム905を実行し、問題領域に応じた処理(例えば戦闘シミュレーション)を行う。この際、記憶装置903からの各種データやプログラムは図示しないRAMに一時格納され、CPU901は、RAM内のデータを用いて各種処理を実行する。
インタフェース902は、他のコンピュータシステム、出力装置(例示:モニタ、プリンタ)、あるいは入力装置(例示:キーボード、マウス)との間を接続するインタフェースである。アプリケーションプログラム905や設定ファイル906は、インタフェース902を介してコンピュータシステム900に入力される。又、CPU901における演算処理結果や、記憶装置903内に格納された各種データは、インタフェース902を介して他のコンピュータシステムや出力装置に出力される。
フレームワーク904は、フレームワークコア1やコンポーネントフレームワーク2を含むフレームワークの機能を実現するためのプログラムである。アプリケーションプログラム905は、複数のコンポーネント3(ソフトウェア部品)を含む。例えば、車両コンポーネント3−2、レーザセンサコンポーネント3−3A、レーザ砲コンポーネント3−3B、出力装置コンポーネント3−4が、アプリケーションプログラム905として記憶装置903に格納される。
設定ファイル906は、複数のコンポーネント3に設定された複数の設定ファイル4を含む。例えば、車両コンポーネント3−2、レーザセンサコンポーネント3−3A、レーザ砲コンポーネント3−3B、出力装置コンポーネント3−4に対応付けられた設定ファイル4−2、4−3A、4−3B、4−4が設定ファイル906として設定される。
図6は、設定ファイル4の構造の一例を示す図である。設定ファイル4は、テキスト形式やXML形式等のメタデータで実現され、コンポーネント3を識別するコンポーネント識別子401に対応づけられたアタッチ先情報402、拡張先情報403、アクティベータクラス404を備える。コンポーネント識別子401は、設定ファイル4が対応付けられたコンポーネント3を特定する識別子である。アタッチ先情報402は、当該コンポーネント3のアタッチ(登録)先となるコンポーネントフレームワーク2を特定する情報である。拡張先情報403は、当該コンポーネント3の拡張先となるコンポーネント3を特定する識別子を含む。アクティベータクラス404は、コンポーネント識別子401によって特定されたコンポーネント3のアクティベータクラス(接続処理の具象クラス)を特定する情報を含む。
CPU901は、図5に示すフレームワーク904及びアプリケーションプログラム905を実行することで、問題領域に応じた機能(例えば、戦闘シミュレータ、ワードプロセッサ、複合機)を実現する。例えば、レーザ砲及びレーザセンサを搭載した車両の動作等を検証するための戦闘シミュレータが実現される。
(システム構築方法及びシステム構築後の動作の概要)
図7から図10を参照して、本発明によるソフトウェアシステムの構築方法、及び構築後の処理実行動作の概要を説明する。図7は、本発明によるコンピュータシステムの構成を示す機能ブロック図である。CPU901は、コンポーネント3−nを実行することでコンポーネント本体3−n1及びコンポーネント固有接続処理部3−n2として機能し、3−(n+1)を実行することで、コンポーネント本体3−(n+1)1及びコンポーネント固有接続処理部3−(n+1)2として機能する。又、CPU901は、コンポーネントフレームワーク2−nを実行することでコンポーネントフレームワーク第n層固有処理部2−n1として機能し、コンポーネントフレームワーク2−(n+1)を実行することでコンポーネントフレームワーク第n+1層固有処理部2−(n+1)1として機能する。更に、CPU901は、フレームワークコア1を実行することでフレームワークメイン111及びフレームワーク共通処理部121として機能する。以下、図8〜図10を参照して、図7に示す機能ブロックの動作について説明する。
図7に示したコンポーネントフレームワーク共通処理部121、コンポーネントフレームワーク第n層固有処理部2−n1、コンポーネント固有接続処理部3−n2のそれぞれに対応するクラスは承継関係にあり、継承先の処理部(例えば、コンポーネントフレームワーク共通処理部121の継承先となるコンポーネントフレームワーク第n層固有処理部2−n1や、コンポーネントフレームワーク第n層固有処理部2−n1の承継先となるコンポーネント固有接続処理部3−n2)においてオーバーライドすることで、ポリモフィズムが実現される。これにより、コンポーネントフレームワーク共通処理部121、コンポーネントフレームワーク第n層固有処理部2−n1、コンポーネント固有接続処理部3−n2は、図8から図10に示す第n階層接続処理部100nとして機能する。同様に、コンポーネントフレームワーク共通処理部121、コンポーネントフレームワーク第n+1層固有処理部2−(n+1)1、コンポーネント固有接続処理部3−(n+1)2は、ポリモフィズムにより図8から図10に示す第n+1階層における接続処理部100nとして機能する。
先ず、図8を参照して、本発明によるシステム構築における初期化動作(コンポーネントフレーム間の接続動作)の概要を説明する。図8は、本発明によるコンポーネント指向ソフトウェア構築における初期化動作の概要を示すシーケンス図である。
フレームワークメイン11は、コンポーネントフレームワーク共通処理部121に初期化を要求する(ステップS1)。これに応じてコンポーネントフレームワーク共通処理部121は、各階層(ここでは第n階層及び第n+1階層)における拡張情報インスタンス、コンポーネントアクティベータインスタンスを生成する(ステップS2)。詳細には、コンポーネントフレームワーク共通処理部121は、各階層に属するコンポーネント3と拡張先コンポーネントとを対応付けた拡張情報を階層毎に生成する。又、コンポーネントフレームワーク共通処理部121は、各階層に属する(接続する)コンポーネント3のコンポーネントアクティベータインスタンスを生成する。コンポーネントアクティベータインスタンスは以降で、前記で生成された拡張情報を用いて、コンポーネント3を構成するインスタンスの生成、及び拡張関係にあるコンポーネント3間を接続する役割を担う。
コンポーネントフレームワーク共通処理部121は、各階層に属するコンポーネント3の有無をフレームワークメイン11に通知する(ステップS3)。それに応じてフレームワークメイン11は、コンポーネントフレームワーク共通処理部121に、拡張フレームワークを設定する(ステップS4、S5)。これにより、第n階層のコンポーネントフレームワークから拡張先の第n+1階層のコンポーネントフレームワークにアクセスすることが可能となる。
例えば、第n+3階層に属するコンポーネント3が存在しない場合、フレームワークメイン11は、第n+2階層接続処理部(図示なし)のコンポーネントフレームワーク共通処理部121に対して、第n+3階層に対する拡張先なしを示すnull(拡張先なし)を渡す(図示なし)。又、第n+2階層に属するコンポーネント3が存在する場合、フレームワークメイン11は、第n+1階層接続処理部100(n+1)のコンポーネントフレームワーク共通処理部121に対し第n+2階層のコンポーネントフレームワークアクティベータインスタンスを渡す(ステップS4)。更に、第n+1階層に属するコンポーネント3が存在する場合、フレームワークメイン11は、第n階層接続処理部100nのコンポーネントフレームワーク共通処理部121に対して第n+1階層のコンポーネントフレームワークアクティベータインスタンスを渡す(ステップS5)。これにより、第n階層のコンポーネントフレームワーク2−nは、拡張先の第n+1階層のコンポーネントフレームワーク2−(n+1)のコンポーネントフレームワークアクティベータにアクセス可能となり、第n+1階層のコンポーネントフレームワーク2−(n+1)は、拡張先の第n+2階層のコンポーネントフレームワーク2−(n+1)のコンポーネントフレームワークアクティベータにアクセス可能となる。
次に、図9を参照して、本発明によるシステム構成動作(コンポーネント間の接続動作)についての概要を説明する。図9は、本発明によるコンポーネント指向ソフトウェア構築におけるシステム構成動作の概要を示すシーケンス図である。
フレームワークメイン111によるシステム構成処理に応じて、コンポーネントフレームワーク共通処理部121は、ステップS2で生成した拡張情報インスタンスを用いて拡張情報を取得する(ステップS11、S12)。これにより、コンポーネントフレームワーク共通処理部121は、各階層間を跨いで接続予定のコンポーネント3を把握する。ここでは、コンポーネントフレームワーク共通処理部121は、第n階層に属するコンポーネント3−n(ベースコンポーネント)と当該コンポーネント3−nの拡張先コンポーネント3−(n+1)との組み合わせを接続予定のコンポーネントとして把握する。
続いて、コンポーネントフレームワーク共通処理部121は、プラグインコンポーネントファサードの生成処理を実行する(ステップS13、S14)。ここでは、コンポーネントフレームワーク共通処理部121及びコンポーネントフレームワーク第n層固有処理部2−n1の継承先であるコンポーネント固有接続処理部3−n2において、プラグインコンポーネントファサードのインスタンスが生成される。詳細には、第n階層のコンポーネント固有接続処理部3−n2は、第n+1階層のファサードクラスを参照して、第n+1階層用のプラグインコンポーネントファサードのインスタンスを生成する。以降、処理の呼び出し側となるベースコンポーネント(ここではコンポーネント3−n)はプラグインコンポーネントファサードインスタンスを介して、拡張先コンポーネント(ここではコンポーネント3−(n+1))に対する処理を行うこととなる。又、コンポーネントフレームワーク共通処理部121は、コンポーネントタスク及びコンポーネントクラス群の生成処理を実行する(ステップS15)。ここでは、コンポーネントフレームワーク共通処理部121及びコンポーネントフレームワーク第n層固有処理部2−n1の継承先であるコンポーネント固有接続処理部3−n2において、コンポーネントタスク及びコンポーネントクラス群のインスタンスが生成される。続いて、コンポーネントフレームワーク共通処理部121は、生成した第n階層のコンポーネントタスクのインスタンスをフレームワークメイン111にアタッチ(登録)する(ステップS16)。これにより、フレームワークメイン111は、第n階層のコンポーネントタスクを利用することが可能となる。ステップS11からS16の動作は、第n+1階層接続処理部100(n+1)でも同様に行われる。
コンポーネントフレームワーク共通処理部121は、第n階層から拡張先の第n+1階層に対しプラグイン接続を実行する(ステップS17)。この際、コンポーネントフレームワーク共通処理部121は、ステップS14において生成したプラグインコンポーネントファサードのインスタンスを第n階層接続処理部100nから第n+1階層接続処理部に渡す。以降、第n+1階層接続処理部100(n+1)における処理に移行する。コンポーネントフレームワーク共通処理部121は、ステップS2で生成した拡張情報インスタンスを用いて拡張情報を取得する(ステップS18)。これにより、コンポーネントフレームワーク共通処理部121は、各階層間を跨いで接続予定のコンポーネント3を把握する。ここでは、第n+1階層に属するコンポーネント3(ベースコンポーネント)と第n+2階層に属する拡張先コンポーネントとの組み合わせを接続予定のコンポーネントとして把握する。
続いて、コンポーネントフレームワーク共通処理部121は、プラグインコンポーネントファサードの生成処理を実行する(ステップS19、S20)。ここでは、コンポーネントフレームワーク共通処理部121及びコンポーネントフレームワーク第n+1層固有処理部2−(n+1)1の継承先であるコンポーネント固有接続処理部3−(n+1)2において、プラグインコンポーネントファサードのインスタンスが生成される。詳細には、第n+1階層のコンポーネント固有接続処理部3−(n+1)2は、第n+2階層のファサードクラスを参照して、第n+2階層用のプラグインコンポーネントファサードのインスタンスを生成する。以降、処理の呼び出し側となるベースコンポーネント(ここではコンポーネント3−(n+1))はプラグインコンポーネントファサードインスタンスを介して、拡張先コンポーネント(ここではコンポーネント3−(n+2))に対する処理を行うこととなる。又、コンポーネントフレームワーク共通処理部121は、コンポーネントタスク及びコンポーネントクラス群の生成処理を実行する(ステップS21)。ここでは、コンポーネントフレームワーク共通処理部121及びコンポーネントフレームワーク第n+1層固有処理部2−(n+1)1の継承先であるコンポーネント固有接続処理部3−(n+1)2において、コンポーネントタスク及びコンポーネントクラス群のインスタンス(コンポーネント責務以外)が生成される。更に、コンポーネントフレームワーク第n+1層固有処理部2−(n+1)1は、コンポーネント責務の生成処理を実行する(ステップS22)。ここでは、コンポーネントフレームワーク第n+1層固有処理部2−(n+1)1の継承先であるコンポーネント固有接続処理部3−(n+1)2においてコンポーネント責務が生成される。第n+1階層における責務の数だけステップS22の処理が繰り返される。
続いて、コンポーネントフレームワーク共通処理部121は、生成した第n+1階層のコンポーネントタスク及びコンポーネント責務のインスタンスをベースコンポーネントである、第n階層の第n階層接続処理部100nに登録する(ステップS23)。詳細には、第n+1階層のコンポーネントタスク及びコンポーネント責務のインスタンスは、ステップS14において生成されたプラグインコンポーネントファサードに登録される。これにより、第n階層のコンポーネント本体3−n1は、当該プラグインコンポーネントファサードを介して第n+1階層のコンポーネントタスク及び責務を呼び出すことが可能となる。
尚、第n+1階層に属するコンポーネントの接続先(拡張先)のコンポーネントが第n+2階層に存在する場合、コンポーネントフレームワーク共通処理部121は、ステップS17と同様に、第n+2階層に対し、プラグイン接続を実行する(ステップS24)。この際、コンポーネントフレームワーク共通処理部121は、ステップS20において生成したプラグインコンポーネントファサードのインスタンスを第n+1階層接続処理部100(n+1)から第n+2階層接続処理部(図示なし)に渡す。以降、第n+2階層においてステップS18〜S24と同様な処理が実行されることにより、第n+1階層のコンポーネント本体3−(n+1)1は、第n+2階層のコンポーネントタスク及び責務を呼び出すことが可能となる。尚、第n+2階層のコンポーネントの拡張先が設定されていない場合、ステップS20及びステップS24の処理は省略される。
次に、図10を参照して、システム構築後のタスク処理について説明する。図10は、本発明によるコンポーネント指向ソフトウェア構築よって構築されたシステムにおける処理動作の概要を示す図である。
フレームワークメイン111は、コンポーネント本体3−n1の初期化を要求する(ステップS31)。ここでフレームワークメイン111は、ステップS16においてアタッチされたタスクに初期化を要求する。コンポーネント本体3−n1は、初期化要求に応じて、コンポーネントタスク、コンポーネント3−n内のクラス群インスタンス、第n+1階層に対するプラグインコンポーネントファサードインスタンスを初期化する(ステップS32)。続いて、コンポーネント本体3−n1は、第n+1階層のコンポーネント本体3−(n+1)1の初期化を要求する(ステップS33)。ここでは、コンポーネント本体3−n1は、ステップS22においてアタッチされたタスクに対し、ステップS14で生成された第n+1階層に対するコンポーネントプラグインコンポーネントファサードを介して、初期化の要求を行う。コンポーネント本体3−(n+1)1は、初期化要求に応じてコンポーネントタスク、コンポーネント3−(n+1)内のクラス群、第n+2階層に対するプラグインコンポーネントファサードを初期化する(ステップS34)。更に、コンポーネント本体3−(n+1)1は、第n+2階層のコンポーネント本体(図示なし)に初期化を要求する(図示なし)。ここでは、コンポーネント本体3−(n+1)1は、ステップS23と同様な方法により第n+2階層からアタッチされたタスクに対し、第n+2階層に対するコンポーネントプラグインコンポーネントファサードを介して初期化の要求を行う。第n+2階層のコンポーネント本体は、これに応じてコンポーネントタスク及びコンポーネント3−(n+2)内のクラス群を初期化する(図示なし)。
コンポーネント本体3−n1、3−(n+1)1の初期化が終了すると、フレームワークメイン11はコンポーネント本体3−n1に対し処理開始を要求する(ステップS37)。ここでは、ステップS16において第n階層からアタッチされたタスクに対して処理開始が要求される。コンポーネント本体3−n1は、処理要求に応じて第n階層コンポーネントのクラス群における処理を実行する(ステップS38)。又、コンポーネント本体3−n1は、クラス群の処理を実行し、第n+1階層用のプラグインコンポーネントファサードを介して第n+1階層の責務の処理を要求する(ステップS39)。ここでは、ステップS23において第n+1階層からアタッチされたタスク及び責務に対して処理開始が要求される。コンポーネント本体3−(n+1)1は、クラス群及び責務の処理を実行し、プラグインコンポーネントファサードを介して第n+2階層の責務の処理を要求する(ステップS39)。ここでは、ステップS23と同様な方法により第n+2階層からアタッチされたタスク及び責務に対して処理開始が要求される。第n+2階層のコンポーネント本体(図示なし)は、クラス群及び責務の処理を実行する(図示なし)。
以上のように、本発明によるシステム構築方法によれば、第1接続制御手段として機能するフレームワークメイン111及びコンポーネントフレームワーク共通処理部121によって、拡張元となるコンポーネント(ベースコンポーネント)と拡張先コンポーネントとの間が接続される。又、コンポーネント間接続処理において、コンポーネントの責務に依存する制御(ステップS22)は、第2接続制御手段として機能するコンポーネントフレームワーク第n層固有処理部2−n1、コンポーネントフレームワーク第n+1層固有処理部2−(n+1)1、・・・によって行われる。コンポーネントフレームワーク共通処理部121にアタッチされ得る責務は階層毎に予め決められている。このため、コンポーネントフレームワーク共通処理部121は、拡張先のコンポーネント3の属する階層に応じた責務を受け取ることが可能となり、階層間をまたぐコンポーネント3の接続が可能となる。この際、拡張先となるコンポーネント3は、設定ファイル4によって決めることができるため、コンポーネント3やフレームワークのソースコードを変更することなくコンポーネント3の拡張が可能となる。
(コンピュータシステムのソフトウェア構造)
次に、図111から図17を参照して、戦闘シミュレータを一例に、本発明によるコンピュータシステムのソフトウェア構造の詳細を説明する。図11から図17に示す一例では、コンポーネントフレームワーク2は、問題領域(戦闘シミュレータ)の特徴から、その責務に応じて4つの階層、すなわち、第1階層(部隊層)の部隊コンポーネントフレームワーク(Unit Flamework)2−1、第2層(装備品層)の装備品コンポーネントフレームワーク(Object Flamework)2−2、第3層(要素層)の要素コンポーネントフレームワーク(Element Flamework)2−3、第4層(原始層)の原始コンポーネントフレームワーク(Primitive Flamework)2−4に区分される。
図11は、本発明に係るコンポーネント3、コンポーネントフレームワーク2、及びフレームワークコア1の依存関係の一例を示すコンポーネント図である。図11を参照して、コンポーネント3は、コンポーネントフレームワーク2に依存し、コンポーネントフレームワーク2は、フレームワークコア1に依存する。このため、コンポーネント3が変更されてもコンポーネントフレームワーク2やフレームワークコアを変更する必要はない。
又、コンポーネント3は、その責務に応じて階層毎に区分可能な複数のコンポーネント3−2〜3−4を含む。ここでは一例として、装備品層に属する戦車コンポーネント3−2、要素層に属するレーザセンサコンポーネント3−3A及びレーザ砲コンポーネント3−3B、原始層に属するレーザ出力装置コンポーネント3−4が設定される。
戦車コンポーネント3−2は、装備品コンポーネントフレームワーク2−2に依存し、レーザセンサコンポーネント3−3A及びレーザ砲コンポーネント3−3Bは、要素コンポーネントフレームワーク2−3に依存し、レーザ出力装置コンポーネント3−4は、原始コンポーネントフレームワーク2−4に依存する。又、本一例では、部隊コンポーネントフレームワーク4−1に依存するコンポーネント3はない。コンポーネントフレームワーク2−1〜2−4は、フレームワークコア1に依存する。尚、コンポーネントフレームワーク2−1〜2−4のそれぞれに属する(依存する)コンポーネント3の数は、1つとは限らず複数であっても設定されなくても良い。
又、コンポーネント3−2〜3−4のそれぞれには、設定ファイル4−2〜4−4が紐付けられている。設定ファイル4−2は、戦車コンポーネント3−2に紐付けられ、コンポーネント識別子401(Compoonent−ID)として戦車を示す“TANK”、アタッチ先情報402(Attached Flamework)として装備品フレームワークを示す“Object Flamework”、拡張先情報403(Extention−Components−ID)としてレーザセンサを示す“laser−sensor”、アクティベータクラス404(Activator−Class)として戦車アクティベータを示す“戦車Activator”を備える。設定ファイル4−2により、“TANK”によって識別される戦車コンポーネント3−2は、装備品フレームワークに属し(接続し)、その拡張先としてレーザセンサが指定され、そのアクティベータとして戦車アクティベータが生成される。
設定ファイル4−3Aには、コンポーネント識別子401(Compoonent−ID)としてレーザセンサを示す“laser−sensor”、アタッチ先情報402(Attached Flamework)として要素フレームワークを示す“Element Flamework”、拡張先情報403(Extention−Components−ID)としてレーザ出力装置を示す“laser−generator”、アクティベータクラス404(Activator−Class)としてレーザセンサアクティベータ“レーザセンサActivator”を備える。設定ファイル4−3Aにより、“laser−generator”によって識別されるレーザセンサコンポーネント3−3Aは、要素フレームワークに属し(接続し)、その拡張先としてレーザ出力装置が指定され、そのアクティベータとしてレーザセンサアクティベータが生成される。
設定ファイル4−3Bには、コンポーネント識別子401(Compoonent−ID)としてレーザ砲を示す“laser−gun”、アタッチ先情報402(Attached Flamework)として要素フレームワークを示す“Element Flamework”、拡張先情報403(Extention−Components−ID)としてレーザ出力装置を示す“laser−generator”、アクティベータクラス404(Activator−Class)としてレーザ砲アクティベータ“レーザ砲Activator”を備える。設定ファイル4−3Bにより、“laser−gun”によって識別されるレーザ砲コンポーネント3−3Bは、要素フレームワークに属し(接続し)、その拡張先としてレーザ出力装置が指定され、そのアクティベータとしてレーザ砲アクティベータが生成される。
設定ファイル4−4には、コンポーネント識別子401(Compoonent−ID)としてレーザ出力装置を示す“laser−generator”、アタッチ先情報402(Attached Flamework)として原始フレームワークを示す“Primitive Flamework”、アクティベータクラス404(Activator−Class)としてレーザ出力装置アクティベータ“レーザ出力装置Activator”を備える。尚、設定ファイル4−4には、拡張先情報403(Extention−Components−ID)は設定されていない。設定ファイル4−4により、“laser−generator”によって識別されるレーザ出力装置コンポーネント3−4は、原始フレームワークに属し(接続し)、その拡張先は指定されず、そのアクティベータとしてレーザ出力装置アクティベータが生成される。
以上のような、設定ファイル4−2〜4−4により、コンポーネント2−2〜2−4の拡張先となるコンポーネント3を特定することが可能となる。
図12A及び図12Bは、本発明に係るフレームワークコア1の構造の一例を示すクラス図である。図12A及び図12Bを参照して、図11を参照して、フレームワークコア1は、クラスとして、フレームワークコアクラス10、コンポーネントフレームワークアクティベータクラス11、コンポーネントアクティベータクラス12、拡張情報クラス13、プラグインコンポーネントIDクラス14、コンポーネントタスククラス15、プラグインコンポーネントファサードクラス16、コンポーネント責務クラス17を備える。
フレームワークコアクラス10には、オペレーション(操作)として“周期演算処理等”や“アタッチタスク”等が規定されている。ここでは、一例としてシステム構築(コンポーネントの拡張)やシミュレータとしての周期演算処理について規定されているが、これに限らない。フレームワークコアクラス10は、コンポーネントフレームワークアクティベータクラス11のインスタンスであるベースコンポーネントを保持する。コンポーネントタスククラス15のインスタンスであるコンポーネントタスクを保持する。
コンポーネントフレームワークアクティベータクラス11、コンポーネントアクティベータクラス12は、インスタンスを活性化する役割を担う。コンポーネントフレームワークアクティベータクラス11は、フレームワークコアクラス10に関連し、オペレーションとして“初期化する”、“システムを構成する”、“プラグイン接続する”、“拡張フレームワークを設定する”が規定される。ここで“初期化する”は、仮想関数で規定されているため、ポリモフィズムにより継承先クラスにおいて具象化されたメソッドが実行される。又、コンポーネントフレームワークアクティベータクラス11には0以上のコンポーネントアクティベータクラス12が関連する。コンポーネントアクティベータクラス12には、オペレーションとして“コンポーネント生成”、“プラグインコンポーネント生成”、“責務マップ生成”、“プラグインコンポーネントファサード生成”、“内部インスタンス生成”、“タスク生成”等が規定されている。ここで“責務マップ生成”、“プラグインコンポーネントファサード生成”、“内部インスタンス生成”、“タスク生成”は、仮想関数で規定されているため、ポリモフィズムにより継承先クラスにおいて具象化されたメソッドが実行される。
拡張情報クラス13は、コンポーネントフレームワークアクティベータクラス11に対して1又は複数存在し、集約の関係にある。拡張情報クラス13には、オペレーションとして“ベースコンポーネント取得”、“拡張コンポーネントID取得”が規定される。これにより、拡張情報クラス13は、コンポーネントアクティベータ12のインスタンスであるベースコンポーネントアクティベータを1つ取得するとともに、プラグインコンポーネントIDクラス14のインスタンスであるプラグインIDを0以上取得する。すなわち、ベースコンポーネント1つに対し拡張情報クラス13は1つ存在し、拡張情報クラス13によって、ベースコンポーネントのインスタンスとして取得されるコンポーネントアクティベータは、0以上のプラグインコンポーネントIDに対応付けられる。尚、プラグインコンポーネントIDクラス14には、設定ファイル4から拡張コンポーネントIDを取得するオペレーションが規定される。
コンポーネントタスククラス15、プラグインコンポーネントファサードクラス16は、コンポーネント間の接続後の動作を担うクラスである。コンポーネントタスククラス15には、オペレーションとして“初期化する”、“周期通知”、“周期処理”が規定される。ここで“初期化する”、“周期処理”は、仮想関数で規定されているため、ポリモフィズムにより継承先クラスにおいて具象化されたメソッドが実行される。プラグインコンポーネントファサードクラス16には、オペレーションとして“初期化する”、“周期通知”、“アタッチタスク”、“アタッチ責務”が規定される。ここで“アタッチ責務”は、仮想関数で規定されているため、ポリモフィズムにより継承先クラスにおいて具象化されたメソッドが実行される。プラグインコンポーネントファサードクラス16は、コンポーネントタスククラス15からタスクインスタンスを取得するとともに、コンポーネント責務クラス17の継承先の責務インスタンスを取得する。フレームワークコア1におけるコンポーネント責務インスタンス17には、 “実行する”がオペレーションとして規定される。ここで“実行する”は、仮想関数で規定されているため、ポリモフィズムにより継承先クラスにおいて具象化されたメソッドが実行される。
図13Aから図13Fを参照して、本発明に係るフレームワークコア1とコンポーネントフレームワーク2との接続関係の一例を説明する。図13Aから図13Fは、本発明に係るフレームワークコア1とコンポーネントフレームワーク2との接続関係の一例をクラス図である。コンポーネントフレームワーク2は、図12A及び図12Bに示すフレームワークコア1のクラスを継承し、階層毎に異なる責務依存部分を差分で設計されたものとなる。
図13Aから図13Fを参照して、第1階層の部隊コンポーネントフレームワーク2−1は、クラスとして、部隊フレームワークアクティベータクラス201(UnitFlameworkActivator)、部隊コンポーネントアクティベータクラス211(UnitCompornentActivator)、部隊タスククラス221(Unitタスク)を備える。
第2階層の装備品コンポーネントフレームワーク2−2は、クラスとして、装備品フレームワークアクティベータクラス202(ObjectFlameworkActivator)、装備品コンポーネントアクティベータクラス212(ObjectCompornentActivator)、装備品タスククラス222(Objectタスク)、装備品コンポーネントファサードクラス232(ObjectCompFacade)、移動責務クラス242A、待機責務クラス242Bを備える。
第3階層の要素コンポーネントフレームワーク2−3は、クラスとして、要素フレームワークアクティベータクラス203(ElementFlameworkActivator)、要素コンポーネントアクティベータクラス213(ElementCompornentActivator)、要素タスククラス223(Elementタスク)、要素コンポーネントセンサファサードクラス233A(ElementCompセンサFacade)、要素コンポーネント砲ファサードクラス233B(ElementComp砲Facade)、識別責務クラス243A、探知責務クラス243B、攻撃責務クラス243Cを備える。
第4階層の原始コンポーネントフレームワーク2−4は、クラスとして、原始フレームワークアクティベータクラス204(PrimitiveFlameworkActivator)、原始コンポーネントアクティベータクラス214(PrimitiveCompornentActivator)、原始タスククラス224(Primitiveタスク)、原始コンポーネントファサードクラス234(PrimitiveCompFacade)、出力責務クラス244を備える。
部隊フレームワークアクティベータクラス201、装備品フレームワークアクティベータクラス202、要素フレームワークアクティベータクラス203、原始フレームワークアクティベータクラス204は、コンポーネントフレームワークアクティベータクラス11を継承する。例えば、コンポーネントフレームワークアクティベータクラス11で規定された“初期化する”は、仮想関数で規定されているため、継承先の部隊フレームワークアクティベータクラス201、装備品フレームワークアクティベータクラス202、要素フレームワークアクティベータクラス203、原始フレームワークアクティベータクラス204において具象化されたメソッドが実行される。
部隊コンポーネントアクティベータクラス211、装備品コンポーネントアクティベータクラス212、要素コンポーネントアクティベータクラス213、原始コンポーネントアクティベータクラス214は、コンポーネントアクティベータクラス12を継承する。例えば、コンポーネントアクティベータクラス12で規定された“責務マップ生成”は、仮想関数で規定されているため、継承先の部隊コンポーネントアクティベータクラス211、装備品コンポーネントアクティベータクラス212、要素コンポーネントアクティベータクラス213、原始コンポーネントアクティベータクラス214において具象化されたメソッドが実行される。
部隊タスククラス221、装備品タスククラス222、要素タスククラス223、原始タスククラス224は、コンポーネントタスククラス15を継承する。例えば、コンポーネントタスククラス15で規定された“周期処理”は、仮想関数で規定されているため、継承先の部隊タスククラス221、装備品タスククラス222、要素タスククラス223、原始タスククラス224において具象化されたメソッドが実行される。
装備品コンポーネントファサードクラス232、要素コンポーネントセンサファサードクラス233A、要素コンポーネント砲ファサード233B、原始コンポーネントファサードクラス234は、プラグインコンポーネントファサードクラス16を継承する。例えば、プラグインコンポーネントファサードクラス16で規定された“アタッチ責務”は、仮想関数で規定されているため、継承先の装備品コンポーネントファサードクラス232、要素コンポーネントセンサファサードクラス233A、要素コンポーネント砲ファサード233B、原始コンポーネントファサードクラス234において具象化されたメソッドが実行される。
移動責務クラス242A、待機責務クラス242B、識別責務クラス243A、探知責務クラス243B、攻撃責務クラス243C、出力責務クラス244は、コンポーネント責務クラス17を継承する。例えば、責務クラス17で規定された“実行する”は、仮想関数で規定されているため、継承先の移動責務クラス242A、待機責務クラス242B、識別責務クラス243A、探知責務クラス243B、攻撃責務クラス243C、出力責務クラス244クラスにおいて具象化されたメソッドが実行される。
コンピュータシステム900には、汎用クラスとして、コンポーネント3を特定するコンポーネントIDと拡張情報インスタンスとが対応付けられて登録された拡張情報一覧101(マップ)が設定されることが好ましい。これにより、コンポーネントフレームワークアクティベータクラス11は、コンポーネントIDを検出キー(Key)として拡張情報インスタンスを取得できる。又、拡張先コンポーネントを特定するプラグインコンポーネントIDは、プラグインコンポーネントID一覧102(片方向線形リスト)に登録されることが好ましい。拡張情報クラス13はここからプラグインコンポーネントIDを取得できる。更に、コンポーネントタスクインスタンスは、片方向線形リスト103として登録されることが好ましい。フレームワークコア10は、ここからコンポーネントインスタンスを取得できる。更に、コンピュータシステム900には、汎用クラスとして、コンポーネント責務インスタンスと所定の検索Keyとが対応付けられて登録された責務マップ104が設定されることが好ましい。プラグインコンポーネントファサード16は、所定の文字列を検索Keyとして責務マップ104からコンポーネント責務インスタンスを取得できる。
図14A及び図14Bは、本発明に係る第2階層(装備品層)の戦車コンポーネント3−2の構造の一例を示すクラス図である。戦車コンポーネント3−2は、クラスとして戦車アクティベータクラス312、戦車タスククラス322、戦車のクラス群332、移動責務クラス342A、待機責務クラス342Bを備える。
戦車アクティベータクラス312は、装備品コンポーネントアクティベータクラス212を継承し、オペレーションとして“プラグインコンポーネントファサード生成”、“内部インスタンス生成”、“タスク生成”等が規定されている。戦車タスククラス322は、装備品タスククラス222を継承し、オペレーションとして“周期処理”や“初期化する”が規定される。移動責務クラス342Aは移動責務クラス242Aを継承し、待機責務クラス342Bは待機責務クラス242Bを継承する。戦車のクラス群332は、戦車タスククラス322、移動責務クラス342A、待機責務クラス342Bに関連し(誘導され)、オペレーションとして“初期化する”、“周期処理をする”、“移動する”、“待機する”が規定される。すなわち、コンポーネント責務クラス17における“実行する”は、戦車のクラス群332において具象化された“移動する”、“待機する”を実行する。
装備品コンポーネントアクティベータクラス212は、上層の要素コンポーネントファサードインスタンスを拡張コンポーネントIDに対応付けて登録したファサード一覧105−2(マップ)を生成する。戦車のクラス群332は、ファサード一覧105−2から拡張コンポーネントIDを検索Keyとして要素コンポーネントファサードインスタンスを取得し、要素コンポーネントファサード233(例えば要素コンポーネントセンサファサード233A)にアクセスする。
図15A及び図15Bは、本発明に係る第3階層(要素層)のレーザセンサコンポーネント3−3Aの構造の一例を示すクラス図である。レーザセンサコンポーネント3−3Aは、クラスとしてレーザセンサアクティベータクラス313A、レーザセンサタスククラス323A、レーザセンサのクラス群333A、識別責務クラス343A、探知責務クラス343Bを備える。
レーザセンサアクティベータクラス313Aは、要素コンポーネントアクティベータクラス213を継承し、オペレーションとして“プラグインコンポーネントファサード生成”、“内部インスタンス生成”、“タスク生成”等が規定されている。レーザセンサタスククラス323Aは、要素タスククラス223を継承し、オペレーションとして“周期処理”や“初期化する”が規定される。識別責務クラス343Aは識別責務クラス243Aを継承し、探知責務クラス343Bは探知責務クラス243Bを継承する。識別責務クラス343A及び探知責務クラス343Bには、オペレーションとして“実行する”が規定される。レーザセンサのクラス群333Aは、レーザセンサタスククラス323A、識別責務クラス343A、探知責務クラス343Bに関連し(誘導され)、オペレーションとして“初期化する”、“周期処理”、“識別処理”、“探知処理”、“レーザ放射処理”等が規定される。すなわち、コンポーネント責務クラス17における“実行する”は、レーザセンサのクラス群333Aにおいて具象化された“識別処理”、“探知処理”を実行する。尚、レーザセンサタスククラス323A、レーザセンサのクラス群333A、識別責務クラス343A、探知責務クラス343Bは、レーザセンサアクティベータ313Aによって生成される。
要素コンポーネントアクティベータクラス213は、上層の原始コンポーネントファサードインスタンスを拡張コンポーネントIDに対応付けて登録したファサード一覧105−3(マップ)を生成する。レーザセンサのクラス群333Aは、ファサード一覧105−3から拡張コンポーネントIDを検索Keyとして原始コンポーネントファサードインスタンスを取得し、原始コンポーネントファサード234にアクセスする。
図16A及び図16Bは、本発明に係る第3階層(要素層)のレーザ砲コンポーネント3−3Bの構造の一例を示すクラス図である。レーザ砲コンポーネント3−3Bは、クラスとしてレーザ砲アクティベータクラス313B、レーザ砲タスククラス323B、レーザ砲のクラス群333B、攻撃責務クラス343Cを備える。
レーザ砲アクティベータクラス313Bは、要素コンポーネントアクティベータクラス213を継承し、オペレーションとして“プラグインコンポーネントファサード生成”、“内部インスタンス生成”、“タスク生成”等が規定されている。レーザ砲タスククラス323Bは、要素タスククラス223を継承し、オペレーションとして“周期処理”や“初期化する”が規定される。攻撃責務クラス343Cは攻撃責務クラス243Cを継承し、オペレーションとして“実行する”が規定される。レーザ砲のクラス群333Bは、レーザ砲タスククラス323B、攻撃責務クラス343Cに関連し(誘導され)、オペレーションとして“初期化する”、“周期処理”、“攻撃処理”、“エネルギー密度算出処理”等が規定される。すなわち、コンポーネント責務クラス17における“実行する”は、レーザ砲のクラス群333Bにおいて具象化された“攻撃処理”、“エネルギー密度算出処理”を実行する。尚、レーザ砲タスククラス323B、レーザ砲のクラス群333B、識別責務クラス343A、探知責務クラス343Bは、レーザ砲アクティベータ313Bによって生成される。
要素コンポーネントアクティベータクラス213は、上層の原始コンポーネントファサードインスタンスを拡張コンポーネントIDに対応付けて登録したファサード一覧105−3(マップ)を生成する。レーザ砲のクラス群333Bは、ファサード一覧105−3から拡張コンポーネントIDを検索Keyとして原始コンポーネントファサードインスタンスを取得し、原始コンポーネントファサード234にアクセスする。
図17A及び図17Bは、本発明に係る第4階層(原始層)のレーザ出力装置コンポーネント3−4の構造の一例を示すクラス図である。レーザ出力装置コンポーネント3−4は、クラスとしてレーザ出力装置アクティベータクラス314、レーザ出力装置タスククラス324、レーザ出力装置のクラス群334、出力責務クラス344を備える。
レーザ出力装置アクティベータクラス314は、原始コンポーネントアクティベータクラス214を継承し、オペレーションとして“プラグインコンポーネントファサード生成”、“内部インスタンス生成”、“タスク生成”等が規定されている。レーザ出力装置タスククラス324は、原始タスククラス224を継承し、オペレーションとして“周期処理”や“初期化する”が規定される。出力責務クラス344は出力責務クラス244を継承し、“実行する”が規定される。レーザ出力装置のクラス群334は、レーザ出力装置タスククラス324、出力責務クラス344に関連し(誘導され)、オペレーションとして“初期化する”、“周期処理”、“放射強度演算”等が規定される。すなわち、コンポーネント責務クラス17における“実行する”は、レーザ出力装置のクラス群334において具象化された“放射強度演算”等を実行する。尚、レーザ出力装置タスククラス324、レーザ出力装置のクラス群334、出力責務クラス344は、レーザ出力装置アクティベータ314によって生成される。
(コンピュータシステムのソフトウェアシステム構築及び構築後の動作の詳細)
図11から図17Bに示したアーキテクチャの元に設計されたコンピュータシステム900において、ソフトウェア構築及び構築後の動作の詳細を、図18Aから図20Eを参照して説明する。以下では、図12Aから図17Bに示されたクラスに対応するプログラムをCPU901によって実行することで実現されるオブジェクトに、それぞれ同じ符号を付して説明する。すなわち、クラスに対応するオブジェクトは、図18Aから図20Eに示す動作の主体として機能する。又、符号に使用される“n”はオブジェクトが属する階層“第n階層”に対応する自然数である。
図18A及び図18Bを参照して、本発明によるコンポーネント指向ソフトウェア構築における初期化動作の詳細を説明する。図18A及び図18Bは、本発明によるコンポーネント指向ソフトウェア構築における初期化動作の詳細を示すシーケンス図である。
図示しないが、フレームワークコア10は、初期化動作の前に、コンポーネントフレームワークアクティベータ20nを生成する。本一例では、部隊フレームワークアクティベータ201、装備品フレームワークアクティベータ202、要素フレームワークアクティベータ203、原始フレームワークアクティベータ204の4階層のコンポーネントフレームワークアクティベータ20nが生成される。
フレームワークコア10は、コンポーネントフレームワークアクティベータ20nに初期化を要求する(ステップS101)。これに応じてコンポーネントフレームワークアクティベータ20nは、初期化するとともに、拡張情報インスタンスを格納するための拡張情報一覧101(マップ)を生成する(ステップS102)。ここで、コンポーネントフレームワーク2−nに接続する(属する)コンポーネント3−nがある場合、コンポーネントフレームワークアクティベータ20nはコンポーネントアクティベータ31nを生成する(ステップS103)。コンポーネントフレームワーク2−nに接続する(属する)コンポーネント3の有無は、設定ファイル4−nの拡張先情報403により確認できる。例えば、図11に示す設定ファイル4−2の拡張先情報403により、戦車コンポーネント3−2の拡張先がレーザセンサコンポーネント3−3Aであることを確認できる。あるいは、設定ファイル4−3A、4−3Bのそれぞれの拡張先情報403により、レーザセンサコンポーネント3−3A、レーザ砲コンポーネント3−3Bのそれぞれの拡張先がレーザ出力先コンポーネント3−4であることを確認できる。更に、設定ファイル4−4の拡張先情報403により、レーザ出力装置コンポーネント3−4の拡張先がないことを確認できる。
コンポーネントアクティベータ31nはプラグインコンポーネントIDインスタンスを格納するためのプラグインコンポーネントID一覧102を生成する(ステップS104)。ここで、コンポーネント3−nに対し拡張先コンポーネントがある場合、コンポーネントアクティベータ31nは拡張先のコンポーネント3を特定するプラグインコンポーネントIDインスタンス14を生成する(ステップS105)。ここでは、設定ファイル4−nから取得した拡張先情報403を引数としてプラグインコンポーネントIDインスタンス14を生成する。続いてコンポーネントアクティベータ31nは、生成したプラグインコンポーネントIDインスタンス14をプラグインコンポーネントID一覧102に登録する(ステップS106)。ステップS105、S106の処理は、拡張先のコンポーネントがある間続けられる。すなわち、拡張するコンポーネント3の全てのコンポーネントIDに対応するプラグインコンポーネントIDインスタンス14が、プラグインコンポーネントID一覧102に登録される。
コンポーネントフレームワークアクティベータ20nは、コンポーネントアクティベータ31nとプラグインコンポーネントID一覧102を引数として拡張情報インスタンス13を生成する(ステップS107)。拡張情報インスタンス13によってコンポーネントアクティベータクラス12とプラグインコンポーネントIDクラス14とが紐付けられる。続いて、コンポーネントフレームワークアクティベータ20nは、生成した拡張情報インスタンス13と、ベースコンポーネントであるコンポーネント3−nの識別子であるコンポーネントIDとを対応付けて、拡張情報一覧101(マップ)に登録する(ステップS108)。
ステップS103からステップS108の処理は、コンポーネントフレームワーク2−nに属する全てのコンポーネント3−nに対して行われる。これにより、当該第n階層に属するコンポーネント3−nの数だけ拡張情報インスタンス13が生成され、拡張情報一覧101に登録されることとなる。
コンポーネントフレームワークアクティベータ20nは、第n階層に接続するコンポーネント3−nの有無を、ステップS101の要求の応答としてフレームワークコア10に通知する(ステップS109)。フレームワークコア10は、接続コンポーネントを有する全てのコンポーネントフレームワークアクティベータ20nに対し、拡張フレームワーク設定する(ステップS110)。この際、拡張側のコンポーネントフレームワークアクティベータ20(n+1)のインスタンスを渡す。一方、第n+1階層のコンポーネントフレームワーク2−(n+1)に接続するコンポーネント3−(n+1)がない場合は、フレームワークコア10は、第n階層のコンポーネントフレームワークアクティベータ20nへの拡張フレームワークの設定を行わず、例えば、当該コンポーネントフレームワークアクティベータ20nにnullを渡す。
以上のような動作により、コンポーネントフレームワークアクティベータ20nは、拡張先の第n+1階層のコンポーネントフレームワークアクティベータ20(n+1)にアクセスすることが可能となる。
図19Aから図19Jを参照して、本発明によるコンポーネント指向ソフトウェア構築におけるシステム構成動作(コンポーネント間の接続動作)の詳細を説明する。図19A及び図19Bは、本発明によるコンポーネント指向ソフトウェア構築におけるシステム構成動作の全体を示すシーケンス図であり、図19Cから図19Jは、図19A及び図19Bにおける(1)から(8)の動作を示すシーケン図である。
図19Cを参照して、図19Aにおける(1)の動作うち、ステップS201〜S204を説明する。フレームワークコア10は、システム構成をコンポーネントフレームワークアクティベータ2−nに要求する(ステップS201)。コンポーネントフレームワークアクティベータ20nは、システム構成要求に応じて、拡張情報一覧101(マップ)から拡張情報インスタンス13を取り出す(ステップS202)。続いてコンポーネントフレームワークアクティベータ20nは、拡張情報インスタンス13から、ベースコンポーネントのコンポーネントアクティベータインスタンスを取得する(ステップS203)。ここでコンポーネントフレームワークアクティベータ20nは、自身が所属する第n階層のコンポーネントアクティベータ31nのインスタンスを取得する。又、コンポーネントフレームワークアクティベータ20nは、拡張情報インスタンス13から、拡張コンポーネントIDを片方向線形リストとして取得する。詳細には、コンポーネントフレームワークアクティベータ20nは、プラグインコンポーネントID一覧102を取得する(ステップS204)。これにより、コンポーネントフレームワークアクティベータ20nは、自身に属するコンポーネント3−n(ベースコンポーネント)と当該コンポーネント3の拡張先コンポーネント3−(n+1)との組み合わせを把握することが可能となる。
図19C〜図19Eを参照して、図19Aにおける(1)〜(3)の動作うち、ステップS205〜S217を説明する。コンポーネントフレームワークアクティベータ20nは、拡張先を指定するプラグインコンポーネントID一覧のインスタンスを引数として、コンポーネントインスタンスの生成をコンポーネントアクティベータ31nに要求する(ステップS205)。コンポーネントアクティベータ31nは、コンポーネント生成要求に応じて、第n+1階層用のプラグインコンポーネントファサード23(n+1)、コンポーネント内クラス群23n、コンポーネントタスク32nを生成する(ステップS206〜S215)。又、コンポーネントアクティベータ31nは、フレームワークコア10にコンポーネントタスク32nをアタッチする(ステップS216)。又、コンポーネントアクティベータ31nは、ステップS205のコンポーネント生成要求の応答として、コンポーネントフレームワークアクティベータ20nに対し、第n+1階層用のプラグインコンポーネントファサード23(n+1)を渡す(ステップS217)。
詳細には、コンポーネントアクティベータ31nは、ステップS205におけるコンポーネント生成要求に応じて、プラグインコンポーネントファサードの生成処理に移行する(ステップS206)。ここでは、先ずコンポーネントアクティベータ31nは、拡張先となる第n+1階層用のプラグインコンポーネントファサードインスタンスを登録するためのファサード一覧105−n(マップ)を生成する(ステップS207)。続いて、コンポーネントアクティベータ31nは、ステップS205において通知されたプラグインコンポーネントID一覧102からプラグインコンポーネントIDを取得する(ステップS208)。コンポーネントアクティベータ31nは、取得したプラグインコンポーネントIDインスタンスで特定したプラグインコンポーネントID14により拡張コンポーネントIDを取得する(ステップS209)。
コンポーネントアクティベータ31nは、プラグインコンポーネントIDで特定したコンポーネントに対するプラグインコンポーネントファサード23(n+1)を生成する(ステップS210)。続いてコンポーネントアクティベータ31nは、作成したプラグインコンポーネントファサードのインスタンスとプラグインコンポーネントIDとを対応づけてファサード一覧105−nに登録する(ステップS211)。
ステップS208からステップ211の処理は、プラグインコンポーネントID一覧に登録された全てのコンポーネント3−(n+1)(拡張先)に対して行われる。これにより、設定ファイル4−nにおいて拡張先として設定された全てのコンポーネント3−(n+1)に対するプラグインコンポーネントファサード23(n+1)が、生成される。以降、処理の呼び出し側となるベースコンポーネント(ここではコンポーネント3−n)はプラグインコンポーネントファサード23(n+1)を介して、拡張先コンポーネント(ここではコンポーネント3−(n+1))に対する処理を行うこととなる。
コンポーネントアクティベータ31nは、内部インスタンスの生成処理に移行し、プラグインコンポーネントファサード23(n+1)を引数としてコンポーネント内クラス群33nを生成する(ステップS212、S213)。続いてコンポーネントアクティベータ31nは、タスク生成処理に移行し、コンポーネントタスク32nを生成する(ステップS214、S215)。
コンポーネントアクティベータ31nは、生成したコンポーネントタスク32nをフレームワークコア10にアタッチする(ステップS216)。これにより、フレームワークコア10は、第n階層のコンポーネントタスク32nを呼び出すことが可能となる。又、コンポーネントアクティベータ31nは、ステップS205におけるコンポーネント生成要求の応答として、n+1階層用のファサード一覧105−nを、第n階層のコンポーネントフレームワークアクティベータ20nに渡す(ステップS217)。
図19Fを参照して、図19Aにおける(4)の動作ステップS218〜S220を説明する。コンポーネントフレームワークアクティベータ20nは、プラグインコンポーネントID一覧102からプラグインコンポーネントIDインスタンスを取得する(ステップS218)。ここで、コンポーネントフレームワークアクティベータ20nは、ステップS204において取得したプラグインコンポーネントID一覧インスタンスにより特定したプラグインコンポーネントID14を、プラグインコンポーネントID一覧102から取得する。続いて、コンポーネントフレームワークアクティベータ20nは、取得したプラグインコンポーネントID14によりプラグインコンポーネントIDを取得する(ステップS219)。
コンポーネントフレームワークアクティベータ20nは、第n+1階層のコンポーネントフレームワークアクティベータ20(n+1)にプラグイン接続する(ステップS220)。ここでコンポーネントフレームワークアクティベータ20nは、ステップS217においてコンポーネントアクティベータ31nから渡されたファサード一覧105−nと、ステップ219において取得したプラグインコンポーネントIDを引数として、第n+1階層のコンポーネントフレームワークアクティベータ20(n+1)に対しプラグイン接続する。以降、第n+1階層における処理となる。
図19Gから図19Hを参照して、図19Aにおける(5)〜(7)の動作のうち、ステップS221〜S235を説明する。コンポーネントフレームワークアクティベータ20(n+1)は、第n階層からのプラグイン接続に応じて、拡張情報一覧101(マップ)から拡張情報インスタンス13を取り出す(ステップS221)。ここでコンポーネントフレームワークアクティベータ20(n+1)は、プラグイン接続の引数であるプラグインコンポーネントIDをKeyとして拡張情報一覧101から拡張情報インスタンスを取得する。続いてコンポーネントフレームワークアクティベータ20(n+1)は、拡張情報インスタンス13から、ベースコンポーネントとなるコンポーネントのコンポーネントアクティベータインスタンスを取得する(ステップS223)。ここでコンポーネントフレームワークアクティベータ20(n+1)は、自身が所属する第n+1階層のコンポーネントアクティベータ31(n+1)のインスタンスを取得する。又、コンポーネントフレームワークアクティベータ20(n+1)は、拡張情報インスタンス13から、拡張コンポーネントIDを片方向線形リストとして取得する。詳細には、コンポーネントフレームワークアクティベータ20(n+1)は、プラグインコンポーネントID一覧102のインスタンスを取得する(ステップS222)。これにより、コンポーネントフレームワークアクティベータ20(n+1)は、自身に属するコンポーネント3−(n+1)(ベースコンポーネント)と当該コンポーネント3の拡張先コンポーネントとの組み合わせを把握することが可能となる。
続いて、コンポーネントフレームワークアクティベータ20(n+1)は、拡張先を指定するプラグインコンポーネントID一覧のインスタンスを引数として、プラグインコンポーネントインスタンスの生成をコンポーネントアクティベータ31(n+1)に要求する(ステップS224)。コンポーネントアクティベータ31(n+1)は、プラグインコンポーネント生成要求に応じて、第n+2階層用のプラグインコンポーネントファサード23(n+2)、コンポーネント内クラス群33(n+1)、コンポーネントタスク32(n+1)、コンポーネント責務34(n+1)を生成する(ステップS225〜S234、S236〜239)。又、コンポーネントアクティベータ31(n+1)は、プラグインコンポーネントファサード23(n+1)にコンポーネントタスク32(n+1)をアタッチする(ステップS235)。
詳細には、コンポーネントアクティベータ31(n+1)は、プラグインコンポーネント生成要求に応じて、プラグインコンポーネントファサードの生成処理に移行する(ステップS225)。ここでは、先ずコンポーネントアクティベータ31(n+1)は、拡張先となる第n+2階層用のプラグインコンポーネントファサードインスタンスを登録するためのファサード一覧105−(n+2)(マップ)を生成する(ステップS226)。続いて、コンポーネントアクティベータ31(n+1)は、ステップS224において通知されたプラグインコンポーネントID一覧102からプラグインコンポーネントIDインスタンスを取得する(ステップS227)。コンポーネントアクティベータ31(n+1)は、取得したプラグインコンポーネントIDインスタンスによりプラグインコンポーネントIDを取得する(ステップS228)。
コンポーネントアクティベータ31(n+1)は、プラグインコンポーネントIDで特定したコンポーネントに対するプラグインコンポーネントファサード23(n+2)を生成する(ステップS229)。続いてコンポーネントアクティベータ31(n+1)は、作成したプラグインコンポーネントファサードのインスタンスとプラグインコンポーネントIDとを対応づけてファサード一覧105−(n+1)に登録する(ステップS230)。
ステップS227からステップ230の処理は、プラグインコンポーネントID一覧に登録された全てのコンポーネント3−(n+2)に対して行われる。これにより、設定ファイル4−(n+1)において拡張先として設定された全てのコンポーネント3−(n+2)に対するプラグインコンポーネントファサード23(n+2)が、生成される。以降、処理の呼び出し側となるベースコンポーネント(ここではコンポーネント3−(n+1))はプラグインコンポーネントファサード23(n+2)を介して、拡張先コンポーネント(ここではコンポーネント3−(n+2))に対する処理を行うこととなる。
コンポーネントアクティベータ31(n+1)は、内部インスタンスの生成処理に移行し、プラグインコンポーネントファサード23(n+2)を引数としてコンポーネント内クラス群33(n+1)を生成する(ステップS231、S232)。続いてコンポーネントアクティベータ31(n+1)は、タスク生成処理に移行し、コンポーネントタスク32(n+1)を生成する(ステップS233、S234)。
コンポーネントアクティベータ31(n+1)は、生成したコンポーネントタスク32(n+1)をベースコンポーネント側で生成されたプラグインコンポーネントファサード23(n+1)にアタッチする(ステップS235)。これにより、プラグインコンポーネントファサード23(n+1)は、第n+1階層のコンポーネントタスク32(n+1)を呼び出すことが可能となる。
図19I及び図19Jを参照して、図19Aにおける(7)〜(8)の動作のうち、ステップS236〜S242を説明する。コンポーネントアクティベータ31(n+1)は、ステップS224におけるコンポーネント生成要求が、プラグインコンポーネントの生成要求であることからコンポーネント責務を生成し、プラグインコンポーネントファサード23(n+1)にアタッチする(ステップS236〜S240)。詳細には、コンポーネントアクティベータ31(n+1)は、先ず責務マップ104−(n+1)を生成する(ステップS237)。続いてコンポーネントアクティベータ31(n+1)は、コンポーネント責務34(n+1)を生成し、これを責務名に対応付けて責務マップ104−(n+1)に登録する(ステップS238、S239)。ステップS238、S239の処理は、コンポーネント3−(n+1)の責務数だけ行われる。コンポーネントアクティベータ31(n+1)は、責務マップ104−(n+1)をプラグインコンポーネントファサード23(n+1)にアタッチする(ステップS240)。これにより、プラグインコンポーネントファサード23(n+1)は、第n+1階層のコンポーネント責務34(n+1)を呼び出すことが可能となる。
又、コンポーネントアクティベータ31(n+1)は、ステップS224におけるプラグインコンポーネント生成要求の応答として、n+2階層用のファサード一覧105−(n+2)を、第n+1階層のコンポーネントフレームワークアクティベータ20(n+1)に渡す(ステップS241)。コンポーネントフレームワークアクティベータ20(n+1)は、ステップS241においてコンポーネントアクティベータ31(n+1)から渡されたファサード一覧105−(n+1)と、ステップ228)において取得したプラグインコンポーネントIDを引数として、第n+2階層のコンポーネントフレームワークアクティベータ20(n+2)に対し、プラグイン接続する。以降、ステップS221〜S242の処理と同様に第n+2階層における処理となる。
ステップS218〜S242の処理は、プラグインコンポーネントID一覧102に含まれる全てのプラグインコンポーネントIDに対して行われる。すなわち、ベースコンポーネントに対応する拡張先コンポーネントの数だけ、ステップS218〜S242の処理が行われる。尚、拡張先がない場合、ステップS220、S242の処理は省略される。
以上のような動作により、ベースコンポーネントである第n階層のコンポーネント3−nと、拡張先コンポーネントである第n+1階層のコンポーネント3−(n+1)が接続される。
拡張先のコンポーネントは、設定ファイル4−nによって決まるため、設定ファイル4−nの拡張先情報403を変更することで、容易に拡張先コンポーネントを変更することができる。この際、本発明によるコンポーネント責務は階層毎に決まっているため、すなわち、階層間で呼び出すコンポーネント責務が決まっているため、ベースコンポーネント側のプラグインコンポーネントファサード23(n+1)に拡張側のコンポーネント責務34(n+1)をアタッチすることで、コンポーネント間の接続が可能となる。
次に、図20Aから図20Eを参照して、本発明によるコンポーネント指向ソフトウェア構築よって構築されたシステムにおける処理動作の詳細を説明する。図20Aは、本発明によるコンポーネント指向ソフトウェア構築よって構築されたシステムにおける処理動作の全体を示すシーケンス図であり、図20Bから図20Eは、図20Aにおける(1)から(4)の動作を示すシーケン図である。
図20Bを参照して、図20Aにおける(1)の動作(ステップS301〜S305)を説明する。フレームワークコア10は、コンポーネントタスク32nに初期化を要求する(ステップS301)。ここでフレームワークコア10は、ステップS216においてアタッチされたコンポーネントタスク32nの初期化を要求する。コンポーネントタスク32nは、コンポーネント3−n内のクラス群33nに初期化を要求する(ステップS302)。コンポーネント内のクラス群33nは、第n+1階層用ファサード一覧105−(n+1)から、初期化対象となる拡張先コンポーネントに対応するプラグインコンポーネントファサード23(n+1)のインスタンスを取得する(ステップS303)。続いて、コンポーネント内のクラス群33nは、取り出したプラグインコンポーネントファサード23(n+1)を介して第n+1階層のコンポーネントタスク32(n+1)に初期化を要求する(ステップS304、S305)。ここでプラグインコンポーネントファサード23(n+1)は、ステップS235においてアタッチされたコンポーネントタスク32(n+1)に対し初期化を要求する。
図20Cを参照して、図20Aにおける(2)の動作(ステップS306〜S309)を説明する。第n階層から初期化を要求されたコンポーネントタスク32(n+1)は、コンポーネント3−(n+1)内のクラス群33(n+1)に初期化を要求する(ステップS306)。コンポーネント内のクラス群33(n+1)は、第n+2階層用ファサード一覧105−(n+2)から、初期化対象となる拡張先コンポーネントに対応するプラグインコンポーネントファサード23(n+2)のインスタンスを取得する(ステップS307)。続いて、取り出したプラグインコンポーネントファサード23(n+2)を介して、第n+2階層のコンポーネントタスク32(n+2)に初期化を要求する(ステップS308、S309)。以降、第n+2階層において、ステップS306〜S309と同様な動作により初期化処理が実行される。
尚、ステップS303〜S309の処理は、n+1階層用ファサード一覧105−(n+1)に登録された全てのプラグインコンポーネントファサード23(n+1)に対して行われる。又、ステップS306〜S309の処理は、n+2階層用ファサード一覧105−(n+2)に登録された全てのプラグインコンポーネントファサード23(n+2)に対して行われる。
次に、ステップS303〜S309の処理によって初期化されたシステムにおいて周期処理が行われる場合を一例に、本システムにおけるシステム構築後の処理動作を説明する。
図20D及び図20Eを参照して、図20Aにおける(3)及び(4)の動作のうち、ステップS401〜S411を説明する。コンポーネント3の初期化後、フレームワークコア10はコンポーネントタスク32nに対して周期通知する(ステップS401)。ここでは、ステップS216においてアタッチされたコンポーネントタスク32nに対して周期通知される。コンポーネントタスク32nは、周期通知に応じて周期処理を開始するとともに、コンポーネント3−n内のクラス群33nに周期通知する(ステップS402、S403)。コンポーネント内のクラス群33nは、第n+1階層用ファサード一覧105−(n+1)から、処理を行う拡張先コンポーネントに対応するプラグインコンポーネントファサード23(n+1)のインスタンスを取得する(ステップS404)。この際、コンポーネント内のクラス群33nは、周期処理するコンポーネントのプラグインコンポーネントIDをKeyとして、第n+1階層用ファサード一覧105−(n+1)からプラグインコンポーネントファサード23(n+1)のインスタンスを取得する。続いて、コンポーネント内のクラス群33nは、取り出したプラグインコンポーネントファサード23(n+1)に周期通知する(ステップS405)。プラグインコンポーネントファサード23(n+1)は、これに応じて第n+1階層のコンポーネントタスク32(n+1)に周期通知する(ステップS406)。ここでプラグインコンポーネントファサード23(n+1)は、ステップS235においてアタッチされたコンポーネントタスク32(n+1)に対し周期通知する。
コンポーネントタスク32(n+1)は、周期通知に応じて周期処理を開始するとともに、コンポーネント3−(n+1)内のクラス群33(n+1)を周期処理する(ステップS407、S408)。コンポーネント内のクラス群33(n+1)は、第n+2階層用ファサード一覧105−(n+2)から、処理を行う拡張先コンポーネントに対応するプラグインコンポーネントファサード23(n+2)のインスタンスを取得する(ステップS409)。この際、コンポーネント内のクラス群33(n+1)は、周期処理するコンポーネントのプラグインコンポーネントIDをKeyとして、第n+2階層用ファサード一覧105−(n+2)からプラグインコンポーネントファサード23(n+2)のインスタンスを取得する。続いて、コンポーネント内のクラス群33(n+1)は、取り出したプラグインコンポーネントファサード23(n+2)に対し周期通知する(ステップS410)。プラグインコンポーネントファサード23(n+2)は、これに応じて第n+2階層のコンポーネントタスク32(n+2)に周期通知する(ステップS411)。以降、第n+2階層において、ステップS407〜S411と同様な動作により処理が実行される。
図20D及び図20Eを参照して、図20Aにおける(3)及び(4)の動作のうち、ステップS412〜S417を説明する。コンポーネント3−n内のクラス群33nは、ステップS403の周期処理に応じて、プラグインコンポーネントファサード23(n+1)に対し第n+1階層の責務を実行する(ステップS412)。ここでコンポーネントのクラス群33nは、第n+1階層のコンポーネントフレームワーク2−(n+1)に定義された責務のメソッドを呼び出す。プラグインコンポーネントファサード23(n+1)は、第n+1階層のコンポーネント責務34(n+1)を実行する(ステップS413)。
コンポーネント責務34(n+1)は、コンポーネント3−(n+1)のクラス群33(n+1)に対し責務を満たす処理を実施する(ステップS414)。コンポーネント内のクラス群33(n+1)は、第n+2階層用ファサード一覧105−(n+2)から処理を実行する拡張先コンポーネントに対応するプラグインコンポーネントファサード23(n+2)のインスタンスを取得する(ステップS415)。続いて、コンポーネント内のクラス群33(n+1)は、取り出したプラグインコンポーネントファサード23(n+2)に対し第n+2階層の責務を実施する(ステップS416)。プラグインコンポーネントファサード23(n+2)は、これに応じて第n+2階層のコンポーネント責務34(n+2)を実行する(ステップS309)。以降、第n+2階層において、ステップS414〜S417と同様な動作により処理が実行される。又、ステップS415〜S417の処理は、第n+2層の責務を実行する場合に実施される。
以上のように、本発明によるシステム構築方法によれば、フレームワークコア1による拡張フレームワークの設定(ステップS110)によってコンポーネントフレームワークアクティベータ20n間が接続され、第n階層のコンポーネントフレームワークアクティベータ20nによって生成されたプラグインコンポーネントファサード23(n+1)に第n+1階層のタスクや責務がアタッチされることで、コンポーネントと拡張先コンポーネントとが接続される。システム構築後は、プラグインコンポーネントファサード23(n+1)を介して第n階層と第n+1階層のコンポーネント間が接続される。本発明では、プラグインコンポーネントファサード23(n+1)にアタッチされ得る責務は階層毎に予め決められている。このため、ステップS412において第n階層のコンポーネント内クラス群33nは、第n+1階層から呼び出すメソッド等を予め知ることができる。従って、階層毎に割り当てられた責務を有するコンポーネントは、その接続仕様を変更することなく、他の階層に属するコンポーネントと接続することが可能となる。設計者は、コンポーネント間の接続仕様を考慮する必要がなくなるため、コンポーネント3の機能開発のみに注力できる。又、コンポーネント3の接続先は、設定ファイル4に応じて変更できるため、ユーザはコンポーネントのコードを気にせず用にコンポーネントの接続を変更することが可能となる。
又、依存関係は、コンポーネントからフレームワーク方向のみなので、フレームワークはコンポーネント変更の影響を受けず、プログラム制御はフレームワークコア上で動作し、差分のみポリモフィズムでコンポーネントフレームワークやコンポーネントにおいて処理するため高品質となる。
以上、本発明の実施の形態を詳述してきたが、具体的な構成は上記実施の形態に限られるものではなく、本発明の要旨を逸脱しない範囲の変更があっても本発明に含まれる。図5に示す一例では、1つのコンピュータシステム900によって実現されるシミュレータや電子機器(例えばワードプロセッサや複合機)として説明したがこれに限らない。例えば、それぞれがCPUやインタフェースを有し独立の機能をもつ複数の装置(例示:マイコン、ICセンサ)によってコンピュータシステム900が構成されても構わない。この場合、複数の装置のそれぞれに記録されたコンポーネントが、インタフェースを介してマスタとなる装置に入力され、1つのソフトウェアシステムとして機能する。例えば、フレームワーク904と戦車コンポーネント3−2が記録された記憶装置を持つ戦車に、レーザセンサコンポーネント3−3Aが記録された記憶装置を持つレーザセンサが搭載された場合、上述の方法により、戦車コンポーネント3−2とレーザセンサコンポーネント3−3Aを接続して1つのシステムを形成してもよい。