Google C++ Style Guide的哲学

Google C++ Style Guide并不是一个百科全书,也不是一个C++使用指南,但它描述适用于Google及其开源项目的编码指南,并不追求全面和绝对正确,也有许多人置疑它的一些规则。但作为一个最具影响力的编码规范,它里面有许多内容值得我们研究学习。

以下主要摘自GSG负责人Titus Winters在CppCon 2014上的演讲

制订Google C++ Style Guide的目的

引导开发去做对的事,同时不易犯错。

哲学总结

关注于读者,而非作者

(Optimize for the reader, not the writer.)
从维护的代码规模以及团队协作的角度考虑,Google C++ Style Guide的制订更加偏向于读者的体验,而非代码作者的感受。原因是代码被用于阅读和理解的开销要远大于编码。

适度的规则

(Rules should pull their weight.)
法无具细则无法,所以不会列出所有不能做的事项。对于未提到内容,则遵循一个大原则:”低调 (Don’t be clever.)”。(另一种相对的做法就是,不要犯傻(Don’t be stupid)。)

标准很重要,但不能迷信

(Value the standard, but don’t Idolize.)
标准对于工作非常重要,但不代表它是万能的。可以通过cppreference.com或stackoverflow去跟进标准的变化,以及相关的讨论,这样更有助于理解标准、使用标准。

保持一致性

(Be consistent.)
这是最为关键的一项。保持一致性有助于分解工作,并且更好的协作,包括自动化,减少对一些不必要的争论。在GSG中有助于一致性的规则包括:
* Include guard的命名
* 参数顺序 (先输入,再输出)
* 命名空间
* 声明顺序 (类里先public, 后private, 先方法,再成员变量)
* 命名规则
* 格式化 (这种事还是交给工具吧)

通过清晰、明确的方式避免歧义和出错的可能性

(If something unusual is happening, leave explicit evidence for the reader)
核心是以明确的方式编写代码。比如:
* 常量引用代表输出参数,指针表示会被函数修改。
* override和final对成员函数的修饰。
* Interface类、Client类等的名称使用相应的后缀(Interface,Client)。再
* 函数的重载就没有使用不同的函数名来得明确。
* 可变参数、以及缺省函数参数都可能导致使用者理解上的问题,而有误用的可能。
* 使用异常处理(Exception),不如错误处理(Error handling)明确。

避免风险难控的实现,亦或是奇巧淫技,因为太难维护。

(Avoid constructs that are dangerous or suprising, Avoid tricky and hard-to-maintain constructs)
这里包括了两条,一是有风险,或者冷不丁会给个惊喜的实现方式:
* 复杂的static和全局对象,会在退出时出现问题。
* 使用override和final可以避免错误使用。
* 使用异常常常会转移错误,是非常危险的。

另一条是一些隐晦的技术会带来维护上的压力。比如:
* 不要使用宏 (复杂,不清晰)
* 模板类元编程 (复杂)
* 非公有化的继承 (可能会带来意外惊吓)
* 多重继承 (很难维护)

不要污染全局命名空间

(Avoid polluting the global namespace)
因为代码太大,如果没有控制,全局命名空间里的冲突可能性非常高。所以一个重要的规则就是限制使用全局命空间。也是分而治之的思想。重点是:
* 将代码放到命名空间里。
* 不要在头文件里将using放到全局命名空间里。它会随着引用依赖而扩散。
* 在.cc文件就没那么重要,但仍然建议将static变量放到匿名命名空间里,不要使用using namespace来引用其它命名空间。

必要时向调优及实用性让步

(Concede to optimization and practicalities when necessary)
有一些规则主要推荐某种更优的实践。比如:
* 前置声明 (优化编译时间)
* Inline函数 (限定于较小的函数)
* 推荐使用前置递增 (++i, 特别是迭代器)

关于争议性的规则

Titus通过对两个最具争议的规则说明了如何运用上面的规则达成目前的结论的。两个最具争议的规则是:
* 不能有非常量引用的输入参数 (No Non-const reference as function arguments)
* 不使用异常 (No use of exceptions)

我这里只说明第一条所依据的规则:
* 一致性 (和众多代码实现保持一致)
* 清晰、明确,便于排查 (有没有不合预期的修改,甚至编译期就可以预防问题)
* 有风险、可能带来意外惊喜
引用的生命周期问题。原因是开发者对指针的生命周期比较敏感,但对引用的生命周期管理较容易忽视。

其中的要点就是在定义规则时要知道为什么要制订它,什么时候应用它, 以及未来又将如何修改它。

时间: 2024-10-29 12:52:08

Google C++ Style Guide的哲学的相关文章

