目录 1
第1章契约式设计初探 1
1.1概述 1
1.2顾客管理器范例 2
1.3一些问题 5
1.4 CUSTOMER—MANAGER的契约 6
1.5 临时总结 9
1.6运行时检测 11
1.7可靠的文档 13
1.8 小结 15
1.9一言以蔽之 15
1.10练习 15
第2章契约式设计的基本原则 17
2.1 关于本章 17
2.2栈 18
2.3区分命令和查询 19
2.4命名规范 22
2.5区分基本查询和派生查询 23
2.6说明命令对基本查询的影响 26
2.7用不变式确定恒定特性 34
2.8类及其契约 36
2.9基本查询是栈的一个概念模型 38
2.10六大原则 42
2.11 练习 43
第3章运用六大原则 47
3.1 关于本章 47
3.2字典 47
3.3特性分离与分类 48
3.4后验条件 50
3.5先验条件 56
3.6不变式 62
3.7关于字典的完整的契约级概括 63
3.8 小结 65
3.9练习 66
第4章契约的构造支持类——不可变列表 69
4.1 关于本章 69
4.2支持线性结构 69
4.3契约只涉及表达式 70
4.4不可变列表 71
4.5不可变列表的契约 72
4.5.1基本查询 72
4.5.2创建命令 74
4.5.3派生查询count 74
4.5.4派生查询preceded_by 74
4.5.5派生查询item 75
4.5.6派生查询is_equal 77
4.5.7派生查询sublist 79
4.7练习 81
4.6小结 81
第5章六大原则在QUEUE设计中的运用 83
5.1 关于本章 83
5.2队列 83
5.3 remove特性的契约 84
5.4将count作为一个派生特性 88
5.5 initialize特性的契约 91
5.6 head特性的契约 93
5.8更多派生查询 94
5.7put特性的契约 94
5.9小结 95
5.10练习 96
第6章契约式设计与继承 99
6.1关于本章 99
6.2超类和子类 99
6.3重新定义契约 100
6.3.1 Eiffel 语法 104
6.3.2小结 107
6.4不变式和继承 108
6.5以被确保的后验条件定义超类 109
6.6两种继承 116
6.7小结 117
6.8练习 117
第7章框定规则 119
7.1关于本章 119
7.2变化规格和框定规则 119
7.3使用不可变列表为put撰写框定规则 121
7.4使用“forall”为put撰写框定规则 128
7.5框定规则的类别 130
7.7关于预处理器的补充说明 132
7.6练习 132
第8章契约式设计的收益 137
8.1关于本章 137
8.2几种优点 137
8.3更优秀的设计 138
8.4提高可靠性 140
8.5更出色的文档 140
8.7支持复用 142
8.6简化调试 142
8.8契约式设计与防御性编程 143
8.8.1防止程序接受错误的输入 143
8.8.2给程序穿上“防弹衣” 144
8.8.3防御性编程 145
8.9契约的一些开销和限制 146
第9章观察者框架中的契约 149
9.1关于本章 149
9.2观察者框架 150
9.3不可变集合 152
9.4观察者的系缚和解缚 155
9.5通知(一个观察者) 156
9.6通知(多个观察者) 158
9.7性能问题 160
9.8框定规则 161
9.9保密 164
9.10练习 166
10.1关于本章 169
第10章满足先验条件 169
10.2例子 170
10.3满足并测试先验条件 170
10.4测试与检验 172
10.5一个简单的计数器类 173
10.6从用户角度看示例程序 174
10.7程序的内部结构 176
10.8程序的执行情况 178
10.9一个次要的细节 184
10.10小结 186
10.11练习 187
第11章Java范例 189
11.1关于本章 189
11.2为什么选择Java 190
11.3队列 190
11.3.1基本查询size() 192
11.3.2基本查询get() 193
11.3.3基本查询head() 193
11.3.5派生查询shallow Copy() 194
11.3.4派生查询isEmpty() 194
11.3.6构造方法Queue 195
11.3.7命令put 196
11.3.8命令remove 196
11.3.9小结 198
11.4字典 198
11.4.1名字 199
11.4.2不变式 200
11.4.3基本查询 200
11.4.5命令 201
11.4.4一个派生查询 201
11.4.6构造方法 202
11.4.7一组实现类 203
11.5没有iContract的Java 203
11.6测试先验条件 207
11.7练习 212
第12章契约式分析 215
12.1关于本章 215
12.2一个用例 215
12.4 withdrawCash用例的契约 217
12.3分析模型中的契约 217
12.5从分析到设计 220
12.6问题域和系统模型 221
12.7对象限制语言 224
12.8小结 225
参考资料 227
契约式设计的理解及其在C/C++语言中的运用 231
什么是契约——Eiffel的观点 236
契约思想的一个反面案例 242
索引 245