第1章 用UML对Java建模导论 1
1.1 什么是建模 2
1.1.1 简化 2
1.1.2 不同的视角 3
1.1.3 通用符号 3
1.2 UML 4
1.3 用UML对软件系统建模 12
1.3.1 客户的角度 12
1.3.2 开发者的角度 12
1.4 建模过程 13
1.4.1 需求收集 13
1.4.2 分析 13
1.4.3 技术选择 13
1.4.4 构架 14
1.4.5 设计和实现 14
1.5 下一步 15
第2章 利用UML收集需求 17
2.1 准备好了吗 17
2.2 什么是好的需求 18
2.2.1 寻找合适的人 18
2.2.2 倾听相关人员的需求 19
2.2.3 开发一个可理解的需求 20
2.2.4 详细和完整地描述需求 23
2.2.5 重构用例模型 25
2.3 收集用户需求的准则 31
2.3.1 集中在问题上 31
2.3.2 不要放弃 32
2.3.3 不要走得太远 32
2.3.4 对过程要有信心 33
2.4 如何检测不好的需求 34
2.4.1 问题1:进度压力太大 34
2.4.2 问题2:愿景不明朗 35
2.4.3 问题3:过早的构架和设计 36
2.5 下一步 37
第3章 为考勤卡应用程序收集需求 39
3.1 听相关人员说 39
3.2 构建用例图 41
3.2.1 寻找参与者 41
3.2.2 寻找用例 42
3.2.3 确定参与者和用例之间的关系 44
3.3 描述细节 45
3.4 收集更多的需求 53
3.5 修订用例模型 56
3.5.1 修订用例图 56
3.5.2 修订用例文档 58
3.6 下一步 68
第4章 用UML进行面向对象分析简介 71
4.1 准备好了吗 71
4.1.1 可靠的需求 72
4.1.2 用例分级 72
4.2 什么是面向对象分析 73
4.2.1 分析模型 74
4.2.2 与用例模型的关系 74
4.2.3 面向对象分析的步骤 74
4.3 寻找候选对象 74
4.3.1 寻找对象的准则 75
4.3.2 寻找对象的步骤 76
4.4 描述行为 82
4.4.1 寻找行为的准则 82
4.4.2 描述行为的步骤 84
4.5 描述类 88
4.5.1 描述类的规则 88
4.5.2 描述类的步骤 89
4.6 下一步 92
第5章 考勤卡应用程序分析模型 93
5.1 用例分级 93
5.1.1 分级系统 93
5.1.2 评估“Export Time Entries”用例 96
5.1.3 评估“Create Charge Code”用例 97
5.1.4 评估“Change Password”用例 98
5.1.5 评估“Login”用例 98
5.1.6 评估“Record Time”用例 99
5.1.7 评估“Create Employee”用例 100
5.1.8 选择第一次迭代的用例 101
5.2 寻找候选对象 101
5.2.1 寻找实体对象 101
5.2.2 寻找边界对象 105
5.2.3 寻找控制类 106
5.2.4 寻找生命周期类 106
5.3 描述对象交互 106
5.3.1 为“Login”添加假设的行为 107
5.3.2 为“Login”构建顺序图 107
5.3.3 验证“Login”序列 110
5.3.4 其他用例的顺序图和类图 111
5.4 描述类 114
5.4.1 寻找“Login”中的关系 115
5.4.2 寻找“ExportTime Entries”中的关系 116
5.4.3 寻找“RecordTime”中的关系 117
5.5 下一步 117
第6章 从选择技术的角度描述系统 119
6.1 准备好了吗 119
6.2 将分析类分组 120
6.2.1 边界类:用户界面 120
6.2.2 边界类:系统接口 121
6.2.3 控制类、实体类和生命周期类 122
6.3 描述每一个组 122
6.3.1 用户界面复杂度 123
6.3.2 用户界面的部署约束 124
6.3.3 用户的数量和类型 125
6.3.4 可用带宽 126
6.3.5 系统接口类型 127
6.3.6 性能和可伸缩性 128
6.4 考勤卡应用程序的技术需求 129
6.4.1 寻找分析类的分组 129
6.4.2 用户界面复杂度 129
6.4.3 用户界面的部署约束 131
6.4.4 用户的数量和类型 132
6.4.5 可用带宽 133
6.4.6 系统接口的类型 133
6.4.7 性能和可伸缩性 133
6.5 下一步 136
第7章 为边界类评估候选技术 139
7.1 技术模板 139
7.2 Swing 140
7.2.1 令人生畏的细节 141
7.2.2 优势 150
7.2.3 不足 151
7.2.4 兼容技术 151
7.2.5 采用成本 151
7.2.6 合适性 152
7.3 Java servlet 153
7.3.1 令人生畏的细节 155
7.3.2 优势 157
7.3.3 不足 157
7.3.4 兼容技术 157
7.3.5 采用成本 157
7.3.6 合适性 158
7.4 XML 160
7.4.1 令人生畏的细节 161
7.4.2 优势 163
7.4.3 不足 163
7.4.4 兼容技术 163
7.4.5 采用成本 163
7.4.6 合适性 164
7.5 考勤卡系统的技术选择 165
7.6 结论 166
7.7 下一步 166
第8章 为控制类和实体类评估候选技术 169
8.1 RMI 169
8.1.1 令人生畏的细节 170
8.1.2 RMI的一般用法 173
8.1.3 优势 177
8.1.4 不足 177
8.1.5 兼容技术 178
8.1.6 采用成本 178
8.2 JDBC 178
8.2.1 令人生畏的细节 179
8.2.2 优势 183
8.2.3 不足 183
8.2.4 兼容技术 183
8.2.5 采用成本 183
8.2.6 RMI和JDBC的合适性 184
8.3 EJB 1.1 184
8.3.1 令人生畏的细节 187
8.3.2 优势 190
8.3.3 不足 191
8.3.4 兼容技术 191
8.3.5 采用成本 191
8.3.6 合适性 192
8.4 技术选择范例 193
8.5 下一步 194
第9章 软件构架 195
9.1 准备好了吗 196
9.1.1 清晰准确地理解所面对的问题 196
9.1.2 清晰准确地理解候选技术 196
9.2 软件构架的目标 196
9.2.1 可扩展性 197
9.2.2 可维护性 197
9.2.3 可靠性 197
9.2.4 可伸缩性 197
9.3 UML和构架 198
9.3.1 包 198
9.3.2 包依赖关系 200
9.3.3 子系统 203
9.4 软件构架的准则 204
9.4.1 内聚性 205
9.4.2 耦合性 205
9.5 建立软件构架 205
9.5.1 构架师 205
9.5.2 过程 206
9.6 考勤卡系统的样本构架 208
9.6.1 确立目标 208
9.6.2 将类分组并评估各个类 208
9.6.3 展示技术 215
9.6.4 抽取子系统 216
9.6.5 针对准则和目标对构架进行评估 218
9.7 下一步 218
第10章 设计入门 221
10.1 什么是设计 221
10.2 准备好了吗 221
10.3 设计的必要性 222
10.3.1 生产力和士气 222
10.3.2 一种具有适应能力的交流工作 223
10.3.3 进度安排和工作分配 223
10.4 设计模式 223
10.4.1 益处 224
10.4.2 使用 225
10.5 规划设计工作 225
10.5.1 为整个设计建立目标 225
10.5.2 建立设计准则 227
10.5.3 寻找独立的设计工作 228
10.6 设计包或者子系统 228
10.7 考勤卡系统的设计工作 229
10.8 下一步 230
第11章 设计TimecardDomain包和Timecard Workflow包 231
11.1 确定工作目标 231
11.1.1 性能和可靠性 232
11.1.2 重用 232
11.1.3 可扩展性 232
11.2 对前一步工作进行评审 232
11.2.1 分析模型的评审 232
11.2.2 对系统构架约束进行评审 240
11.2.3 针对目标进行设计 241
11.3 将设计应用于用例 242
11.3.1 “Login”用例的设计 243
11.3.2 “Record Time”用例的设计 245
11.3.3 “Export Time Entries”用例的设计 250
11.4 评估设计方案 255
11.5 实现 257
11.5.1 User实体bean 257
11.5.2 Timecard实体bean 263
11.5.3 LoginWorkflow无状态会话bean 272
11.5.4 RecordTimeWorkflow有状态会话bean 277
11.5.5 支撑类 281
11.5.6 ChargeCodeHome 288
11.5.7 ChargeCodeWrapper.java 299
11.5.8 Node.java 300
11.6 下一步 301
第12章 为生成HTML页面进行设计 303
12.1 设计目标 303
12.1.1 目标1:支持视图的模块结构 304
12.1.2 目标2:简单化HTML的生成 304
12.1.3 目标3:支持偏好 305
12.1.4 目标4:可扩展性和封装 306
12.2 按目标进行设计 306
12.2.1 按目标1进行设计:支持视图的模块结构 307
12.2.2 按目标2进行设计:简单化HTML的生成 310
12.2.3 按目标3进行设计:支持偏好 316
12.2.4 按目标4进行设计:可扩展性和封装 317
12.3 填充细节 320
12.3.1 登录界面 320
12.3.2 时间条目 324
12.4 实现 325
12.4.1 IHtmlProducer.java 325
12.4.2 ComboBoxProducer.java 326
12.4.3 FormProducer.java 327
12.4.4 PageProducer.iava 329
12.4.5 SubmitButtonProducer 330
12.4.6 TableProducer.iava 331
12.4.7 TabularInputFormProducer.java 333
12.4.8 TextFieldProducer.java 335
12.4.9 TextProducer.java 337
12.4.10 IConcreteProducer.java 338
12.4.11 ProducerFactory.java 339
12.4.12 FormProducerGeneric.java 343
12.4.13 PageProducerGeneric.java 345
12.4.14 TableProducerGeneric.java 347
12.4.15 TabularlnputFonnProducerGeneric.java 348
12.5 下一步 350
第13章 TimecardUI包的设计 351
13.1 确定设计目标 351
13.1.1 可扩展性 351
13.1.2 可测试性 352
13.2 评审先前的步骤 352
13.2.1 评审构架约束 352
13.2.2 评审分析模型 352
13.3 针对目标进行设计 357
13.4 每个用例的设计 358
13.4.1 为“Login”用例进行设计 358
13.4.2 为“RecordTime”用例进行设计 361
13.5 实现 365
13.5.1 LoginServlet.java 365
13.5.2 RecordTimeServlet.java 370
13.5.3 BasicServlet.java 375
13.6 下一步 377
第14章 BillingSystemInterface的设计 379
14.1 认清目标 379
14.1.1 清晰度 379
14.1.2 性能和可靠性 380
14.1.3 可扩展性 380
14.1.4 重用潜力 380
14.2 分析模型的评审 380
14.3 构架的评审 380
14.4 设计 380
14.4.1 输出指定用户的顺序图 383
14.4.2 输出所有用户的顺序图 384
14.4.3 参与类 385
14.5 实现 385
14.5.1 ExportCriteria.java 385
14.5.2 ExportFile.Java 389
14.5.3 ExportTimeEntriesApplication.java 392
14.6 小结 395
附录A 术语表 397
附录B 额外资源 413
附录C 光盘中的内容 417