Protobuf命名约定

Bla*_*jac 12 protocol-buffers

除了谷歌提供的相当简短的风格指南,这里是我对命名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()如果有重复的子字段.

人们使用或不同于这些标准吗?

Mic*_*Sun 10

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

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

  2. 虽然没有正式指定,但这听起来是一个很好的建议,因为通常你会在文件夹中放置多个proto.

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

  4. 是.请阅读以下内容以了解使用它:https://developers.google.com/protocol-buffers/docs/javatutorial

  • 关于#1,它们是该语言中的一类,但它们表示一条消息。如果这有助于在回购中将personMessage与person数据类区分开,那么这不是多余的,其他地方的person视图模型等 (2认同)

Bro*_*ype 9

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

repeated PhoneNumber phones = 4;
repeated Person people = 1;
Run Code Online (Sandbox Code Playgroud)

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

repeated Result results = 1;
repeated string snippets = 3;
Run Code Online (Sandbox Code Playgroud)

  • 使用复数字段名称是多余的,因为它已经被指示为“重复”。对于您引用的“results”示例,编译器生成“getResults(int index)”和“getResultsList()”getter,这很笨拙且可能会产生误导,尤其是在您使用动态语言时。理想情况下,编译器会很聪明,从复数字段名称推断单数形式,并生成“getResult(int)”和“getResults()”。但这本身也可能令人困惑,并且会导致不必要的计算。 (2认同)
  • 谷歌 API 设计指南显然不同意我的看法:https://cloud.google.com/apis/design/naming_convention#repeated_field_names (2认同)