2009-11-25 13 views
14

いくつかのバックエンドRPCサービスの新しいトランスポートとしてプロトコルバッファを導入しています。同様のオブジェクトの異なるフォーム間でデータを手動でシャットダウンすることに抵抗があるため、RPCサーバーインターフェイスだけではなく、少し上にスタックに渡されるプロトコルバッファインスタンスを確認できます。一般的なデータオブジェクトとしてプロトコルバッファを使用していますか?

これは私が避けようとしているものですか?プレーンデータホルダーのようなプロトコルバッファーオブジェクトを扱うことは安全ですか?それは、バイナリーの内部と外部に素早く効率的に変換できるという便利な点ですか?

私がデータオブジェクトを生成する良い方法であると考えているもう一つの理由は、必須/オプションフィールドと自動的に生成されたビルダーインタフェースの概念です。

答えて

9

まあ、それらは不変であるので、便宜的に使用するのは便利ではありません。ビルダーを渡すことができますが、かなり長い型名になります。また、プロトコルバッファ(および独自のメッセージ)でサポートされているデータ型に限定されています。

これを行うには安全ですが、必ずしもデザインが最も良いとは限りません。一方、ときには、それは医師が注文したものです。

私はあなたに実験をすることをお勧めします。

+0

私は、このようなプロトコルバッファを使用すると、実際には不変であるという事実が役立ちますが、痛いことではないと思います。それらはStringのような不変の値オブジェクトです。 –

+0

機能的なスタイルでコードを書くことができる場合は、確かに役に立ちます。部分的には問題に依存し、部分的には開発者に依存します:) –

+0

不変なことは、最終的なフィールドにすべて割り当てられた12以上のパブリックな構造が存在するという未知の理由のために実際に役立ちます。ビルダーは素晴らしいが、退屈であり、毎回書くためには定型文である。必須フィールドと省略可能なロジックのロジックを取得するのは難しいので、必要なフィールドが省略されているとbuild()メソッドが爆発します。 –

0

一般に、あるレイヤの実装の詳細が互いに漏れないように、私は自分のシステムのレイヤを設計します。私はGoogleのプロトコルバッファーを直接経験していませんが、トランスポートやシステムの上位レイヤーで同じ表現を使用するように思えます。

トランスポート表現としてのプロトコルバッファの使用を止めたいと思ったら、何か他のものを使うのはどれくらい簡単でしょうか?

+0

これは実際には正確にその方向に向かっています。現在、一連のインタフェースがデータレイヤー、バックエンドRPC *、*にRESTful Webサービスレイヤーを拡張するよう指示しています。 *痛み*。ステップ#1は、バックエンドをプロトコルバッファで置き換えて、それを他と切り離すことです。しかしそれは優れた点です。すべてをprotobufsに切り替えるだけで、私が切り離した唯一のことは、クライアントとRPCサービス間のリンクですが、他のすべてのレイヤはMessageオブジェクトに依存します...悪いです。 –

関連する問題