設計上の質問:IPCメカニズムに透過的にアクセスするにはどうすればよいですか?
-
10-07-2019 - |
質問
これを行いたい(特定の言語はなし):
print(foo.objects.bookdb.books[12].title);
またはこれ:
book = foo.objects.bookdb.book.new();
book.title = 'RPC for Dummies';
book.save();
fooが実際にはIPCを介してプログラムに接続されているサービスであり、そのメソッドとオブジェクトにアクセスするために、一部のレイヤーは実際にネットワーク経由でメッセージを送受信します。
今は、IPCメカニズムを探しているわけではありません。選択できるものがたくさんあります。 XMLベースではなく、sである可能性があります。番目。 Googleのプロトコルバッファ、dbusまたはCORBAなど。不明な点は、アプリケーションをどのように構成して、オブジェクトと同じようにIPCにアクセスできるようにするかです。
つまり、プロセスの境界を越えて透過的にマッピングするOOPを使用するにはどうすればよいですか?
これは設計上の問題ではなく、アーキテクチャ全体のかなり高いレベルで作業を続けています。だから、私はこれがどの言語になるのかについてはまだ非常に不可知論者です。しかし、C#、Java、Pythonはすべて使用される可能性が高いです。
解決
やってはいけません!プログラマーにとって、コード内でIPC / RPCとローカルメソッド呼び出しの違いを見て感じることは非常に重要です。そうすれば、彼らはそれについて考える必要がなく、彼らはそれについて考えないだろうし、それは非常にパフォーマンスの悪いコードにつながるでしょう。
考えてみてください:
foreach o, o.isGreen in someList {
o.makeBlue;
}
プログラマーは、ループが完了するまでに数ナノ秒かかると想定していますが、someListがリモートにある場合は1秒近くかかります。
他のヒント
あなたが要求していることをする方法は、すべてのオブジェクト通信をメッセージパッシングとみなすことだと思います。これが、特にオブジェクトメソッドがrubyやsmalltalkで処理される方法です。
オブジェクトの通信メカニズムとして(メソッド呼び出しではなく)メッセージの受け渡しを行うと、オブジェクトがメッセージに対して賢明な何かを行うことができるため、コードを記述したときに存在しなかったメソッドの呼び出しなどの操作が賢明になります(チェックリモートプロシージャの場合、データベースなどから同じ名前のフィールドの値を返すか、「メソッドが見つからない」例外、または考えられるその他の例外をスローします。)
これをデフォルトのメカニズムとして使用しない言語では、メッセージの受け渡しを行うことができます(すべてのオブジェクトに 'handleMessage'メソッドがあります)が、構文の見栄えは得られず、 IDEがhandleMessageメソッドを解析して有効な入力をチェックするための余分な努力をせずにIDEヘルプを取得することはできません。
Javaの RMI -入門マテリアルは、リモートオブジェクトのローカル定義を持つ方法を示しています。
トリックは、同じメソッドシグネチャを持つ2つのクラスを持つことです。クラスのローカルバージョンは、一部のネットワークプロトコル上のファサードです。リモートバージョンは、ネットワーク経由でリクエストを受信し、オブジェクトの実際の作業を行います。
クライアントが持つことができるようにクラスのペアを定義できます
foo= NonLocalFoo( "http://host:port" )
foo.this= "that"
foo.save()
そして、サーバーはクライアント接続からset_this()およびsave()メソッドのリクエストを受け取ります。サーバー側は、多くの発見とインスタンス管理の問題があるため、(一般的に)自明ではありません。