(57)【要約】【課題】永続化オブジェクトやそれを検索・挿入・削除・更新するための実装は冗長であるため、それを簡潔に定義する特別な言語が使われる。具体的には、特別な言語で記述した定義ファイルから生成されたソースコードをコンパイルして実装を得る方法が使われる。しかし、この方法は定義ファイルと実装の一貫性維持のために手間がかかり、さらに特別な言語に関する新たな知識が必要となる。【解決手段】図1の永続化アダプタ生成装置1gは、アプリケーションプログラム1p固有の永続化インターフェイス1Xから汎用永続化オブジェクト1eへ呼出を翻訳する永続化アダプタ1aを実行時に生成する。【選択図】図１
2006011712.tif 000002
【特許請求の範囲】
【請求項１】
永続化アダプタの生成をコンピュータに行わせるプログラムであって、アプリケーションプログラム固有の永続化インターフェイスから抽出したメタ情報に基づいて、前記インターフェイスに従ったメソッド呼出を汎用永続化オブジェクトのメソッド呼出に翻訳する永続化アダプタを前記アプリケーションプログラム実行時に生成する、ことを前記コンピュータに実行させるプログラム。
【請求項２】
前記永続化アダプタは前記インターフェイスのインスタンスであり、前記汎用永続化オブジェクトのインスタンスへアクセスする手段を持ち、前記インターフェイスから継承する各メソッドのメソッド呼出を前記汎用永続化オブジェクトのメソッド呼出へ翻訳する、ことを前記コンピュータに実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、オブジェクトを永続化するソフトウェアの開発・保守を容易にするための永続化アダプタ生成装置とそれを実現するためのプログラムと方法に関する。
【背景技術】
【０００２】
オブジェクト指向データベースやそれを擬似的に実現するオブジェクト・リレーショナル・マッピングなどを利用するアプリケーションプログラムの開発・保守では、そのアプリケーションプログラム固有の永続化API（永続化オブジェクトやそれを検索・挿入・削除・更新するため）の実装が必要である。しかし、その実装は冗長であるため、それを簡潔に定義する特別な言語（DDL・ODL・XMLを用いた独自の言語など）が使われる。具体的には、特別な言語で記述した定義ファイルから生成されたソースコードをコンパイルして実装を得る方法が使われる。特許文献１〜１１はこのような方法に関連する特許文献である。しかし、この方法は定義ファイルと実装の一貫性維持のために手間がかかり、さらに特別な言語に関する新たな知識が必要となる。
【０００３】
そこで、従来の状況を改善する方法として特許文献１２が提案されている。この方法では、永続化オブジェクトの実装は従来のように定義する必要があるが、それを検索・挿入・削除・更新するための実装はあらかじめ用意してある汎用的な永続化APIを使う。この方法は従来の方法よりも定義する必要がある実装が少ないため、手作業であっても現実的なコストでそれを定義できる。そのため、従来の状況が改善されていると言える。しかし、永続化オブジェクトの実装は冗長であるため、従来の状況を完全に解決したとは言えない。
【０００４】
また、この方法には重大な欠点がある。あらかじめ用意してある汎用永続化APIは呼出時に与えられた永続化オブジェクトの構造に基づき汎用的に処理を行うため、永続化オブジェクトに格納されているデータが変化したタイミングで処理できない。例えば、２つの永続化オブジェクト間の関連（Person.getMyCars():Car[]とCar.getOwner():Person）はアクセスの主体となる永続化オブジェクトが異なるだけで同じ関係である。そのため、これらの一貫性を維持する必要があるが、汎用永続化APIが呼出されるまでは一貫性が保障されない。もし、この関連の一貫性は完全に維持したい場合、永続化オブジェクトにそのある処理を実装する必要がある。そのため、このような場合、一貫性維持のための実装を定義するコストがかかる。そして、このような場合は頻繁にあるため、従来のように特別な言語を使う必要がある状況に陥る。
【特許文献１】特開平８−２２１２７４
【特許文献２】特開平８−２６３２７７
【特許文献３】特願平８−５３２６５４
【特許文献４】特開平１０−９１４９４
【特許文献５】特開平１１−１０２２９３
【特許文献６】特開２０００−１２２９０３
【特許文献７】特開２０００−１５５７０６
【特許文献８】米国特許５２９１５８３
【特許文献９】米国特許５２９５２５６
【特許文献１０】特表２００１−５１８６７０
【特許文献１１】米国特許５２１２７８７
【特許文献１２】米国特許５８５７１９７
【発明の開示】
【発明が解決しようとする課題】
【０００５】
本発明は、「定義ファイルと実装の一貫性維持のために手間がかかる」課題と「特別な言語に関する新たな知識が必要となる」課題を解決する。
【課題を解決するための手段】
【０００６】
本発明は、上記の課題を解決するため、アプリケーションプログラム固有の永続化インターフェイスから抽出したメタ情報に基づいて、前記インターフェイスに従ったメソッド呼出を汎用永続化オブジェクトのメソッド呼出に翻訳する永続化アダプタを前記アプリケーションプログラム実行時に生成するもので、以下の構成を特徴とする。
【０００７】
前記永続化アダプタは前記インターフェイスのインスタンスであり、前記汎用永続化オブジェクトのインスタンスへアクセスする手段を持ち、前記インターフェイスから継承する各メソッドのメソッド呼出を前記汎用永続化オブジェクトのメソッド呼出へ翻訳する。
【発明の効果】
【０００８】
本発明によると、アプリケーションプログラム固有の永続化インターフェイスを定義し、それを永続化アダプタ生成装置に与えるだけで、永続化アダプタ（アプリケーションプログラム固有の永続化オブジェクト）を生成できる。永続化アダプタはコンピュータのメモリ中にしか存在せず、実行時に生成されるものなので、アプリケーションプログラム固有の永続化インターフェイスとの一貫性が保障される。従来の方法では、一貫性維持のために実行前に永続化アダプタを明示的にコンパイル・配置する必要があるため手間がかかった。
【０００９】
また、アプリケーションプログラムによる永続化処理は永続化アダプタを経由して行われるため、常に監視することができる。そのため、常に永続化オブジェクト間の一貫性を保障できる。従来の方法では、永続化オブジェクト間の一貫性維持のためにアプリケーションプログラム固有の永続化オブジェクトの実装を保守する必要があるため手間がかかった。
【発明を実施するための最良の形態】
【００１０】
本発明を実施するための最良の形態は図１に示される。図１の永続化アダプタ生成装置1gは永続化アダプタ1a（アプリケーションプログラム1p固有の永続化インターフェイス1Xを継承する永続化オブジェクト）を生成する。1pは実行時にいつでも1aを生成でき、1aを使って永続化処理を行える。1pの永続化処理は1aのメソッド呼出として行われ、1aはメソッド呼出を汎用永続化オブジェクト1eのメソッド呼出に翻訳することで、永続化処理を実現する。
【００１１】
詳細な解説をするために図１の読み方を説明する。この図ではJava（登録商標）やC#のようなオブジェクト指向プログラミング言語で使われている一般的な概念を利用している。角が丸い四角はオブジェクト、角が尖った四角はクラスを表す。オブジェクトやクラスの間の矢印「継承」は、矢元のオブジェクトまたはクラスが矢先のクラスを継承している（性質を受け継いでいる）ことを表す。オブジェクト間の矢印「s.t(u1,...,un)→v」は、オブジェクトsのメソッドtに引数u1,...,un(n=1,2,...)を適用して呼び出すとvが得られることを表す。vがφであるときは値が得られない呼出であることを表す。また、オブジェクト間の矢印「new S(u1,...,un)→s」は、クラスSのコンストラクタに引数u1,...,un(n=1,2,...)を適用して呼び出すとオブジェクトsが得られることを表す。オブジェクト間の矢印の中の丸で囲まれた数字は呼出が発生する順序を表す。この丸で囲まれた数字は本文中では丸括弧で囲まれた数字として表現される。以上の規則に従わない部分に関しては個別に説明する。
【００１２】
図１の1gは永続化アダプタ生成を行うメソッドcreateAdapterを持っている。1pがこのメソッドを呼び出す（(1) 1g.createAdapeter(1X)→1a）と、1gは1Xを継承する永続化アダプタ実装1Aを生成（(2) 生成(1X)→1A）し、1Aをインスタンス化（(3) new 1A()→1a）して得られた永続化アダプタ1aを1pへ返す。
【００１３】
処理(2) が生成する1Aは、1Aのコンストラクタ呼出を1Eのコンストラクタ呼出へ、1Aの各メソッド呼出を1Eのメソッド呼出へ翻訳しなければならない。1Aのどのようなコンストラクタやメソッドの呼出を1Eのどのようなコンストラクタやメソッドの呼出へ翻訳するかは具体的な実施形態に依存する（ある永続化オブジェクトから他の永続化オブジェクトを検索する手段を1Xのメソッドとして定義できるようにするための翻訳方法と1Eの組み合わせも考えられる）。
【００１４】
例えば、1Aがプロパティ（永続化オブジェクトやデータを格納する変数）を更新・参照するメソッドの集合を定義し、1Eがそれを汎用的に表す場合、図１のような翻訳が考えられる。1Aのコンストラクタ呼出（(3) new 1A()→1a）は1Eのコンストラクタ呼出（(4) new 1E()→1e）へ、1AのプロパティVを更新するメソッド呼出（(5) 1a.setV(v)→φ）は1Eのメソッド呼出（(6) 1e.set(”V”,v)→φ）へ、1AのプロパティVを参照するメソッド呼出（(7) 1a.getV()→φ）は1Eのメソッド呼出（(8) 1e.get(”V”)→v）へ翻訳できる。
【００１５】
例の他にも様々な1Aから1Eへの翻訳方法が存在するが、具体的な翻訳方法については本発明の範疇ではないため（本発明は、1Xによる永続化処理が1Eによる永続化処理へ翻訳するために1Aを生成することであって、どのような翻訳を行うかではないため）、これ以上は触れない。
【００１６】
1Aは図２のようにも実現方法できる。この方法を説明するために、まず、オブジェクトアダプタについて説明する。オブジェクトアダプタはメソッドの呼出をメタ的なメソッド呼出へ翻訳するオブジェクトである。オブジェクトアダプタは次のようにしてこれを実現する。まず、オブジェクトアダプタ実装Sのコンストラクタ呼出「new S(w)→s」はw（メタインターフェイス2Mのインスタンス）をsのフィールドに格納する。そして、sのメソッド呼出「s.t(u1,...,un)→v」をwのメソッド呼出「w.invoke(s,”t”,{[u1],...,[un]})→[v]」へ翻訳する。「{[u1],...,[un]}」は[u1],...,[un]を要素とした配列オブジェクトである。「[u1]」・「[un]」・「[v]」はu1・un・vを単純に格納する箱として機能するオブジェクトである。
【００１７】
図２の2gは永続化アダプタ生成を行うメソッドcreateAdapterを持っている。2pがこのメソッドを呼び出す（(1) 2g.createAdapeter(2X)→2a）と、2gは2Xを継承する永続化アダプタ実装（オブジェクトアダプタ実装）2Aを生成（(2) 生成(2X)→2A）し、永続化メタオブジェクト実装2Nをインスタンス化（(3) new 2N()→2n）し、2Aをインスタンス化（(5) new 2A(2n)→2a）して得られた永続化アダプタ（オブジェクトアダプタ）2aを2pへ返す。図２では、2Nのインスタンス化は汎用永続化オブジェクト実装2Eのインスタンス化に翻訳されるが、他の翻訳方法も考えられる。
【００１８】
例えば、2Aがプロパティを更新・参照するメソッドの集合を定義し、1Eがそれを汎用的に表す場合、図２のような翻訳が考えられる。2AのプロパティVを更新するメソッド呼出（(6) 2a.setV(v)→φ）は、2Nのメソッド呼出（(7) 2n.invoke(2a,”setV”,{[v]})→null）へ翻訳でき、さらに、それは2Eのメソッド呼出（(8) 2e.set(”V”,v)→φ）へ翻訳できる。2AのプロパティVを参照するメソッド呼出（(9) 2a.getV()→φ）は2Nのメソッド呼出（(10) 2n.invoke(2a,”getV”,{})→[v]）へ翻訳でき、さらに、それは2Eのメソッド呼出（(8) 2e.get(”V”)→v）へ翻訳できる。
【００１９】
図２の実現方法は図１の実現方法に比べて性能面で問題があるが、2Eへの翻訳方法を2Mのインスタンスとして簡単に交換・保守できる利点がある。
【００２０】
1Aや2Aのような永続化アダプタ実装を実行時に生成する方法は２種類ある。前の例で述べたような1Aや2Aを表すソースコードを実行時に生成し、それをコンパイルして得られる1Aや2Aをメモリへ実行時に読み込む方法とコンパイルして得られる1Aや2Aと同じものをメモリへ直接生成する方法である。前者は、ソースコードコンパイラとコンパイルして得られるモジュールを実行時にメモリへ読み込む仕組みが必要である（Java（登録商標）やC#のような一般的な処理系には備わっている）。後者はコンパイラが必要ない代わりに、1Aや2Aを機械語で表す必要がある。前者は実行時にコンパイラが必要であるため適用できる状況が極端に減少する。後者は処理系によって機械語が異なるため適用できる状況が減少する（Java（登録商標）やC#のように処理系が仮想機械であれば問題はない）。
【図面の簡単な説明】
【００２１】
【図１】永続化アダプタ生成装置の実施形態を表した説明図である。
【図２】永続化アダプタ生成装置の実施形態を表した説明図である。
【符号の説明】
【００２２】
１桁目が図面番号、２桁目が図面中の物を識別する記号である。２桁目が同じ２つの符号は同じ物を表す。
1p            アプリケーションプログラム
1g            永続化アダプタ生成装置
1X            永続化インターフェイス
1A            永続化アダプタ実装
1a            永続化アダプタ
1E            汎用永続化オブジェクト実装
1e            汎用永続化オブジェクト
2p            アプリケーションプログラム
2g            永続化アダプタ生成装置
2X            永続化インターフェイス
2A            永続化アダプタ実装（オブジェクトアダプタ実装）
2a            永続化アダプタ（オブジェクトアダプタ）
2M            メタインターフェイス
2N            永続化メタオブジェクト実装
2n            永続化メタオブジェクト
2E            汎用永続化オブジェクト実装
2e            汎用永続化オブジェクト
【図１】
2006011712.tif 000003
【図２】
2006011712.tif 000004