web-dev-qa-db-ja.com

プロトコルバッファの将来の追加列挙値を設計するにはどうすればよいですか?

プロトコルバッファの魅力的な機能の1つは、古い定義を使用するコードを壊すことなくメッセージ定義を拡張できることです。列挙型の場合 ドキュメントによる

列挙型のフィールドは、指定された定数のセットの1つのみを値として持つことができます(別の値を指定しようとすると、パーサーはそれを不明なフィールドのように扱います)

したがって、列挙型を拡張して新しい値を使用すると、古いコードでそのタイプのフィールドが未定義になるか、デフォルト値がある場合はデフォルト値になります。

将来、列挙型に付加価値が追加される可能性があることを知って、これに対処するための良い戦略は何ですか?

頭に浮かぶ1つの方法は、列挙型の「未定義」メンバーを定義し、それをデフォルトにすることです。そうすると、古いコードは、解釈できないものが送信されたことを認識します。それは賢明ですか、この状況に対処するためのより良い方法はありますか?

31
glennr

はい、最善のアプローチは、列挙型の最初の値をUNKNOWN = 0のようなものにすることです。次に、認識できない列挙値を持つprotobufを読み取る古いプログラムは、それをUNKNOWNと見なし、その要素をスキップするなどして、それを合理的に処理できることを願っています。

これを実行する場合は、列挙型をoptionalではなくrequiredにすることもできます。

requiredは、一般的に、「理解できないものを処理するよりも、プログラムを中止したい」という意味です。

プロトソースで宣言された最初の値でなければならないことに注意してください-ゼロ値であるだけではデフォルトにはなりません。

21
poolie