プリミティブ型をトップレベルのメッセージ定義に含めない
トップレベルのメッセージ定義は殆どの場合、独立して拡張できるよう他のメッセージの集合体であるべきです。
単一のプリミティブ型だけが必要な場合でも、それをラップすることでその型を拡張し同じような値を返す他のメソッド間で型を共有する汎用性も生まれます。
例
message MultiplicationResponse {
// Bad: NumericResult のように後で拡張したくても、型変更が破壊的変更になる
optional double result;
// Good: 拡張性がある
optional NumericResult result;
}
message NumericResult {
optional double real_value;
optional double complex_value;
optional UnitType units;
}
例外が1つ:
文字列が実際に構造化されたプロトのエンコードである場合、継続トークン、バージョン情報トークン、IDはすべて文字列として返すことができます。
後でもっとパターンが増える可能性があるものにはboolを使わないこと
フィールドにboolを使用する場合は、そのフィールドが本当に2つの状態を記述していることを確認してください。
(現在と近い将来だけでなく利用停止する最後の瞬間まで)
message GooglePlusPost {
// Bad: この投稿を2つのカラムにまたがって表示するかどうかを想定したbool
optional bool big_post;
// Good: 将来的にカラムは増える可能性もありそうなので、拡張性を考慮し他のメッセージ型とする
optional LayoutConfig layout_config;
}
message Photo {
// Bad: gifかどうかだけを表すbool
optional bool gif;
// Good: 参照する写真のファイル形式(例:GIF、WebP、PNG)
optional ExtensionType type;
}
enum ExtensionType {
EXTENSION_TYPE_UNSPECIFIED = 0;
EXTENSION_TYPE_GIF = 1;
// EXTENSION_TYPE_WEBP = 2;
// EXTENSION_TYPE_PNG = 3;
}