本文介绍.proto文件的编码风格。遵循下面的惯例,可以使你的protocol buffer消息定义和它们对应的类连贯且已读。

注意,protocol buffer风格随时间变化一直在进步,所以可能你会在写成的.proto文件看到不同的惯例或风格。在你修改这些文件时请考虑已有风格连贯是关键。然而在创建新的.proto文件时,最好是采用目前最流行的风格。

标准文件格式

  • 每行最多80个字母。
  • 缩进使用2个空格。

文件结构

文件命名应该使用lower_snake_case.proto格式。

所有的文件都应该最受下列方式:

  1. 许可头(如果有的话)
  2. 文件概览
  3. 语法
  4. 导入项(排序后的)
  5. 文件选项
  6. 剩下的

包名称应该小写,并且应该与目录层次结构相对应。例如,如果文件在my/package/中,那么包名应该是my.package

消息和字段名称

使用驼峰(首字母大写)命名消息名称 -- 例如,SongServerRequest。使用下划线连接命名字段名(包括oneof字段和扩展名称) -- 例如,song_name

message SongServerRequest {
string song_name = 1;
}

字段使用命名规范会生成如下格式的访问器:

const string& song_name() { ... }
void set_song_name(const string& x) { ... }
public String getSongName() { ... }
public Builder setSongName(String v) { ... }

如果你的字段名称包含数字,那数字应该紧在最后一个字母后面而不是下划线,例如,要用song_name1而不是song_name_1

重复字段

对重复字段使用复数名称:

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

枚举

使用驼峰(首字母大写)命名枚举类型,使用大写加下划线命名变量名称:

enum Foo {
FOO_UNSPECIFIED = 0;
FOO_FIRST_VALUE = 1;
FOO_SECOND_VALUE = 2;
}

每个枚举变量都应该使用分号结束,而不是逗号。使用前缀枚举值,不用闭包消息包围。0值得枚举值应该有UNSPECIFIED后缀。

服务

.proto中定义RPC服务,对于服务名称和RPC方法名称,你应该使用驼峰(首字母大写)命名。

service FooService {
rpc GetSomething(FooRequest) returns (FooResponse);
}

要避免的事

  • Required字段(仅针对proto2,应为proto3从语法层面取消了required
  • Groups(仅针对proto2)

更多信息,参见这里

Proto3:风格的更多相关文章

  1. Protocol Buffers官方文档(proto3语言指南)

    本文是对官方文档的翻译,大部分内容都是引用其他一些作者的优质翻译使文章内容更加通俗易懂(自己是直译,读起来有点绕口难理解,本人英文水平有限),参考的文章链接在文章末尾 这篇指南描述如何使用protoc ...

  2. Proto3:C++代码生成指南

    本章节实际上是介绍Protocol Buffer编译器从给定的protocol定义中生成的C++代码.所有proto2和proto3生成的代码不同之处都会高亮标出 --- 需要注意的是这些不同之处只是 ...

  3. Proto3使用指南

    这篇指南讲述如何使用Protocol Buffers来结构化你的Protocol Buffer数据,包括.proto文件语法以及如何从.proto文件生成你的访问类型.本文主要涵盖了proto3的语法 ...

  4. 关于自己写C++的一点风格

    现在,我学了很长时间的C++,但是自己就是无法精通.许多知识是入门书上没有的.现在写C++最重要的就是风格问题. 我现在的C++风格: 把自己所有的东西都放在一个名称空间下. 没有全局的函数,有的函数 ...

  5. Photoshop将普通照片快速制作二次元漫画风格效果

    今天为大家分享Photoshop将普通照片快速制作二次元漫画风格效果,教程很不错,对于喜欢漫画的朋友可以参考本文,希望能对大家有所帮助! 一提到日本动画电影,大家第一印象肯定是宫崎骏,但是日本除了宫崎 ...

  6. 「标准」的 JS风格

    首先,这份 JS风格指南已经在我司的前端团队实行半年多了: 其次,在程序员的世界里,从入行到资深都需要面对几个世界级的难题,如: 世界上最好的编辑器是什么? 是用空格还是 TAB?用空格还特么衍生出 ...

  7. 无需编译、快速生成 Vue 风格的文档网站

    无需编译.快速生成 Vue 风格的文档网站 https://docsify.js.org/#/#coverpage https://github.com/QingWei-Li/docsify/

  8. C++服务器开发之基于对象的编程风格

    Thread.h #ifndef _THREAD_H_ #define _THREAD_H_ #include <pthread.h> #include <boost/functio ...

  9. 学习SpringMVC——你们要的REST风格的CRUD来了

    来来来,让一下,客官,您要的REST清蒸CRUD来了,火候刚刚好,不油不腻,请慢用~~~ 如果说前面是准备调料,洗菜,切菜,摆盘,那么今天就来完整的上道菜,主要说的是基于REST风格实现数据的增删改查 ...

随机推荐

  1. 关于本人:-D(必读)

    关于本人 本人目前从事iOS开发,但心中也有一个全栈的梦想,希望与大家共勉! 关于博客内容 自己会不时分享一些iOS方面的技术点.总结的一些经验及工具类.还有学习其他语言过程中的笔记.技术.总结及心得 ...

  2. linux xargs详解

    xargs  [-0prtx] [-E  eof-str] [-e[eof-str]] [--eof[=eof-str]] [--null] [-d delimiter] [--delimiter d ...

  3. JavaEE基础(01):Servlet实现方式,生命周期执行...

    一.Servlet简介Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容.使用Servlet,可以收集来自网页表单的用户输入,呈现来自数据库 ...

  4. set theory

    set theory Apart from classical logic, we assume the usual informal concept of sets. The reader (onl ...

  5. Vue其他指令-组件-全局-局部-组件的交互父传子

    v-once指令 once:一旦,当...时候 <!DOCTYPE html> <html lang="zh"> <head> <meta ...

  6. 关于目录的操作|*|<>|opendir |readdir|unlink|find2perl|rename|readlink|oct()|utime

    #!/usr/bin/perl use strict; use warnings; foreach my $arg(@ARGV) { print "one is $arg\n"; ...

  7. Mybatis Generator逆向工程的使用

    一.在 idea 中使用 mybatis generator 逆向工程 1.在IDEA上创建maven工程. 2.在pom.xml中配置MyBatis逆向工程插件 <!--MyBatis自动生成 ...

  8. 如何查看iOS系统版本在iPhone设备上的占有率

    我们平时开发的时候有时要考虑到系统的兼容版本,但是怎么知道各个版本的系统占有率,其实这个苹果官方是有提供的.进入如下链接到的页面就可以知道各大系统版本的占有率了,不过说实在的iPhone用户的系统更新 ...

  9. 线程中start与run方法的主要区别

    区别一:                在于当程序调用start方法一个新线程将会被创建,并且在run方法中的代码将会在新线程上运行,                然而在你直接调用run方法的时候, ...

  10. 网页元素检测工具:Spy_for_InternetExplorer下载地址

    本工具用于实时查看IE浏览器中打开的网页中元素的信息.支持iframe.frame框架. 下载地址: Spy_for_InternetExplorer.rar