静的スケルトンインタフェースを使用したサーバアプリケーションの実装上のアプローチとして、以下の2つの方式が存在します。
継承方式
代理方式
ここでは、これら2つの実装方式とその特徴について説明します。
継承方式(Inheritance-Based Implementation)
新規にサーバアプリケーションを作成する場合に使用する一般的な実装方法です。サーバアプリケーションでスケルトンのメソッドを実装します。POAに対しては、スケルトンのクラス自身を登録します。
代理方式(Delegation-Based Implementation)
ユーザが開発した既存のクラスなどをServantとして使用する場合に有効な方法です。スケルトンを継承し、かつPOAの登録対象となるServantとしてtieクラスが用意されます。IDLコンパイラによりtemplate<class T> POA_<interface名>_tieクラスが生成されます。
ユーザが作成したインタフェース実装クラスのインスタンスは、tieクラス内のメンバオブジェクトとして登録します。オペレーションの起動は、いったんtieクラスを経由して登録したクラスのインスタンスに対して発行されます。
継承方式によるServantは、以下のような継承関係となります。サーバアプリケーションのメイン部では、このServantをPOAに登録します。
上図のとおり、継承方式ではServantは以下のようにスケルトンクラスを継承する形式で実装します。
module ODsample{ interface intf{ long add(in long a, in long b); }; };
class POA_ODsample_intf : public virtual PortableServer::ServantBase { : }; class ODsample_intf_impl : public virtual POA_ODsample_intf{ : CORBA::Long add( CORBA::Long a CORBA::Longint b CORBA::Environment& = CORBA::Environment() ) throw( CORBA::Exception ); : };
CORBA::Long ODsample_intf_impl::add{ return( a + b ); }
メイン処理部では、スケルトンクラスをPOAに登録します。以下の例では、Default Servantとして登録しています。
// Servantの生成 ODsample_intf_impl* svt = new ODsample_intf_impl(); // Default Servantに設定 aPOA->set_servant( svt );
注) aPOA:POAクラスのインスタンス
代理方式によるユーザクラス(インタフェース実装クラス)は、以下のような継承関係で実装します。サーバアプリケーションのメイン部では、tieクラス(POA_<インタフェース名>_tie)のインスタンスをPOAに登録します。継承方式を使用した場合のような規定の継承関係から解放されるため、実装の自由度が高くなります。ただし、tieクラスのメンバとして登録するため、インタフェース実装クラスをtieクラスと関連付ける必要があります。代理方式のアプリケーションの例については、“4.3.7 サーバアプリケーションのプログラミング例”を参照してください。
上図のとおり、代理方式では、ユーザクラスは以下のようにPOA_<interface名>tieインタフェースを実装するように記述します。
module ODsample{ interface intf{ long add(in long a, in long b); }; };
class POA_ODsample_intf : public virtual PortableServer::ServantBase { : } template <class T> class POA_ODsample_intf_tie : public virtual POA_ODsample_intf { : CORBA::Long add( CORBA::Long a, CORBA::Long b, CORBA::Environment &_env = CORBA::Environment() ) throw( CORBA::Exception ) { return _ptr->add( _env ); } : };
class UserClass { public : CORBA::Long add( CORBA::Long a, CORBA::Long b, CORBA::Environment&env ) throw( CORBA::Exception ) { return( a + b ); } };
メイン処理部では、いったんこのユーザクラスのインスタンスをtieクラスのインスタンスに登録します(tieクラスのコンストラクタの引数としてユーザクラスインスタンスを渡します)。さらに、tieクラスのインスタンスをPOAにServantとして登録します。以下の例では、Default Servantとして登録しています。
// ユーザクラスのインスタンス生成 UserClass* uc = new UserClass(); // ユーザクラスとtieオブジェクトの関連付け POA_ODsample_intf_tie< UserClass >* svt = new POA_ODsample_intf_tie< UserClass >( uc ); // Default Servantに設定 aPOA->set_servant( svt );
注) aPOA:POAクラスのインスタンス
継承方式、代理方式の特徴を以下の表に示します。
サーバアプリケーションの設計で、どちらの実装方式を使用するかはユーザの選択に任されます。
| 継承方式 | 代理方式 |
---|---|---|
主な用途 | 新規開発 | 既存資産の利用 |
実装の自由度 | 小さい。 | 大きい。 |
コーディングの複雑さ | 比較的簡潔となります。 | 複雑になりやすい。 |
性能 | オペレーションの起動に必要なスケルトン機能はServant自身に継承されているため、比較的よい。 | オペレーションの起動はtieクラスを経由するため、オブジェクトの参照が増加します。これにより多少のオーバヘッドがありえます。 |