Google C++ Style Guide的哲学
Google C++ Style Guide并不是一个百科全书,也不是一个C++
使用指南,但它描述适用于Google及其开源项目的编码指南,并不追求全面和绝对正确,也有许多人置疑它的一些规则。但作为一个最具影响力的编码规范,它里面有许多内容值得我们研究学习。
以下主要摘自GSG负责人Titus Winters在CppCon 2014上的演讲。
制订Google C++ Style Guide的目的
引导开发去做对的事,同时不易犯错。
哲学总结
1 关注于读者,而非作者
(Optimize for the reader, not the writer)
从维护的代码规模以及团队协作的角度考虑,Google C++ Style Guide的制订更加偏向于读者的体验,而非代码作者的感受。原因是代码被用于阅读和理解的开销要远大于编码。
2 适度的规则
(Rules should pull their weight)
法无具细则无法,所以不会列出所有不能做的事项。对于未提到内容,则遵循一个大原则:低调 (Don’t be clever)(另一种相对的做法就是,不要犯傻(Don’t be stupid)。)。
3 标准很重要,但不能迷信
(Value the standard, but don’t idolize)
标准对于工作非常重要,但不代表它是万能的。可以通过cppreference.com或Stack Overflow去跟进标准的变化,以及相关的讨论,这样更有助于理解标准、使用标准。
4 保持一致性
(Be consistent)
这是最为关键的一项。保持一致性有助于分解工作,并且更好的协作,包括自动化,减少对一些不必要的争论。在GSG中有助于一致性的规则包括:
- Include guard的命名
- 参数顺序 (先输入,再输出)
- 命名空间
- 声明顺序 (类里先
public
, 后private
, 先方法,再成员变量) - 命名规则
- 格式化 (这种事还是交给工具吧)
5 通过清晰、明确的方式避免歧义和出错的可能性
(If something unusual is happening, leave explicit evidence for the reader)
核心是以明确的方式编写代码。比如:
- 常量引用代表输出参数,指针表示会被函数修改
override
和final
对成员函数的修饰Interface
类、Client
类等的名称使用相应的后缀(Interface
,Client
)。- 函数的重载没有使用不同的函数名来得明确
- 可变参数、以及缺省函数参数都可能导致使用者理解上的问题,而有误用的可能
- 使用异常处理(Exception),不如错误处理(Error handling)明确
6 避免风险难控的实现,亦或是奇巧淫技,因为太难维护
(Avoid constructs that are dangerous or suprising, Avoid tricky and hard-to-maintain constructs)
这里包括了两条,一是有风险,或者冷不丁会给个惊喜的实现方式:
- 复杂的
static
和全局对象,会在退出时出现问题 - 使用
override
和final
可以避免错误使用 - 使用异常常常会转移错误,是非常危险的
另一条是一些隐晦的技术会带来维护上的压力。比如:
- 不要使用宏 (复杂,不清晰)
- 模板类元编程 (复杂)
- 非公有化的继承 (可能会带来意外惊吓)
- 多重继承 (很难维护)
7 不要污染全局命名空间
(Avoid polluting the global namespace)
因为代码太大,如果没有控制,全局命名空间里的冲突可能性非常高。所以一个重要的规则就是限制使用全局命空间。也是分而治之的思想。重点是:
- 将代码放到命名空间里
- 不要在头文件里将
using
放到全局命名空间里。它会随着引用依赖而扩散 - 虽然在
.cc
文件没那么重要,但仍然建议将static
变量放到匿名命名空间里,不要使用using namespace
来引用其它命名空间
8 必要时向调优及实用性让步
(Concede to optimization and practicalities when necessary)
有一些规则主要推荐某种更优的实践。比如:
- 前置声明 (优化编译时间)
Inline
函数 (限定于较小的函数)- 推荐使用前置递增 (
++i
, 特别是迭代器)
9 关于争议性的规则
Titus通过对两个最具争议的规则说明了如何运用上面的规则达成目前的结论的。两个最具争议的规则是:
- 不能有非常量引用的输入参数 (No Non-const reference as function arguments)
- 不使用异常 (No use of exceptions)
我这里只说明第一条所依据的规则:
- 一致性 (和众多代码实现保持一致)
- 清晰、明确,便于排查 (有没有不合预期的修改,甚至编译期就可以预防问题)
- 有风险、可能带来意外惊喜
- 引用的生命周期问题。原因是开发者对指针的生命周期比较敏感,但对引用的生命周期管理较容易忽视
其中的要点就是在定义规则时要知道为什么要制订它,什么时候应用它, 以及未来又将如何修改它。
转自: Horky,Google C++ Style Guide的哲学
Ps(附上几个Google Style链接):
Google C++ Style Guide的哲学的更多相关文章
- [Guide]Google C++ Style Guide
0.0 扉页 项目主页 Google Style Guide Google 开源项目风格指南 -中文版 0.1 译者前言 Google 经常会发布一些开源项目, 意味着会接受来自其他代码贡献者的代码. ...
- Google C++ Style Guide在C++11普及后的变化
转 http://www.cnblogs.com/chen3feng/p/5972967.html?from=timeline&isappinstalled=0&lwfrom=user ...
- 一张图总结Google C++编程规范(Google C++ Style Guide)
Google C++ Style Guide是一份不错的C++编码指南,我制作了一张比較全面的说明图,能够在短时间内高速掌握规范的重点内容.只是规范毕竟是人定的,记得活学活用.看图前别忘了阅读以下三条 ...
- Google Shell Style Guide
转自:http://google.github.io/styleguide/shell.xml Shell Style Guide Revision 1.26 Paul Armstrong Too m ...
- Google JavaScript Style Guide
转自:http://google.github.io/styleguide/javascriptguide.xml Google JavaScript Style Guide Revision 2.9 ...
- electron教程(番外篇一): 开发环境及插件, VSCode调试, ESLint + Google JavaScript Style Guide代码规范
我的electron教程系列 electron教程(一): electron的安装和项目的创建 electron教程(番外篇一): 开发环境及插件, VSCode调试, ESLint + Google ...
- Google coding Style Guide : Google 编码风格/代码风格 手册/指南
1 1 1 https://github.com/google/styleguide Google 编码风格/代码风格 手册/指南 Style guides for Google-originated ...
- [Guide]Google Python Style Guide
扉页 项目主页 Google Style Guide Google 开源项目风格指南 - 中文版 背景 Python 是Google主要的脚本语言.这本风格指南主要包含的是针对python的编程准则. ...
- Google C++ Style Guide
Background C++ is one of the main development languages used by many of Google's open-source project ...
随机推荐
- 嵌入式平台选择:树莓派 or BeagleBone Black(BBB)
原文链接: Michael Leonard 翻译: 极客范- 小道空空 译文链接: http://www.geekfan.net/5246/ 嵌入式平台选择:树莓派 or BeagleBone Bla ...
- [JZOJ]100046【NOIP2017提高A组模拟7.14】收集卡片
Star 计划订购一本将要发行的周刊杂志,但他可不是为了读书,而是-- 集卡. 已知杂志将要发行 N 周(也就是 N 期),每期都会附赠一张卡片.Star 通 过种种途径,了解到 N 期杂志附赠的卡片 ...
- SQL注入、占位符拼接符
一.什么是SQL注入 官方: 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意 ...
- node.js mongodb ReplSet
随着web2.0兴起,高并发大数据量的应用对数据库高速响应的性能要求日趋明显,传统的关系型数据库在这方面显得有些乏力.有矛自有盾,内存DB的出现弥补了传统关系型db的不足.眼下市面流行的内存db主要有 ...
- 数据仓库工具:Hive
转载请标明出处: http://blog.csdn.net/zwto1/article/details/46430823: 本文出自:[明月的博客] 为什么要选择Hive 基于Hadoop的大数据的计 ...
- Android程序全然退出的三种方法
1. Dalvik VM的本地方法 android.os.Process.killProcess(android.os.Process.myPid()) //获取PID,眼下获取自己的也仅仅有该 ...
- bzoj4808: 马 & bzoj3175: [Tjoi2013]攻击装置 (黑白染色+最小割)
bzoj4808: 马 & bzoj3175: [Tjoi2013]攻击装置 题目:传送门 简要题意: 和n皇后问题差不多,但是这里是每个棋子走日子,而且有些格子不能放棋子.求最多能放多少个棋 ...
- nyoj--138--找球号(二)(hash+邻接表)
找球号(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:5 描述 在某一国度里流行着一种游戏.游戏规则为:现有一堆球中,每个球上都有一个整数编号i(0<=i<=1 ...
- [JZOJ 5909] [NOIP2018模拟10.16] 跑商(paoshang) 解题报告 (圆方树)
题目链接: https://jzoj.net/senior/#contest/show/2529/2 题目: 题目背景:尊者神高达很穷,所以他需要跑商来赚钱题目描述:基三的地图可以看做 n 个城市,m ...
- 爬虫框架webmagic与spring boot的结合使用--转
原文地址:http://www.jianshu.com/p/c3fc3129407d 1. 爬虫框架webmagic WebMagic是一个简单灵活的爬虫框架.基于WebMagic,你可以快速开发出一 ...