第一部分 理论与理由 4
第1章 软件开发的艺术 4
1.1理性主义,经验主义以及无绪 4
1.2软件的演变过程 6
1.3大型软件 8
1.4漂亮,真理和优雅 9
1.5更好的无绪 12
第2章 设计API的动力之源 14
2.1分布式开发 14
2.2模块化应用程序 16
2.3交流互通才是一切 20
2.4经验主义编程方式 22
2.5开发第一个版本通常比较容易 24
第3章 评价API好坏的标准 26
3.1方法和字段签名 26
3.2文件及其内容 27
3.3环境变量和命令行选项 29
3.4文本信息也是API 30
3.5.协议 32
3.6行为 35
3.7国际化支持和信息国际化 35
3.8 API的广泛定义 37
3.9如何检查API的质量 37
3.9.1可理解性 37
3.9.2一致性 38
3.9.3可见性 39
3.9.4简单的任务应该有简单的方案 40
3.9.5保护投资 40
第4章 不断变化的目标 42
4.1第一个版本远非完美 42
4.2向后兼容 43
4.2.1源代码兼容 43
4.2.2二进制兼容 44
4.2.3功能兼容——阿米巴变形虫效应 50
4.3面向用例的重要性 52
4.4 API设计评审 55
4.5一个API的生命周期 56
4.6逐步改善 60
第二部分 设计实战 67
第5章 只公开你要公开的内容 67
5.1方法优于字段 68
5.2工厂方法优于构造函数 70
5.3让所有内容都不可更改 71
5.4避免滥用setter方法 72
5.5尽可能通过友元的方式来公开功能 73
5.6赋予对象创建者更多权利 77
5.7避免暴露深层次继承 82
第6章 面向接口而非实现进行编程 85
6.1移除方法或者字段 87
6.2移除或者添加一个类或者接口 88
6.3向现有的继承体系中添加一个接口或者类 88
6.4添加方法或者字段 88
6.5 Java中接口和类的区别 90
6.6弱点背后的优点 91
6.7添加方法的另一种方案 92
6.8抽象类有没有用呢 94
6.9要为增加参数做好准备 95
6.10接口 VS.类 97
第7章 模块化架构 98
7.1模块化设计的类型 100
7.2组件定位和交互 103
7.3编写扩展点 116
7.4循环依赖的必要性 117
7.5满城尽是Lookup 121
7.6 Lookup的滥用 126
第8章 设计API时要区分其目标用户群 129
8.1 C和Java语言中如何定义API和SPI 129
8.2 API演进不同于SPI演进 131
8.3 java.io.Writer这个类从JDK1.4到JDK 5的演进 131
8.4合理分解API 143
第9章 牢记可测试性 147
9.1 API设计和测试 148
9.2规范的光环正在褪去 151
9.3好工具让API设计更简单 153
9.4兼容性测试套件 155
第10章 与其他API协作 158
10.1谨慎使用第三方API 158
10.2只暴露抽象内容 162
10.3强化API的一致性 164
10.4代理和组合 168
10.5避免API的误用 176
10.6不要滥用JavaBeans那种监听器机制 180
第11章API具体运行时的一些内容 184
11.1不要冒险 186
11.2可靠性与无绪 189
11.3同步和死锁 191
11.3.1描述线程模型 192
11.3.2 Java Monitors中的陷阱 193
11.3.3触发死锁的条件 196
11.3.4测试死锁 201
11.3.5对条件竞争进行测试 204
11.3.6分析随机故障 206
11.3.7日志的高级用途 208
11.3.8使用日志记录程序控制流程 210
11.4循环调用的问题 215
11.5内存管理 218
第12章 声明式编程 223
12.1让对象不可变 225
12.2不可变的行为 229
12.3文档兼容性 230
第三部分 日常生活 236
第13章 极端的意见有害无益 236
13.1 API必须是漂亮的 237
13.2 API必须是正确的 237
13.3 API应该尽量简单 240
13.4 API必须是高性能的 242
13.5 API必须绝对兼容 242
13.6 API必须是对称的 245
第14章API设计中的矛盾之处 247
14.1 API设计中的自相矛盾 248
14.2背后隐藏的工作 251
14.3不要害怕发布一个稳定的API 252
14.4降低维护费用 255
第15章 改进API 258
15.1让有问题的类库重新焕发活力 259
15.2自觉地升级与无意识地被迫升级 265
15.3可选的行为 268
15.4相似API的桥接和共存 274
第16章 团队协作 286
16.1在提交代码时进行代码评审 286
16.2说服开发人员为他们的API提供文档 290
16.3尽职尽责的监控者 292
16.4.接受API的补丁 297
第17章 利用竞赛游戏来提升API设计技巧 300
17.1概述 300
17.2第一天 301
17.2.1非public类带来的问题 304
17.2.2不可变性带来的问题 304
17.2.3遗漏实现的问题 308
17.2.4返回结果可能不正确的问题 309
17.2.5第一天的解决方案 310
17.3第二天 313
17.3.1我想修正犯下的错误 316
17.3.2第二天的解决方案 317
17.4第三天:评判日 320
17.5也来玩下这个游戏吧 327
第18章 可扩展Visitor模式的案例 328
18.1抽象类 331
18.2为改进做好准备 333
18.3默认的遍历 334
18.4清楚地定义每个版本 337
18.5单向改进 339
18.6使用接口时的数据结构 340
18.7针对用户和开发商的Visitor模式 341
18.8三重调度 343
18.9 Visitor模式的圆满结局 345
18.10语法小技巧 346
第19章 消亡的过程 348
19.1明确版本的重要性 349
19.2模块依赖的重要性 349
19.3被移除的部分需要永久保留吗 352
19.4分解庞大的API 352
第20章 未来 356
20.1原则性内容 357
20.2无绪长存 358
20.3 API设计方法论 360
20.4编程语言的演变 361
20.5教育的作用 363
20.6共享 365
参考书目 366