1

CORBA を使い始める前に知りたいことがあります。

IDL 型を別の型の属性として使用でき、その属性のメソッドを ("." を使用して) クライアント アプリケーションにも公開できることは直感的に思えます。

しかし、これは可能ですか?

例 (私の悪い IDL を許してください):

interface Car{ 
      attribute BrakePedal brakePedal; 
      //... 
}



//then.. (place above) 

interface BrakePedal{ 
      void press(); 
      //... 
} 

//... 

次に、クライアント アプリで次のことができます。myCar.brakePedal.press();

この種のマルチレベル オブジェクト インターフェイスを実行できない場合、CORBA はつまらないものに見えます。結局のところ、現実世界のオブジェクトはマルチレベルですよね? それで、誰かが私の心を落ち着かせて、これが確実に機能するかどうかを確認できますか (または、既に CORBA をセットアップしている場合は試してみてください)。IDL ドキュメントのどれも、これを例として明示的に示していないため、私は心配しています。ありがとう!

4

2 に答える 2

1

属性を宣言することは、論理的には、属性の値を読み取るためのアクセサー関数とそれを書き込むためのアクセサー関数のペアを宣言することと同じです (readonly属性を指定することもできます。その場合、読み取り関数のみが取得されます)。

CORBA仕様から見えます。インターフェイス名を属性名として入れることができます。そのような IDL を omniORB の IDL から C++ へのトランスレータにフィードしようとしましたが、拒否されませんでした。だから許されると思います。

しかし、実際にこれをやりたいと思うかどうかは本当にわかりません。ほとんどの CORBA 専門家は、属性を使用する場合は、属性のみを使用することを推奨していreadonlyます。このような場合は、インターフェイスを返す独自の関数を宣言するだけです。

とにかく、C++ マッピングで必要な構文を実際に実行できないことに注意してください。例えば

server->brakePedal()->press();   // major resource leak here

brakePedal()CORBA オブジェクト参照を返す属性アクセサ関数です。すぐに呼び出すpress()と、オブジェクト参照がリークします。

リークなしでこれを行うには、次のようにする必要があります。

BrakePedal_var brakePedal(server->brakePedal());
brakePedal->press();

このシナリオでは、C++ マッピングを使用して、属性から必要な記法上の利便性を得ることができません (おそらく、Python マッピングでは可能でした)。このため、そして私は一般的に属性が嫌いなので、通常の関数を使用して BrakePedal インターフェイスを返します。

于 2010-08-26T13:59:56.740 に答える
0

分散オブジェクトについて重要なことを理解していません。リモート オブジェクト (CORBA、RMI、.NET リモート処理、または Web サービスで実装されているかどうか) は、ローカル オブジェクトと同じではありません。CORBA オブジェクトへの呼び出しは、コストがかかり、遅く、ネットワークの問題により失敗する可能性があります。object.attribute.method() 構文では、1 行で 2 つの異なるリモート呼び出しが実行されていることを確認するのが難しくなり、発生する可能性のあるエラーを処理するのが難しくなります。

于 2010-08-25T16:37:19.383 に答える