Google编码规范
(来源:1. 头文件 — Google 开源项目风格指南 (zh-google-styleguide.readthedocs.io))
1. 头文件
1.2. #define 保护
所有头文件都应该有 #define
保护来防止头文件被多重包含。
1.3. 前置声明
尽可能地避免使用前置声明。使用 #include
包含需要的头文件即可。
2. 作用域
2.4. 局部变量
将函数变量尽可能置于最小作用域内, 并在变量声明时进行初始化.
3. 类
3.4. 结构体 VS. 类
仅当只有数据成员时使用 struct
, 其它一概使用 class
.
译者 (YuleFox) 笔记
函数体尽量短小, 紧凑, 功能单一
4. 函数
4.1. 输入和输出
我们倾向于按值返回, 否则按引用返回。 避免返回指针, 除非它可以为空.
4.2. 编写简短函数
我们倾向于编写简短, 凝练的函数.
4.3. 引用参数
所有按引用传递的参数必须加上 const
.
4.4. 函数重载
若要使用函数重载, 则必须能让读者一看调用点就胸有成竹, 而不用花心思猜测调用的重载函数到底是哪一种. 这一规则也适用于构造函数.
6. 其他 C++ 特性
6.9. 类型转换
使用 C++ 的类型转换, 如 static_cast<>()
. 不要用 int y = (int)x
或 int y = int(x)
等转换方式。
6.11. 前置自增和自减
对于迭代器和其他模板对象使用前缀形式 (++i
) 的自增, 自减运算符.
6.17. 0, nullptr
和 NULL
整数用 0
, 实数用 0.0
, 指针用 nullptr
或 NULL
, 字符 (串) 用 '\0'
.
整数用 0
, 实数用 0.0
, 这一点是毫无争议的.
对于指针 (地址值), 到底是用 0
, NULL
还是 nullptr
. C++11 项目用 nullptr
; C++03 项目则用 NULL
, 毕竟它看起来像指针。实际上,一些 C++ 编译器对 NULL
的定义比较特殊,可以输出有用的警告,特别是 sizeof(NULL)
就和 sizeof(0)
不一样。
字符 (串) 用 '\0'
, 不仅类型正确而且可读性好.
6.18. sizeof
尽可能用 sizeof(varname)
代替 sizeof(type)
.
使用 sizeof(varname)
是因为当代码中变量类型改变时会自动更新. 您或许会用 sizeof(type)
处理不涉及任何变量的代码,比如处理来自外部或内部的数据格式,这时用变量就不合适了。
7. 命名约定
7.1. 通用命名规则
函数命名, 变量命名, 文件命名要有描述性; 少用缩写.
7.2. 文件命名
文件名要全部小写, 可以包含下划线 (_
) 或连字符 (-
), 依照项目的约定. 如果没有约定, 那么 “_
” 更好.
7.3. 类型命名
类型名称的每个单词首字母均大写, 不包含下划线: MyExcitingClass
, MyExcitingEnum
.
7.4. 变量命名
变量 (包括函数参数) 和数据成员名一律小写, 单词之间用下划线连接. 类的成员变量以下划线结尾, 但结构体的就不用, 如: a_local_variable
, a_struct_data_member
, a_class_data_member_
.
7.5. 常量命名
声明为 constexpr
或 const
的变量, 或在程序运行期间其值始终保持不变的, 命名时以 “k” 开头, 大小写混合. 例如:
7.6. 函数命名
常规函数使用大小写混合, 取值和设值函数则要求与变量名匹配: MyExcitingFunction()
, MyExcitingMethod()
, my_exciting_member_variable()
, set_my_exciting_member_variable()
.
8. 注释
8.1. 注释风格
使用 //
或 /* */
, 统一就好.
8.2. 文件注释
在每一个文件开头加入版权公告.
8.4. 函数注释
函数声明处的注释描述函数功能; 定义处的注释描述函数实现.
8.5. 变量注释
通常变量名本身足以很好说明变量用途. 某些情况下, 也需要额外的注释说明.
8.6. 实现注释
对于代码中巧妙的, 晦涩的, 有趣的, 重要的地方加以注释.
8.7. 标点, 拼写和语法
注意标点, 拼写和语法; 写的好的注释比差的要易读的多.
9. 格式
9.1. 行长度
每一行代码字符数不超过 80.
9.2. 非 ASCII 字符
尽量不使用非 ASCII 字符, 使用时必须使用 UTF-8 编码.
9.3. 空格还是制表位
只使用空格, 每次缩进 2 个空格.
9.4. 函数声明与定义
返回类型和函数名在同一行, 参数也尽量放在同一行, 如果放不下就对形参分行, 分行方式与函数调用一致.
9.6. 函数调用
要么一行写完函数调用, 要么在圆括号里对参数分行, 要么参数另起一行且缩进四格. 如果没有其它顾虑的话, 尽可能精简行数, 比如把多个参数适当地放在同一行里.
9.8. 条件语句
倾向于不在圆括号内使用空格. 关键字 if
和 else
另起一行.
9.9. 循环和开关选择语句
switch
语句可以使用大括号分段, 以表明 cases 之间不是连在一起的. 在单语句循环里, 括号可用可不用. 空循环体应使用 {}
或 continue
.
9.10. 指针和引用表达式
句点或箭头前后不要有空格. 指针/地址操作符 (*, &
) 之后不能有空格.
9.12. 函数返回值
不要在 return
表达式里加上非必须的圆括号.
9.13. 变量及数组初始化
用 =
, ()
和 {}
均可.
9.16. 构造函数初始值列表
构造函数初始化列表放在同一行或按四格缩进并排多行.
9.17. 命名空间格式化
命名空间内容不缩进.
9.18. 水平留白
水平留白的使用根据在代码中的位置决定. 永远不要在行尾添加没意义的留白.
9.19. 垂直留白
垂直留白越少越好.
11. 结束语
运用常识和判断力, 并且 保持一致.
编辑代码时, 花点时间看看项目中的其它代码, 并熟悉其风格. 如果其它代码中 if
语句使用空格, 那么你也要使用. 如果其中的注释用星号 (*) 围成一个盒子状, 那么你同样要这么做.
《数学之美》读书笔记
对自然语言处理比较感兴趣,只看了(这部分 && 看得懂的部分)。
第2章 自然语言处理——从规则到统计
讲了自然语言处理的发展历史,如题,从规则到统计。规则是语法规则,里面用到了树模型。在书上看到自己学过的内容还是很有意思的,对理解也很有帮助。虽然语法对人类来说不算很难理解,但是对机器来说,处理成分多的一句话就需要大量的分析和结构模型使之成为机器语言。而这自然需要耗费非常大的时间与空间。这也使得自然语言处理停滞了很长一段时间。
后期新人科学家对语言处理调整为统计,但在这章没细讲。
记忆比较深刻的是里面提到老科学家,或许是年龄老,也或许是观念老。需要等到ta们退休才能有进一步发展。好crazy的人类们。。
第四章 谈谈分词
这章也挺有意思的。一个点是对于不同的分词方法,会采取比较常用的一种,和gpt很像。另一个点是人对具有歧义性的分词处理得也不能十全十美。反正是一种已经比较完善了的技术。
第六章 信息的度量和作用
信息熵的概念不错。看得时候让我想到自己比较苦恼的一个问题。相比于其它领域,计算机是特别专注于人类的专业,所取得的成就也基本上都以人类为中心,只给人类提供便利。有没有能给动物提供翻译的语言处理技术呢。但就算是同种动物,不同种类的可以交流吗(金毛和伯恩山)?不同种动物可以交流吗?蚂蚁触碰触角,蜜蜂摆出形状,鲨鱼感应温度,犬科嗅出气味。。我们的语言是一维的,转化成结构模型是二维,而动物世界的交流信息才是三维的。。
第七章 贾里尼克和现代语言处理
比较喜欢这一章。1. 不需要在年轻的时候学习很多,因为理解能力会在长大之后变得更强。看的时候在想,不学习怎么提高理解能力。后来又想,又不是只能通过学习提高。。长大因为能力提升,变成了一件很幸福的事情。 2. 巴菲特每年选一个出价最高的人一起吃饭。因为我爸梦到过和巴菲特吃饭且很兴奋,让我觉得很搞笑。 3. 贾里尼克本人和他的学生都很幸运。贾里尼克遇到良师益友尚有自己的努力和一些运气在,他的学生完全被他像带孩子一样带着,培养出类拔萃的能力,提供资源和平台。羡慕。