0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

protobuf.devのAPI Best Practicesを読んでいく全部俺Advent Calendar 2024

Day 3

API Best Practices ~プリミティブ型をトップレベルのメッセージ定義に含めない , 後でもっとパターンが増える可能性があるものにはboolを使わないこと

Last updated at Posted at 2024-12-02

プリミティブ型をトップレベルのメッセージ定義に含めない

トップレベルのメッセージ定義は殆どの場合、独立して拡張できるよう他のメッセージの集合体であるべきです。
単一のプリミティブ型だけが必要な場合でも、それをラップすることでその型を拡張し同じような値を返す他のメソッド間で型を共有する汎用性も生まれます。

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;
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?