第1章 绪论 1
1.1 软件概述 1
1.1.1 什么是计算机软件 1
1.1.2 软件的特点 2
1.1.3 软件的分类 3
1.1.4 软件的发展 5
1.1.5 软件危机 5
1.2 软件工程 7
1.2.1 软件工程与方法学 8
1.2.2 软件工程的基本原理 9
1.2.3 软件工程的目标 11
1.2.4 软件工程的内容 12
1.2.5 软件工程原则 13
1.2.6 软件工程面临的问题 14
小结 15
综合练习一 15
一、填空题 15
二、选择题 15
三、简答题 16
第2章 基本理论 17
2.1 软件工程过程 17
2.2 软件生命周期 17
2.2.1 软件分析时期 18
2.2.2 软件设计时期 19
2.2.3 编码与测试时期 20
2.2.4 运行与维护时期 21
2.3 软件生命周期模型 21
2.3.1 软件生命周期模型的概念 21
2.3.2 瀑布模型 22
2.3.3 原型模型 23
2.3.4 增量模型 24
2.3.5 螺旋模型 26
2.3.6 喷泉模型 27
2.3.7 基于知识的模型 28
2.3.8 变换模型 29
2.4 软件开发方法 29
2.4.1 结构化方法 29
2.4.2 Jackson方法 30
2.4.3 维也纳开发方法 30
2.4.4 面向对象的开发方法 31
2.5 软件工具与开发 31
2.5.1 软件工具箱 31
2.5.2 软件开发环境 32
2.5.3 计算机辅助软件工程 32
小结 32
综合练习二 33
一、填空题 33
二、选择题 33
三、简答题 33
第3章 可行性研究 34
3.1 可行性研究任务与步骤 34
3.1.1 研究任务 35
3.1.2 研究步骤 37
3.2 系统分析 39
3.2.1 系统分析员 39
3.2.2 面临的问题域 40
3.2.3 通信技术 40
3.3 分析原理 42
3.3.1 信息域 42
3.3.2 建立模型 43
3.3.3 分解 44
3.4 系统模型与模拟 45
3.4.1 系统模型 45
3.4.2 系统建模和模拟 46
3.5 成本-效益分析 47
3.6 可行性研究的文档 49
3.7 项目开发计划 50
3.7.1 方案选择 50
3.7.2 制定项目开发计划 50
小结 51
综合练习三 51
一、填空题 51
二、选择题 51
三、简答题 52
第4章 软件需求分析 53
4.1 需求分析 53
4.1.1 需求分析的特点 53
4.1.2 需求分析的原则 54
4.1.3 需求分析的任务 54
4.1.4 需求分析的方法 55
4.2 结构化分析 57
4.2.1 自顶向下逐层分解 57
4.2.2 结构化分析步骤 58
4.3 系统流程图 59
4.4 数据流图 60
4.4.1 基本图形符号 61
4.4.2 画数据流图 62
4.4.3 结构化分析方法的应用 65
4.5 数据字典 69
4.5.1 内容及格式 69
4.5.2 数据字典的实现 71
4.6 关系数据理论 71
4.6.1 数据依赖 72
4.6.2 关系模式的操作异常 72
4.6.3 范式 73
4.6.4 EAR方法 77
小结 80
综合练习四 80
一、填空题 80
二、选择题 80
三、简答题 81
第5章 总体设计 82
5.1 软件设计的重要性 82
5.2 设计过程 83
5.3 软件总体设计 84
5.4 设计基本原理 85
5.4.1 抽象 86
5.4.2 细化 86
5.4.3 模块化 87
5.4.4 软件体系结构 88
5.4.5 程序结构 89
5.4.6 数据结构 90
5.4.7 软件过程 91
5.5 体系结构设计 92
5.5.1 软件结构图 92
5.5.2 模块的大小 94
5.5.3 扇出和扇入与深度和宽度 94
5.5.4 模块的耦合 95
5.5.5 模块的内聚 97
5.5.6 结构设计的一般准则 99
5.5.7 模块的作用域与控制域 101
5.6 结构化设计 101
5.6.1 数据流的类型 102
5.6.2 过程步骤 103
5.6.3 变换分析设计 104
5.6.4 事务分析设计 105
5.6.5 混合流设计 106
5.6.6 结构化设计方法应用示例 108
5.6.7 设计的后期处理 109
5.7 软件结构优化 109
5.7.1 软件结构设计优化准则 109
5.7.2 软件结构的HIPO图 111
小结 111
综合练习五 112
一、填空题 112
二、选择题 112
三、简答题 112
第6章 软件详细设计 113
6.1 细节设计的任务与方法 113
6.1.1 细节设计的基本任务 113
6.1.2 细节设计方法 114
6.2 设计表示法 115
6.2.1 结构化语言 115
6.2.2 判定表 115
6.2.3 判定树 116
6.3 结构化程序设计 117
6.3.1 程序流程图 117
6.3.2 三种基本控制结构 118
6.3.3 常用符号 119
6.4 结构化定理 120
6.4.1 程序函数 121
6.4.2 基本定理 121
6.4.3 常见错误 122
6.4.4 过程设计语言 124
6.5 面向数据结构的设计 127
6.5.1 Jackson图 127
6.5.2 纲要逻辑 129
6.5.3 Jackson方法 129
6.5.4 JSP应用 130
6.5.5 JSD方法 132
小结 136
综合练习六 137
一、填空题 137
二、选择题 137
三、简答题 137
第7章 面向对象方法概论 139
7.1 面向对象简介 139
7.1.1 什么是面向对象 139
7.1.2 面向对象方法的历史及现状 141
7.2 面向对象的相关概念 141
7.2.1 对象 141
7.2.2 类 143
7.2.3 对象图 144
7.2.4 属性 144
7.2.5 服务(操作或方法) 145
7.2.6 封装 145
7.2.7 继承 146
7.2.8 多重继承 149
7.2.9 消息 151
7.2.10 结构与连接 152
7.2.11 多态性 153
7.2.12 永久对象 156
7.2.13 主动对象 156
7.2.14 对象类的表示方法 157
7.3 链接与关联 157
7.3.1 一般概念 157
7.3.2 重数 158
7.3.3 关联的重要性 159
7.3.4 三元关联 159
7.3.5 关联的候选关键字 159
7.3.6 异或关联 160
7.3.7 资格关联 160
7.3.8 链接属性 160
7.3.9 用关联模型化为类 161
7.3.10 角色名 161
7.3.11 排序 162
7.3.12 资格符 162
7.4 聚合 163
7.4.1 聚合与关联 163
7.4.2 聚合与概括 163
7.4.3 递归聚合 164
7.4.4 操作的传播 165
7.4.5 物理聚合与分类聚合 165
7.4.6 物理聚合的语义扩展 166
7.4.7 分类聚合的语义扩展 166
7.5 概括 166
7.5.1 一般概念 166
7.5.2 概括的使用 167
7.5.3 重写特征 167
7.5.4 抽象类和具体类 168
7.5.5 概括与其他对象建模结构 168
7.6 构造分组 169
7.6.1 模块 169
7.6.2 表 169
小结 169
综合练习七 169
一、填空题 169
二、选择题 170
三、简答题 170
第8章 模型 171
8.1 统一建模语言 171
8.1.1 模型的建立 172
8.1.2 UML的基本图标 172
8.1.3 UML的基本元素 181
8.1.4 UML的语法规则 181
8.1.5 UML的词别 182
8.2 对象模型 182
8.2.1 表示方法 182
8.2.2 表示结构 183
8.2.3 例子 185
8.3 动态模型 185
8.3.1 事件和状态 186
8.3.2 操作 190
8.3.3 嵌套状态图 191
8.3.4 实践技巧 194
8.4 功能模型 195
8.4.1 数据流图 195
8.4.2 指定的操作 196
8.4.3 约束 197
8.4.4 功能模型的实例(飞行模拟机装置) 197
8.4.5 功能模型与对象模型和动态模型的关系 200
小结 201
综合练习八 201
一、填空题 201
二、选择题 201
三、简答题 202
第9章 发现对象、建立对象类 203
9.1 对象、主动对象以及它们的类 203
9.2 表示法 204
9.3 研究问题域和用户需求 205
9.3.1 研究用户需求,明确系统责任 205
9.3.2 研究问题域 206
9.3.3 确定系统边界 207
9.4 发现对象 207
9.4.1 正确地运用抽象原则 207
9.4.2 策略与启发 208
9.4.3 审查和筛选 210
9.4.4 识别主动对象 212
9.5 对象的发现和标识 212
9.5.1 动机 212
9.5.2 方法 213
9.5.3 三视图模型(3VM) 213
9.5.4 语言信息分析 214
9.6 对象分类,建立类图的对象层 216
9.6.1 异常情况的检查和调整 216
9.6.2 类的命名 217
9.6.3 建立类图的对象层 217
9.7 电梯例子 218
9.7.1 功能需求 218
9.7.2 发现对象 218
9.7.3 对象层表示 219
小结 219
综合练习九 219
一、填空题 219
二、选择题 220
三、简答题 220
第10章 定义属性与服务 221
10.1 对象的属性和服务 221
10.2 表示法 222
10.3 定义属性 222
10.3.1 策略与启发 222
10.3.2 审查与筛选 223
10.3.3 推迟到OOD考虑的问题 225
10.3.4 属性的命名和定位 226
10.3.5 属性的详细说明 226
10.4 定义服务 226
10.4.1 对象的状态与状态转换图 226
10.4.2 行为分类 228
10.4.3 发现服务的策略与启发 229
10.4.4 审查与调整 229
10.4.5 认识对象的主动行为 230
10.4.6 服务的命名和定位 230
10.4.7 服务的详细说明 230
10.5 建立类图的特征层 231
10.6 电梯例子 231
10.6.1 电梯系统的属性描述 232
10.6.2 电梯系统的服务定义 233
10.6.3 电梯系统的特征层 238
小结 238
综合练习十 238
一、填空题 238
二、选择题 239
三、简答题 239
第11章 定义结构与连接 240
11.1 整体-部分结构 240
11.1.1 整体-部分结构及其用途 240
11.1.2 表示法 242
11.1.3 如何发现整体-部分结构 243
11.1.4 审查与筛选 244
11.1.5 简化对象的定义 244
11.1.6 支持软件复用 245
11.1.7 整体-部分结构的进一步运用 246
11.1.8 调整对象层和属性层 247
11.2 一般-特殊结构 247
11.2.1 一般-特殊结构及其用途 247
11.2.2 表示法 248
11.2.3 如何发现一般-特殊结构 249
11.2.4 审查与调整 250
11.2.5 多继承及多态性问题 250
11.2.6 一般-特殊结构的简化 253
11.2.7 调整对象层和特征层 253
11.3 实例连接 253
11.3.1 简单的实例连接 254
11.3.2 复杂的实例连接及其表示 255
11.3.3 三元关联问题 257
11.3.4 如何建立实例连接 257
11.3.5 对象层、特征层的增补及实例连接说明 259
11.4 消息连接 259
11.4.1 消息的定义 259
11.4.2 顺序系统中的消息 259
11.4.3 并发系统中的消息 260
11.4.4 消息对OOA的意义 263
11.4.5 OOA对消息的表示——消息连接 263
11.5 如何建立消息连接 264
11.5.1 建立控制线程内部的消息连接 264
11.5.2 建立控制线程之间的消息连接 265
11.5.3 对象分布问题及其消息的影响 265
11.6 消息的详细说明 266
11.7 电梯例子 267
11.7.1 一般-特殊关系 267
11.7.2 整体-部分关系 267
11.7.3 连接 267
11.7.4 电梯控制系统的关系层 268
小结 268
综合练习十一 268
一、填空题 268
二、选择题 268
三、简答题 269
第12章 面向对象设计原则 270
12.1 类型一致性与闭合行为 270
12.1.1 类与类型 270
12.1.2 类型一致性原则 270
12.1.3 闭合行为原则 271
12.2 封装与共生性 272
12.2.1 封装结构 272
12.2.2 共生性 273
12.2.3 面向对象系统中共生性的滥用 275
12.2.4 共生性的术语 276
12.3 领域、依附集和内聚 276
12.3.1 对象类的领域 276
12.3.2 依附集 278
12.3.3 类的内聚:一个类和它的特性 280
12.4 继承与多态性的危险性 282
12.4.1 继承的滥用 282
12.4.2 错误的聚集 282
12.4.3 倒置的层次结构 282
12.4.4 混淆类及其实例 283
12.4.5 误用 283
12.4.6 多态性的危险性 284
12.5 状态空间和行为 285
12.5.1 一个类的状态空间和行为 285
12.5.2 子类的状态空间 286
12.5.3 子类的行为 286
12.5.4 状态空间的一个约束条件:类的不变式 287
12.5.5 前置条件和后置条件 288
12.5.6 类接口中支持的状态 288
12.5.7 类接口中支持的行为 289
12.5.8 类接口中操作的聚合 290
小结 290
综合练习十二 290
一、填空题 290
二、选择题 291
三、简答题 291
第13章 控制驱动部分的设计 292
13.1 什么是控制驱动部分 292
13.2 相关技术问题 292
13.2.1 系统总体方案 292
13.2.2 软件体系结构 293
13.2.3 分布式系统的体系结构风格 294
13.2.4 系统的并发性 297
13.3 如何设计控制驱动部分 300
13.3.1 选择软件体系结构风格 300
13.3.2 确定系统分布方案 301
13.3.3 识别控制流 304
13.3.4 用主动对象表示控制流 306
13.3.5 把控制驱动部分看作一个主题 308
小结 308
综合练习十三 308
一、填空题 308
二、选择题 308
三、简答题 309
第14章 对象设计 310
14.1 对象设计综述 310
14.1.1 从分析和系统结构着手 310
14.1.2 对象设计的步骤 311
14.1.3 对象模型工具 311
14.2 组合三种模型 311
14.3 设计算法 312
14.3.1 选择算法 312
14.3.2 选择数据结构 314
14.3.3 定义内部类和操作 314
14.3.4 指定操作的职责 315
14.4 设计优化 315
14.4.1 添加冗余关联获取有效访问 316
14.4.2 重新安排执行次序以获得效率 317
14.4.3 保存导出属性避免重复计算 317
14.5 控制实现 318
14.5.1 在程序内进行状态设置 318
14.5.2 状态机器引擎 319
14.5.3 控制作为并发任务 319
14.6 继承的调整 319
14.6.1 重新安排类和操作 319
14.6.2 抽象出公共的行为 320
14.6.3 使用授权共享实现 321
14.7 关联设计 322
14.7.1 分析关联遍历 322
14.7.2 单向关联 322
14.7.3 双向关联 323
14.7.4 链接属性 323
14.8 对象的表示 324
14.9 物理打包 324
14.9.1 信息隐藏 324
14.9.2 实体的相关性 325
14.9.3 构造模块 326
14.10 设计决策文档 326
小结 327
综合练习十四 327
一、填空题 327
二、选择题 327
三、简答题 328
第15章 数据库及其接口设计 329
15.1 数据管理系统及其选择 329
15.2 技术整合 336
15.3 数据接口 337
15.4 对象存储方案和数据接口的设计策略 338
15.4.1 针对文件系统的设计 339
15.4.2 针对RDBMS的设计 343
15.4.3 使用OODBMS 352
小结 352
综合练习十五 353
一、填空题 353
二、选择题 353
三、简答题 353
第16章 用户界面设计 354
16.1 人的因素 354
16.1.1 分析活动者——与系统交互的人 354
16.1.2 从Use Case分析人机交互 355
16.1.3 分析处理异常事件的人机交互 358
16.1.4 命令的组织 358
16.1.5 输出信息的组织结构 362
16.2 界面设计风格 362
16.2.1 菜单的选择 363
16.2.2 对话框 364
16.2.3 窗口 365
16.3 人机界面的设计准则 365
16.4 人机界面设计过程 367
16.4.1 用户界面模型 367
16.4.2 界面支持系统 368
16.4.3 界面元素 369
16.4.4 设计的形式 369
16.5 描述方法与技术 371
16.5.1 灵境技术 372
16.5.2 多通道人机交互技术 372
小结 373
综合练习十六 373
一、填空题 373
二、选择题 374
三、简答题 374
第17章 形式化方法 375
17.1 基础知识 375
17.1.1 形式化方法概念 375
17.1.2 形式化规约语言 376
17.2 有限状态机(FSM) 378
17.3 Petri网基本原理 379
17.3.1 静态结构 379
17.3.2 动态特征 380
17.3.3 转移启动规则 381
17.3.4 行为特性 383
17.3.5 行为特性分析方法 386
17.3.6 结构特性分析方法 392
17.3.7 Petri网到程序结构的转换 395
小结 398
综合练习十七 398
一、填空题 398
二、选择题 398
三、简答题 399
第18章 软件质量 400
18.1 软件质量概述 400
18.1.1 软件质量的定义 400
18.1.2 软件质量特性 400
18.1.3 软件质量特性之间的竞争 404
18.2 软件质量的度量和评价 405
18.2.1 软件质量的度量 405
18.2.2 软件质量度量的分类 406
18.2.3 软件质量评价 406
18.3 软件质量保证 409
18.3.1 软件质量保证的概述 409
18.3.2 软件质量保证原则 409
18.3.3 软件质量保证计划 410
18.3.4 软件质量保证的措施 410
18.3.5 软件质量管理小组 410
18.4 技术评审与审查 411
18.4.1 评审过程 411
18.4.2 选择参加评审的成员 412
18.4.3 评审的管理和组织 412
18.4.4 评审的方法 412
18.4.5 走查和审查 412
18.4.6 开发过程的评审 413
18.4.7 对评审的综合评价 414
18.5 软件的可靠性 415
小结 415
综合练习十八 415
一、填空题 415
二、选择题 416
三、简答题 416
第19章 软件实现 417
19.1 程序设计语言的特性及选择 417
19.1.1 程序设计语言特性 417
19.1.2 程序设计语言的选择 418
19.2 程序设计风格 421
19.3 程序设计效率 423
19.3.1 代码效率 423
19.3.2 内存效率 423
19.3.3 I/O效率 424
19.4 冗余编程 424
19.5 软件容错技术 425
19.5.1 容错软件 425
19.5.2 容错的一般方法 426
19.5.3 容错软件的设计过程 429
19.5.4 软件的容错系统结构 429
小结 432
综合练习十九 432
一、填空题 432
二、选择题 432
三、简答题 433
第20章 软件测试 434
20.1 软件测试概述 434
20.1.1 软件测试的目的 434
20.1.2 软件测试的原则 434
20.2 测试方法 435
20.2.1 静态测试 435
20.2.2 动态测试 435
20.3 测试用例的设计 436
20.3.1 白盒技术 436
20.3.2 黑盒技术 441
20.4 测试过程 445
20.4.1 软件测试过程中的信息 445
20.4.2 软件测试的步骤与各开发阶段的关系 445
20.4.3 单元测试 446
20.4.4 集成测试 447
20.4.5 确认测试 450
20.5 调试 451
小结 452
综合练习二十 452
一、填空题 452
二、选择题 453
三、简答题 453
第21章 软件维护 454
21.1 软件维护概述 454
21.1.1 软件维护的定义 454
21.1.2 影响维护工作的因素 455
21.1.3 维护成本 455
21.2 软件可维护性 455
21.2.1 软件可维护性的定义 455
21.2.2 可维护性的度量 456
21.3 软件维护的特点 458
21.3.1 非结构化维护和结构化维护 458
21.3.2 维护的困难性 459
21.3.3 软件维护的费用 459
21.4 软件维护的实施 460
21.4.1 维护的组织 460
21.4.2 维护的流程 460
21.4.3 维护技术 461
21.4.4 维护的副作用 462
21.5 维护“老化代码” 463
21.6 逆向工程和再工程 464
21.6.1 预防性维护 464
21.6.2 逆向工程的元素 465
21.6.3 再工程中的重构技术 465
小结 468
综合练习二十一 469
一、填空题 469
二、选择题 469
三、简答题 469
第22章 软件项目管理与计划 470
22.1 软件项目管理概述 470
22.1.1 软件管理的对象 470
22.1.2 软件开发中的资源 471
22.1.3 分解技术 472
22.2 项目管理过程 472
22.3 软件开发成本估算 473
22.3.1 软件开发成本估算方法 473
22.3.2 软件开发成本估算的经验模型 474
22.4 风险分析 476
22.4.1 风险识别 477
22.4.2 风险估算 477
22.4.3 风险评价 478
22.4.4 风险驾驭和监控 479
22.5 进度安排 480
22.5.1 软件开发小组人数与软件生产率 481
22.5.2 任务的确定与并行性 481
22.5.3 制定开发进度计划 482
22.5.4 进度安排的图形方法 483
22.5.5 项目的追踪和控制 484
22.6 软件项目的组织 484
22.6.1 软件项目管理的特点 484
22.6.2 软件项目组织的建立 485
22.6.3 人员配备 487
小结 489
综合练习二十二 489
一、填空题 489
二、选择题 490
三、简答题 490
参考文献 491