目录(1)
第1章 API简介1
1.1 什么是API1
1.1.1 契约和承包人2
1.1.2 C++(www.cppentry.com)中的API3
1.2 API设计上有什么不同4
1.3 为什么使用API5
1.3.1 更健壮的代码6
1.3.2 代码复用6
1.3.3 并行开发8
1.4 何时应当避免使用API9
1.5 API示例10
1.5.1 API层次10
1.5.2 真实示例12
1.6 文件格式和网络协议13
1.7 关于本书15
第2章 特征17
2.1 问题域建模17
2.1.1 提供良好的抽象17
2.1.2 关键对象的建模19
2.2 隐藏实现细节20
2.2.1 物理隐藏:声明与定义20
2.2.2 逻辑隐藏:封装22
2.2.3 隐藏成员变量23
2.2.4 隐藏实现方法26
2.2.5 隐藏实现类28
2.3 最小完备性29
2.3.1 不要过度承诺29
2.3.2 谨慎添加虚函数30
2.3.3 便捷API31
2.4 易用性33
2.4.1 可发现性34
2.4.2 不易误用34
2.4.3 一致性36
2.4.4 正交38
2.4.5 健壮的资源分配40
2.4.6 平台独立43
2.5 松耦合44
2.5.1 仅通过名字耦合45
2.5.2 降低类耦合45
2.5.3 刻意的冗余47
2.5.4 管理器类48
2.5.5 回调、观察者和通知50
2.6 稳定的、文档详细且经过测试的API53
第3章 模式54
3.1 Pimpl惯用法55
3.1.1 使用Pimpl56
3.1.2 复制语义59
3.1.3 Pimpl与智能指针60
3.1.4 Pimpl的优点61
3.1.5 Pimpl的缺点62
3.1.6 C语言的不透明指针62
3.2 单例64
3.2.1 在C++(www.cppentry.com)中实现单例64
3.2.2 使单例线程安全66
3.2.3 单例与依赖注入68
3.2.4 单例与单一状态69
3.2.5 单例与会话状态71
3.3 工厂模式71
3.3.1 抽象基类72
3.3.2 工厂示例73
3.3.3 扩展工厂示例74
3.4 API包装器模式76
3.4.1 代理模式76
3.4.2 适配器模式79
3.4.3 外观模式81
3.5 观察者模式83
3.5.1 MVC架构83
3.5.2 实现观察者模式84
3.5.3 推与拉观察者87
第4章 设计88
4.1 良好设计的例子89
4.1.1 积累技术债89
4.1.2 偿还技术债90
4.1.3 为长期而设计91
4.2 收集功能性需求92
4.2.1 什么是功能性需求93
4.2.2 功能性需求举例94
4.2.3 维护需求94
4.3 创建用例95
4.3.1 开发用例95
4.3.2 用例模板95
4.3.3 编写高质量用例96
4.3.4 需求与敏捷开发98
4.4 API设计的元素100
4.5 架构设计102
4.5.1 架构的开发103
4.5.2 架构的约束104
4.5.3 识别主要抽象105
4.5.4 创造关键对象106
4.5.5 架构模式109
4.5.6 架构的交流110
4.6 类的设计111
4.6.1 面向对象概念112
4.6.2 类设计选项113
4.6.3 使用继承113
4.6.4 Liskov替换原则115
4.6.5 开放 封闭原则118
4.6.6 迪米特法则119
4.6.7 类的命名120
4.7 函数设计121
4.7.1 函数设计选项121
4.7.2 函数命名122
4.7.3 函数参数123
4.7.4 错误处理125
第5章 风格129
5.1 纯C API129
5.1.1 ANSI C特性130
5.1.2 ANSI C API的优点132
5.1.3 使用ANSI C编写API132
5.1.4 从C++(www.cppentry.com)中调用C函数134
5.1.5 案例研究:FMOD C API135
5.2 面向对象的C++(www.cppentry.com) API136
5.2.1 面向对象API的优点136
5.2.2 面向对象API的缺点136
5.2.3 案例研究:FMOD C++(www.cppentry.com) API137
5.3 基于模板的API138
5.3.1 基于模板的API示例138
5.3.2 模板与宏139
5.3.3 基于模板的API的优点140
5.3.4 基于模板的API的缺点141
5.4 数据驱动型API141
5.4.1 数据驱动型Web服务142
5.4.2 数据驱动型API的优点143
5.4.3 数据驱动API的缺点144
5.4.4 支持可变参数列表144
5.4.5 案例研究:FMOD数据驱动型API147