罗剑锋的 C++ 实战笔记
罗剑锋
前奇虎 360 技术专家,Nginx/OpenResty 开源项目贡献者
34779 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 32 讲
结束语 (1讲)
罗剑锋的 C++ 实战笔记
15
15
1.0x
00:00/00:00
登录|注册

02 | 编码阶段能做什么:秀出好的code style

你好,我是 Chrono。
上节课我介绍了 C++ 程序的生命周期和编程范式,今天我就接着展开来讲,看看在编码阶段我们能做哪些事情。
在编码阶段,我们的核心任务就是写出在预处理、编译和运行等不同阶段里执行的代码,还记得那句编程格言吗:
任何人都能写出机器能看懂的代码,但只有优秀的程序员才能写出人能看懂的代码。
所以,我们在编码阶段的首要目标,不是实现功能,而是要写出清晰易读的代码,也就是要有好的 code style。
怎么样才能写出 human readable 的好代码呢?
这就需要有一些明确的、经过实践验证的规则来指导,只要自觉遵守、合理运用这些规则,想把代码写“烂”都很难。
在此,我强烈推荐一份非常棒的指南,它来自 OpenResty 的作者章亦春,代码风格参照的是顶级开源产品 Nginx,内容非常详细完善。
不过有一点要注意,这份指南描述的是 C 语言,但对于 C++ 仍然有很好的指导意义,所以接下来我就以它为基础,加上我的工作体会,从代码格式标识符命名注释三个方面,讲一下怎么“秀出好的 code style”。

空格与空行

