第1章 引言1
1.1 软件熵2
1.2 为什么使用C 3
1.3 整洁的代码4
1.4 C 11—新时代的开始5
1.5 本书适合的读者6
1.6 本书使用的约定6
1.6.1 扩展内容7
1.6.2 注意事项、提示和警告7
1.6.3 示例代码7
1.7 相关网站和代码库8
1.8 UML图9
第2章 构建安全体系10
2.1 测试的必要性10
2.2 测试入门12
2.3 单元测试14
2.4 关于质量保证16
2.5 良好单元测试的原则16
2.5.1 单元测试代码的质量16
2.5.2 单元测试的命名17
2.5.3 单元测试的独立性18
2.5.4 一个测试一个断言19
2.5.5 单元测试环境的独立初始化20
2.5.6 不对Getter和Setter做单元测试20
2.5.7 不对第三方代码做单元测试21
2.5.8 不对外部系统做单元测试21
2.5.9 如何处理数据库的访问21
2.5.10 不要混淆测试代码和产品代码22
2.5.11 测试必须快速执行24
2.5.12 如何设计测试的输入数据25
2.5.13 测试替身27
第3章 原则31
3.1 什么是原则31
3.2 保持简单和直接原则32
3.3 不需要原则33
3.4 避免复制原则33
3.4.1 关于避免复制原则的知识34
3.4.2 构建抽象有时很困难34
3.5 信息隐藏原则37
3.6 高内聚原则40
3.7 松耦合原则42
3.8 小心优化原则45
3.9 少惊讶原则46
3.10 童子军原则46
第4章 C 代码整洁的基本规范48
4.1 良好的命名49
4.1.1 名称应该不言自明50
4.1.2 使用领域中的名称52
4.1.3 选择适当抽象级别的名称53
4.1.4 避免冗余的名称54
4.1.5 避免晦涩难懂的缩写54
4.1.6 避免匈牙利命名法和
命名前缀55
4.1.7 避免相同的名称用于
不同的用途57
4.2 注释57
4.2.1 让写代码像讲故事一样57
4.2.2 不要为易懂的代码写注释58
4.2.3 不要通过注释禁用代码59
4.2.4 不要写块注释59
4.2.5 特殊情况的注释是有用的62
4.3 函数66
4.3.1 只做一件事情68
4.3.2 让函数尽可能小69
4.3.3 函数命名70
4.3.4 使用容易理解的名称71
4.3.5 函数的参数和返回值72
4.4 C 项目中的C风格代码83
4.4.1 使用C 的string和stream来
替代C风格的char*83
4.4.2 避免使用printf()、sprintf()、
gets()等85
4.4.3 使用标准库的容器而不是使用
C风格数组88
4.4.4 使用C 类型转换代替C风格
类型转换91
4.4.5 避免使用宏92
第5章 现代C 的高级概念95
5.1 资源管理95
5.1.1 资源申请即初始化97
5.1.2 智能指针98
5.1.3 避免显式的new和delete104
5.1.4 管理专有资源105
5.2 move语义106
5.2.1 什么是move语义107
5.2.2 左值和右值的关系108
5.2.3 右值引用109
5.2.4 不要滥用move语义111
5.2.5 零原则111
5.3 编译器是你的搭档115
5.3.1 自动类型推导116
5.3.2 编译时的计算119
5.3.3 模板变量121
5.4 不允许出现未定义行为123
5.5 Type-Rich编程124
5.6 熟悉使用的库132
5.6.1 熟练使用133
5.6.2 使用Boost140
5.6.3 应该了解的其他库141
5.7 正确处理异常和错误142
5.7.1 防患于未然142
5.7.2 从字面上讲,例外就是异常146
5.7.3 如果不能恢复,则尽快退出147
5.7.4 用户自定义异常148
5.7.5 值类型抛出,常量引用类型
捕获149
5.7.6 注意catch的正确顺序150
5.8 接口设计150
5.8.1 Attribute151
5.8.2 concept:模板参数的要求155
第6章 模块化编程159
6.1 模块化的基础160
6.1.1 模块设计的原则160
6.1.2 小结162
6.2 面向对象163
6.2.1 面向对象思想164
6.2.2 类的设计原则165
6.3 模块200
6.3.1 #include的缺点200
6.3.2 使用模块来解决202
6.3.3 底层实现203
6.3.4 使用模块的三种方案204
6.3.5 模块的影响207
第7章 函数式编程208
7.1 什么是函数式编程209
7.1.1 什么是函数210
7.1.2 纯函数和非纯函数211
7.2 现代C 中的函数式编程212
7.2.1 基于模板的函数式编程212
7.2.2 仿函数214
7.2.3 绑定包装和函数包装221
7.2.4 Lambda表达式223
7.2.5 通用Lambda表达式225
7.2.6 Lambda模板226
7.3 高级函数228
7.4 管道与范围适配器233
7.5 整洁的函数式编程代码236
第8章 测试驱动开发238
8.1 传统单元测试的缺点239
8.2 作为颠覆者的测试驱动开发240
8.2.1 TDD的流程240
8.2.2 TDD示例:罗马数字的
^ 收 起