Protocol buffers Protobuf命名约定

Protocol buffers Protobuf命名约定,protocol-buffers,Protocol Buffers,除了Google提供的很短的消息外,以下是我对命名Google协议缓冲区消息的想法 在消息类型名称的末尾使用“Message” 这使得在源代码中很容易看到类是protobuf生成的类。这还有一个优点,如果我有一个丰富的特定于域的类,那么它可以有真实的名称,比如protobuf类的AddressBookMessage和真实类的AddressBook 对于Java用户来说,让Java\u outer\u classname以Protos结尾似乎是标准的 起初我没有注意到这一点,所以我当前的pr

除了Google提供的很短的消息外,以下是我对命名Google协议缓冲区消息的想法

  • 在消息类型名称的末尾使用“Message”

    • 这使得在源代码中很容易看到类是protobuf生成的类。这还有一个优点,如果我有一个丰富的特定于域的类,那么它可以有真实的名称,比如protobuf类的AddressBookMessage和真实类的AddressBook
  • 对于Java用户来说,让
    Java\u outer\u classname
    Protos
    结尾似乎是标准的

    • 起初我没有注意到这一点,所以我当前的protobuf类在
      com.example.project.protobuf.MyProtos
      中,但我认为没有理由将它保留在那里,因为我们需要一个包含类,所以可以将它移动到
      com.example.protobuf.MyProtos
      ,除非项目的顶级包中没有类
  • 在0处启动枚举以匹配C/C++

  • 对重复字段使用单数名称

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

  • 人们使用的其他标准有什么不同吗?

    免责声明:谷歌每天使用protobufs的回答。我绝对不是谷歌的代表

  • 不要那样做。编译的协议缓冲区只是由您使用的语言指定的一个类定义,有一些改进。添加“消息”是额外的冗长。通常只使用协议缓冲区而不使用其他类定义,即使使用其他类定义,也只需导入java_outer_classname并从中执行一个点。你们甚至可以把一个东西的完整路径放在代码中,删除一行导入内容,没问题

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

  • 通常从0开始。请参阅《协议缓冲区语言指南》

  • 对。阅读以下内容,了解如何使用它:


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

    repeated PhoneNumber phones = 4;
    repeated Person people = 1;
    
    即使在中,我们也只能找到复数:

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

    您正在寻找的是,它讨论了谷歌自己的API中使用的protobuf/gRPC设计约定


    protobuf样式指南()正如你所说的那样相当简短。

    谷歌似乎在同时添加了一条关于重复的字段名(第4点)的指南:

    对重复字段使用复数名称

    repeated string keys = 1;
    ...
    repeated MyMessage accounts = 17;
    
    它为
    添加
    成员函数生成一个坏函数名:

    // 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);
    
    有人可能会说第一种方法是多余的。通过使用
    可变
    成员函数,如果对
    重复的
    字段使用复数字段名,我看不到与丑陋的方法名称有关的任何问题

    因此,从现在起,我将努力遵循这一方针。另一个原因是:我们也倾向于在C++中使用多个变量名用于容器/集合,例如

    auto keys = std::vector<std::string>{};
    
    autokeys=std::vector{};
    
    您所说的“从0开始枚举以匹配C/C++”是什么意思?@bialix,将值分配给枚举成员,Protobuf样式页显示从1开始的枚举,请参阅。但我在其他页面上看到了从0开始的其他示例。使用复数字段名是多余的,因为它已经指示为重复的
    。对于您引用的
    results
    示例,编译器会生成
    getResults(int-index)
    getResultsList()
    getter,这很难理解,而且可能会产生误导,尤其是在使用动态语言的情况下。理想情况下,编译器将对此具有智能,从复数字段名推断单数形式,并生成
    getResult(int)
    getResults()
    。但这本身也可能令人困惑,并会招致不必要的计算。谷歌API设计指南显然不同意我的观点:这是谷歌API的文档。protobuf样式指南不处理重复的字段名。我更喜欢“总是单数的”,因为大多数代码生成器都会在属性中添加Map()或List()后缀。原型特定文档的密度恐怕更低。关于#1,它们在语言中是一个类,但它们代表一条消息。如果它有助于将personMessage与repo中的person数据类区分开来,那么它就不是额外的了,其他地方的person视图模型等等。对重复字段使用复数名称对我来说更自然。它还与当前的示例相匹配。。。例如:“重复的电话号码=4;”和“重复的人=1;”我同意#1和#3。我没有Protobuf+Java的任何经验,因此我无法判断#2。请注意,对于#4,现在对重复的
    字段使用复数名称有一个指导原则。请参阅我的完整答案。您的答案与google protobuf doc不一致。Google protobuf使用复数表示重复的一个。