Protobuf命名约定

时间:2010-11-08 04:05:19

标签: protocol-buffers

除了Google提供的style guide相当短的内容之外,我还想到了如何命名Google协议缓冲区消息。

  1. 在消息类型名称末尾使用“消息”。

    • 这使得在源代码中很容易看到类是protobuf生成的类。这也有一个好处,如果我有一个丰富的域特定类,那么它可以有真实的名称,比如protobuf类的AddressBookMes​​sage和真实类的AddressBook。
  2. 对于Java用户来说,java_outer_classname中的Protos结尾似乎是标准用户。

    • 我最初没有注意到这一点,所以我目前的protobuf类都在com.example.project.protobuf.MyProtos,但我没有理由把它保留在那里,因为我们需要有一个包含类,所以它可能是移至com.example.protobuf.MyProtos,除非项目的顶级包中没有类。
  3. 从0开始枚举以匹配C / C ++。

  4. 对重复字段使用单数名称。

    • 大多数生成的方法使用单数字段名称听起来更好,即使它被重复,例如message-> add_child(),而不是message-> add_children(),如果有一个重复的子字段。
  5. 人们是否使用或与这些标准不同?

4 个答案:

答案 0 :(得分:9)

免责声明:每天使用protobufs从Google员工那里回答。我决不以任何方式代表谷歌。

  1. 不要这样做。编译的协议缓冲区只是您正在使用的语言指定的类定义,并进行了一些改进。添加“消息”是额外的冗长。通常你只使用没有其他类定义的协议缓冲区,即使你使用其他类定义,只需导入java_outer_classname并从中做一个点。你甚至可以在代码中放置一个东西的完整路径来擦除一行导入,没问题。

  2. 虽然没有正式指定,但这听起来是个不错的建议,因为通常你会在一个文件夹中放置一个以上的原型。

  3. 通常从0开始。请参阅协议缓冲区语言指南。

  4. 是。阅读以下内容以获得使用它的感觉:https://developers.google.com/protocol-buffers/docs/javatutorial

答案 1 :(得分:3)

我不同意答案4.在链接文章中我只能找到这样的例子:

repeated PhoneNumber phones = 4;
repeated Person people = 1;

即使在https://developers.google.com/protocol-buffers/docs/proto3中,我们也只能找到复数:

repeated Result results = 1;
repeated string snippets = 3;

答案 2 :(得分:2)

您正在寻找的是 https://cloud.google.com/apis/design/ ,其中讨论了Google自己的API中使用的protobuf / gRPC设计惯例。

protobuf风格指南(https://developers.google.com/protocol-buffers/docs/style)就像你说的那样短暂。

答案 3 :(得分:0)

与此同时,Google似乎在https://developers.google.com/protocol-buffers/docs/style上为repeated字段名称(第4点)添加了一个准则:

  

对重复的字段使用复数名称。

repeated string keys = 1;
...
repeated MyMessage accounts = 17;

它为add_<field_name>成员函数生成一个错误的函数名:

// Bad method name.
auto* const newKey = msg.add_keys();
// OK!
auto* const anotherNewKey = msg.mutable_keys()->Add();
// OK!
auto const * const allKeys = msg.keys();
auto const& firstKeys = msg.keys(0);

有人可能会说第一种方法无论如何都是多余的。通过使用mutable_<field_name>成员函数,如果将多个字段名用于repeated字段,则不会看到关于丑陋的方法名的任何问题。

因此,从现在开始,我将尝试遵循此准则。这样做的另一个原因:在C ++中,我们也倾向于对容器/集合使用复数变量名称,例如

auto keys = std::vector<std::string>{};
相关问题