Skip to content

Protocol Buffers Style

Proto の style guide を読んで, 自分ならこう書いていこうもの. Code style は大事.

TL; DR

filename = shouldbe/lower_snake_case/hoge.proto

 // This is the description about this proto file.
 // ......

 syntax = "proto3";

 package shoulebe.lower_snake_case;

 import "google/protobuf/empty.proto";

 option java_package = "com.fuga.grpc.hoge";
 option java_multiple_files = false;

 // service 定義内は, すべて UpperCamelCase で名付ける
 service HogeService {
     rpc Update (UpdateRequest) returns (UpdateResponse) {
     }
 }

 // メッセージ名は, UpperCamelCase
 message MyMessage {
     // フィールド名は, lower_snake_case で
     // repeated なら, 複数形に
     repeated string user_keys = 1;
 }

 enum HogeEnum {
     // UPPER_SNAKE_CASE で名付ける
     // 1つ目の enum value は, デフォルト値として `*_UNSPECIDIED` を用意する
     HOGE_ENUM_UNSPECIFIED = 0;
     HOGE_FIRST_VAL = 1;
 }

File formatting

  • 一行の長さに, 特別制限は設けない.
  • インデントは, スペース4文字とする.

File structure

  • ファイル名は, lower_snake_case で付ける.
  • ファイルは, 次の順で書いていく:
  • ファイルの概要
  • syntax = "proto3" 宣言
  • パッケージ名
  • import 文
  • ファイルオプション
  • その他

File options

  • java_package, java_multiple_files この辺は運用に合わせて決めたいところ.

Packages

  • パッケージ名は, lower_snake_case で付ける.
  • パッケージ名とディレクトリが一致するように, ファイルを配置する

Message and field name

  • メッセージ名は, UpperCamelCase で付ける.
  • フィールド名は, lower_snake_case で付ける.
 message SongServerRequest {
     string song_name = 1;
 }

Repeated fields

  • フィールド名を複数形にする
 message SongServerRequest {
     repeated string keys = 1;
     ...
     repeated MyMessage accounts = 17;
 }

Enums

  • enum名は, UpperCamelCase で付ける.
  • enum value名は, UPPER_SNAKE_CASE で付ける.
  • zero value enum として, ENUM_NAME_UNSPECIFIED を必ず定義する.
 enum Foo {
     // zero value enum
     FOO_UNSPECIFIED = 0;
     FOO_FIRST_VALUE = 1;
     FOO_SECOND_VALUE = 2;
 }

Services

  • サービス名およびメソッド名は, UpperCamelCase で定義する.
 service FooService {
     rpc GetSomething(FooRequest) returns (FooResponse);
 }

Tips

IntelliJ IDEA での proto を書き心地は, あまりよくない. いいプラグインがあれば知りたいところ.


Posted: 2020-07-28
Last update: 2021-03-02