2010-11-08 233 views
6

除了Google提供的相当短的style guide之外,这里还有关于命名Google Protocol Buffer消息的想法。Protobuf命名约定

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

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

    • 我开始并没有注意到这一点,所以我目前的protobuf类是com.example.project.protobuf.MyProtos,但我不明白了一个道理,以保持它有鉴于我们需要有一个包含类,因此它可以被移动到com.example.protobuf.MyProtos,除非项目的顶层包中没有类。
  3. 在0开始枚举以匹配C/C++。

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

    • 大多数生成的方法在使用单个字段名称时听起来会更好,即使它是重复的,例如, message-> add_child(),而不是message-> add_children()(如果有一个重复的子字段)。

是否有任何其他标准的人使用或从这些有什么不同?

+0

你是什么意思“在0开始枚举匹配C/C++”的意思? – bialix 2010-11-09 16:14:13

+0

@bialix,为枚举成员赋值,Protobuf样式页面从1开始显示它们,请参阅http://code.google.com/apis/protocolbuffers/docs/style.html中的“enum Foo”。但我看到其他页面上从0开始的其他示例。 – 2010-11-09 18:12:25

回答

3

免责声明:每天使用protobufs的Google员工的答案。我绝不代表Google。

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

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

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

  4. 是的。阅读下面有一些使用它的感觉:https://developers.google.com/protocol-buffers/docs/javatutorial

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

使用复数字段名称是多余的,因为它已被指示为“重复”。对于你引用的'results'例子,编译器生成'getResults(int index)'和'getResultsList()'getters,这很尴尬,可能会误导你,特别是如果你使用的是动态语言。 理想情况下,编译器将会对其进行智能化,从复数字段名称中推断出单数形式,并生成'getResult(int)'和'getResults()'。但这也可能会让人感到困惑,并且会招致不必要的计算。 – olebebo 2017-08-17 09:32:48