フィールドはスカラやenumではなく、繰り返しメッセージにする
一般的に拡張していくと、単一の繰り返しフィールドが複数の関連する繰り返しフィールドへ足し算されていくかと思いますが、これはよくありません。
繰り返しメッセージから始めると、拡張性がよくなります。
// Describes a type of enhancement applied to a photo
enum EnhancementType {
ENHANCEMENT_TYPE_UNSPECIFIED;
RED_EYE_REDUCTION;
SKIN_SOFTENING;
}
message PhotoEnhancement {
optional EnhancementType type;
}
message PhotoEnhancementReply {
// Good: repeated message で定義しておくと、後からフィールド追加できたり
// enum より拡張性が高い
repeated PhotoEnhancement enhancements;
// Bad: もしパラメーター追加したい場合は、同じように repeated hogeType を追加するか(ひどい)
// このフィールドを非推奨にして繰り返しメッセージを導入する必要がある。
repeated EnhancementType enhancement_types;
}
これは map にも同様に適用されます。 map<string, string>
よりは map<string, MyProto>
にしておくとよいでしょう。
例外として、レイテンシクリティカルなアプリケーションでは、プリミティブ型の並列配列は、単一のメッセージ配列よりも高速です。