Google Style Guides-Shell Style Guide(翻译)

  背景 使用什么shell? Bash是允许的可执行文件中的的唯一一个shell脚本语言.其可执行文件必须是以#!/bin/bash开头,使用set来设置shell的选项,以便你可以按照bash 来调用你的脚本,而不破坏它的功能.限制所有可执行的shell脚本为bash,为我们提供了所安装的所有机器上的一致shell语言.唯一的例外是在种强制要求你编码为某种格式的地方,例如在Solaris SVR4的软件包中所有的脚本都要求是普通的Bourne shell. 什么时候使用shell? shel

怎样为网站创建风格指南(style guide)

旅途归来,一切安好.五天很短暂,回想起来基本只有将就算是蓝色的大海和天空,还有白花花的沙滩:有兴趣的朋友可以到我的微博中看看风景照什么的. 还好,回来之后并没觉得无法适应惯常生活一类,它们之间的区别只是"状态1"与"状态2"这样:把该做的事情立刻开始做起来吧,心里会安一些.之前一篇是"iOS Wow体验 – 第六章 – 交互模型与创新的产品概念"的前半部分.今天插播小文一篇,怎样为网站创建风格指南.进入正文,锵锵锵. 什么是风格指南?简单的说,就

Google对外发布C++编码规范

[Csdn.net简讯]早已开放多时的Google C++编码规范这几天引起了业内开发人员的广泛关注. 其中,来自硅谷的柯化成认为,这是地球上最好的一份C++编程规范,没有之一,建议广大国内外IT人员研究使用. 盛大的资深开发者赵劼表示,"非常同意.Google在这方面下足了功夫,让所有人写出来的代码都使用同样的规范,就好像在工程师编程世界里普及普通话一样.很多资深工程师刚加入的时候被迫学习编码规范,开始不习惯,后来发现收益非浅.所谓磨刀不误砍柴功,创业公司更应该关注." 科泰的陈榕也

C/C++ 框架,类库,资源集合

很棒的 C/C++ 框架,类库,资源集合. Awesome C/C++ Standard Libraries Frameworks Artificial Intelligence Asynchronous Event Loop Audio Biology Compression Concurrency Containers Cryptography Database Debug Game Engine GUI Graphics Image Processing Internationalizat

TensorFlow教程之资源 4.4 常见问题

本文档为TensorFlow参考文档,本转载已得到TensorFlow中文社区授权. 常见问题 此文档对关于TensorFlow的一些常见问题提供了答案,如果这里没有你问题的答案,你可能会在社区资源中找到它. 内容 常见问题 建立 TensorFlow graph 运行 TensorFlow 计算过程 Variables Tensor shapes TensorBoard 扩展 TensorFlow 其他问题 建立 TensorFlow graph 为什么c = tf.matmul(a, b) 

[译]JavaScript规范-葵花宝典

原文:[译]JavaScript规范-葵花宝典 [译]JavaScript规范 译自:https://github.com/airbnb/javascript 类型 原始值: 相当于传值 string number boolean null undefined var foo = 1, bar = foo; bar = 9; console.log(foo, bar); // => 1, 9 复杂类型: 相当于传引用 object array function var foo = [1, 2],

《编写可维护的JavaScript》——第 1 章 基本的格式化 1.1缩进层级

第 1 章 基本的格式化 编程风格指南的核心是基本的格式化规则(formatting rule).这些规则直接决定了如何编写高水准的代码.与在学校学习写字时所用的方格纸类似,基本的格式化规则将指引开发者以特定的风格编写代码.这些规则通常包含一些你不太在意的有关语法的信息,但对于编写清晰连贯的代码段来说,每一条信息都是非常重要的.1.1 缩进层级 关于JavaScript编码风格,我们首先要讨论的是(几乎所有的语言都是如此)如何处理缩进.对这个话题是可以争论上好几个小时的,缩进甚至关系到软件工程师

《编写可维护的JavaScript》——第 1 章 基本的格式化1.1 缩进层级

第一部分 编程风格 编写可维护的JavaScript"程序是写给人读的,只是偶尔让计算机执行一下." --Donald Knuth.1 当你刚刚组建一个团队时,团队中的每个人都各自有一套编程习惯.毕竟,每个成员都有着不同的背景.有些人可能来自某个"皮包公司"(one-man shop),身兼数职,在公司里什么事都做:还有些人会来自不同的团队,对某种特定的做事风格情有独钟(或恨之入骨).每个人都觉得代码应当按照自己的想法来写,这些通常被归纳为个人编程嗜好.在这个过程中

github优质图书

免费优质书籍集 关于它的介绍 原资源克隆自 stackoverflow - 免费可用的学习资源列表 作者: George Stocker. 此学习资源清单由Victor Felder整理到GitHub ,并更新和维护. 该学习资源清单逐渐成为Github 最受欢迎的仓库, 并且有超过 80,000+标星, 4000+次提交, 800+贡献者参与它的修改, 以及20,000+复制. 现在由Free Ebook Foundation回购管理, Free Ebook Foundation是一个非营利性