当我们拿到一份编码风格指南的时候,不论它是公司内部的还是外部的,通常第一感觉就是“头大”,几十个、上百个的条款罗列在一起,规则甚至细致到了标点符号,再配上干巴巴的说明和示例,不花个半天功夫是绝对看不完的。而且,最大的可能是半途而废,成了“从入门到放弃”。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《罗剑锋的 C++ 实战笔记》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(51)

  • 最新
  • 精选
  • 嵇斌
    分享我的一些实践: 1. 匈牙利命名真心不推荐了,参考《clean code》中关于avoid encoding的说明。 2. 如果是存现代c++工程,不考虑兼容C的话. Header guards可以使用#pragma once替代。 3. 避免注释,最好使用代码来阐述。很多信息可以通过代码仓库来表达,比如commit message。 4. m_,g_ 等前缀如果使用现代化的ide的话,也可以考虑省略,因为ide的高亮能够区分。 5. 如果不是在写类库,比如开发应用程序,最好命名规则能快速区分这个是你的代码,还是标准库、知名类库的代码,可能这也是大厂流行CamalCase的缘由。 6. Google的style guide是个不错的参考,但是也有很多不可取的规则,感觉原因:Google出这个guide的时候modern c++还没有流行,Google当时内部还有很多技术债,Google想把c++写的像java。所以Google后来在golang里面.... 7. 如果是参与现有项目,无论现有规则多么的不爽,都先遵循现有的规则。

    作者回复: 分享的经验质量非常高,nice。 关于pragma once,我的建议还是要慎用,因为很多时候我们还会导出纯C接口给外界,还是include guard最保险。 而且我记得在哪里看过资料,好像是cppreference上吧,pragma once也是有缺陷的。

    3
    37
  • jxon-H
    磨刀不误砍柴工,编码风格我觉得不仅是软件开发行业的共识,更是一种软件开发的文化。回顾我自己写过的代码,简直惨不忍睹。罗老师这节内容让我收获极大,也让进一步加深了以下认识: 1、之所以讲究编码风格,因为软件的规模越大,协作性要求就越高,软件开发是一件群体性的智力活动,每个人的代码都只有自己懂,每段代码都将成为一个信息孤岛,没法让代码变得可交流、可复用、可维护。 2、一段代码的功能,不仅仅是完成一个任务,也是一种思想的传播,因此注释担当着传递信息的功能,要养成良好的注释习惯和明了易懂注释风格。 3、留白的艺术深受启发,既给代码空间留下了闲余,给视觉留下了美感,也给代码的阅读增添了节奏,更是给大脑腾出足够的思考空间。

    作者回复: 写的太好了,我非常感同身受。

    16
  • Carlos
    哈哈, 容我先说一句题外话, 我作为一个 c++ 入门新手, 昨天和前天还真的读了一份 "公司色彩很重" 的 code style guide 😂(虽然没完全读懂). 1. 今天文章中的 "留白", 和 "命名" 我倒是注意到了, 但是可能因为我目前写的 c++ 代码基本上都是不超过 50 行的练习文件, 所以注释这一点我没有注意到, 从现在开始注意. 2. 我觉得另一个重要的用法是把一些代码备注掉. 可能是为了 debug 方便(如果新代码错了, 换回旧代码, 程序还能运行), 也可能是为了以后功能拓展方便(直接把相关模块取消备注就能用了). 补充一条我前天刚学会的 code style: All header files should have #define guards to prevent multiple inclusion. The format of the symbol name should be <PROJECT>_<PATH>_<FILE>_H_

    作者回复: 1.可以多看看一些开源项目,它们的代码量比较大,你就可以体会到空格和空行的作用了。 专栏的GitHub仓库代码虽然比较小,但也都应用了这些规范,可以做参考。 2.说的很对,这也是注释一个非常重要的作用。我的建议是尽量不要删代码,毕竟是自己辛辛苦苦写出来的,删掉太可惜了。 应该用注释暂时禁用,放一段时间,如果确实没有用再考虑删除。 3.这个是include guard,后面的预处理阶段就会讲,你这是提前预习了,笑。

    3
    15
  • winsummer
    老师,函数的注释是写在声明处还是写在定义处好呢

    作者回复: 看怎么用,如果是对外发布的,就写在声明,如果是内部用的,就在定义处。 但一定要注意,最好不要两处都有注释,否则一旦有变动,维护保持同步很麻烦。

    11
  • Yaxe
    昨天上github看cpp_study这个仓库的时候 发现头像莫名熟悉,才知道之前star的注释版nginx也是罗大写的 十分有缘 学习学习!

    作者回复: 笑,看来我的隐身能力还是挺成功的。

    7
  • 幻境之桥
    在此基础上使用 clang-format 统一并减少大部分手工格式化的工作

    作者回复: nice,用clang-format这样的工具能够减少很多手工的工作,但编码风格的意识还是要有的,不能完全依赖工具。

    6
  • 湫兮如风
    看完一节的内容一定一定要阅读大家的评论!罗老师这个专栏的氛围真好、质量真高!师生共进!

    作者回复: 共同营造“风清气正”的讨论氛围,笑。

    2
    5
  • Geek_0315ca
    我比较喜欢变量名使用m和g前缀,说明变量的作用域范围;todo注释标注自己未实现的功能和想法💡 ;函数体内部使用空行分离不同的代码片段

    作者回复: 对,这个几个对于改善代码可读性非常有用,而且也简单容易上手。

    5
  • yelin
    特别喜欢匈牙利命名法里的类型前缀,不过现在使用的也基本就是m和g前缀了。我个人特别喜欢空格!很多CPP check,没有空格是会报错的,所以不能说习惯啦,这是规则。

    作者回复: 1.匈牙利命名法里的类型前缀现在已经不提倡了,比如你写了一个int iNum,后来想改成long,那么前缀i就失去意义了。m_和g_表示作用域还是很好的,不会因为重构而失效。 2.操作符两边加空格也是优良的编码风格传统了,留白非常重要。

    4
  • hb
    其实各个语言都有自己的code style, 例如OC就是习惯驼峰命名,基本不用加 "_"

    作者回复: 很对,但对于C++来说,并没有官方推荐的style,这大概也是C++崇尚的自由吧,我们可以任意选择自己喜欢的style。

    4
收起评论
显示
设置
留言
51
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部