《软件工程(第2版)》是《软件工程》的第二版。《软件工程(第2版)》由五篇共16章构成,第一篇讲述软件工程与软件过程;第二篇讲述结构化分析、设计与实现;第三篇讲述面向对象的概念、模型、分析、设计与实现;第四篇讲述软件项目的计划、组织和控制,并介绍了一些相关的国际标准;第五篇讲述形式化方法、统一建模语言UML和软件重用。
目录
- 第一篇软件工程与软件过程1
- 第1章软件工程1
- 1.1软件危机1
- 1.1.1计算机系统的发展历程1
- 1.1.2软件危机的含义2
- 1.1.3产生软件危机的原因3
- 1.1.4消除软件危机的途径5
- 1.2软件工程6
- 1.2.1什么是软件工程6
- 1.2.2软件工程的基本原理6
- 1.2.3软件工程方法学8
- 1.3小结10
- 习题11
- 第2章软件过程13
- 2.1软件生命周期的基本任务13
- 2.2瀑布模型16
- 2.3快速原型模型18
- 2.4增量模型19
- 2.5螺旋模型20
- 2.6喷泉模型22
- 2.7小结23
- 习题24
- 第二篇传统方法学25
- 第3章结构化分析25
- 3.1概述25
- 3.2与用户通信的技术26
- 3.2.1访谈26
- 3.2.2简易的应用规格说明技术27
- 3.2.3软件原型28
- 3.3分析建模与规格说明29
- 3.3.1分析建模29
- 3.3.2软件需求规格说明29
- 3.4实体-关系图31
- 3.4.1数据对象31
- 3.4.2属性31
- 3.4.3关系32
- 3.4.4实体-关系图的符号32
- 3.5数据流图33
- 3.5.1数据流图符号33
- 3.5.2例子34
- 3.5.3命名37
- 3.6状态转换图37
- 3.6.1状态38
- 3.6.2事件38
- 3.6.3符号38
- 3.6.4例子39
- 3.7数据字典40
- 3.8结构化分析实例41
- 3.8.1问题陈述42
- 3.8.2问题定义42
- 3.8.3可行性研究43
- 3.8.4需求分析48
- 3.9小结53
- 习题55
- 第4章结构化设计56
- 4.1结构化设计与结构化分析的关系56
- 4.2软件设计的概念和原理57
- 4.2.1模块化57
- 4.2.2抽象59
- 4.2.3逐步求精59
- 4.2.4信息隐藏60
- 4.3模块独立61
- 4.3.1耦合61
- 4.3.2内聚62
- 4.4启发规则63
- 4.4.1改进软件结构提高模块独立性63
- 4.4.2模块规模应该适中64
- 4.4.3深度、宽度、扇出和扇入都应适当64
- 4.4.4模块的作用域应该在控制域之内64
- 4.4.5力争降低模块接口的复杂程度65
- 4.4.6设计单入口单出口的模块65
- 4.4.7模块功能应该可以预测65
- 4.5表示软件结构的图形工具65
- 4.5.1层次图和HIPO图65
- 4.5.2结构图67
- 4.6面向数据流的设计方法68
- 4.6.1概念68
- 4.6.2变换分析69
- 4.6.3事务分析75
- 4.6.4设计优化76
- 4.7人机界面设计77
- 4.7.1人机界面设计问题77
- 4.7.2人机界面设计过程78
- 4.7.3界面设计指南79
- 4.8过程设计81
- 4.9过程设计的工具83
- 4.9.1程序流程图83
- 4.9.2盒图(N-S图)84
- 4.9.3PAD图84
- 4.9.4判定表86
- 4.9.5判定树87
- 4.9.6过程设计语言(PDL)87
- 4.10面向数据结构的设计方法88
- 4.10.1Jackson图88
- 4.10.2改进的Jackson图89
- 4.10.3Jackson方法89
- 4.11小结94
- 习题95
- 第5章结构化实现98
- 5.1编码98
- 5.1.1选择程序设计语言98
- 5.1.2编码风格100
- 5.2软件测试基础102
- 5.2.1测试目标102
- 5.2.2黑盒测试和白盒测试103
- 5.2.3测试准则103
- 5.2.4流图103
- 5.3逻辑覆盖106
- 5.4控制结构测试108
- 5.4.1基本路径测试108
- 5.4.2条件测试111
- 5.4.3数据流测试113
- 5.4.4循环测试114
- 5.5黑盒测试技术115
- 5.5.1等价划分116
- 5.5.2边界值分析118
- 5.5.3错误推测119
- 5.6测试策略120
- 5.6.1测试步骤120
- 5.6.2单元测试121
- 5.6.3集成测试123
- 5.6.4确认测试126
- 5.7调试127
- 5.7.1调试过程127
- 5.7.2调试途径128
- 5.8软件可靠性130
- 5.8.1基本概念130
- 5.8.2估算平均无故障时间的方法131
- 5.9小结132
- 习题133
- 第三篇面向对象方法学139
- 第6章面向对象方法学导论139
- 6.1面向对象程序设计实例139
- 6.1.1用对象分解取代功能分解141
- 6.1.2设计类等级143
- 6.1.3定义属性和服务144
- 6.1.4用C++语言实现147
- 6.2面向对象方法学概述147
- 6.2.1面向对象方法学的要点149
- 6.2.2面向对象的软件过程150
- 6.3面向对象方法学的主要优点153
- 6.4面向对象的概念153
- 6.4.1对象156
- 6.4.2其他概念159
- 6.5面向对象建模160
- 6.6对象模型160
- 6.6.1表示类的符号161
- 6.6.2表示关系的符号164
- 6.7动态模型165
- 6.8功能模型165
- 6.9三种模型之间的关系166
- 6.10小结166
- 习题166
- 第7章面向对象分析168
- 7.1分析过程168
- 7.1.1概述168
- 7.1.2三个子模型与五个层次169
- 7.2需求陈述170
- 7.2.1书写要点170
- 7.2.2例子171
- 7.3建立对象模型172
- 7.3.1确定类与对象172
- 7.3.2确定关联174
- 7.3.3划分主题177
- 7.3.4确定属性177
- 7.3.5识别继承关系178
- 7.3.6反复修改179
- 7.4建立动态模型182
- 7.4.1编写脚本182
- 7.4.2设想用户界面183
- 7.4.3画事件跟踪图184
- 7.4.4画状态图184
- 7.4.5审查动态模型186
- 7.5建立功能模型187
- 7.5.1画出基本系统模型图187
- 7.5.2画出功能级数据流图187
- 7.5.3描述处理框功能188
- 7.6定义服务189
- 7.6.1常规行为189
- 7.6.2从事件导出的操作189
- 7.6.3与数据流图中处理框对应的操作189
- 7.6.4利用继承减少冗余操作189
- 7.7面向对象分析实例190
- 7.7.1需求陈述190
- 7.7.2建立对象模型190
- 7.7.3建立动态模型191
- 7.7.4建立功能模型193
- 7.7.5进一步完善194
- 7.8小结194
- 习题195
- 第8章面向对象设计197
- 8.1面向对象设计的准则197
- 8.1.1模块化198
- 8.1.2抽象198
- 8.1.3信息隐藏198
- 8.1.4弱耦合198
- 8.1.5强内聚199
- 8.1.6可重用199
- 8.2启发规则199
- 8.2.1设计结果应该清晰易懂200
- 8.2.2一般-特殊结构的深度应适当200
- 8.2.3设计简单的类200
- 8.2.4使用简单的协议201
- 8.2.5使用简单的服务201
- 8.2.6把设计变动减至最小201
- 8.3系统分解201
- 8.3.1子系统之间的两种交互方式202
- 8.3.2组织系统的两种方案202
- 8.3.3设计系统的拓扑结构203
- 8.4设计问题域子系统203
- 8.4.1调整需求204
- 8.4.2重用已有的类204
- 8.4.3把问题域类组合在一起204
- 8.4.4增添一般化类以建立协议204
- 8.4.5ATM系统之例204
- 8.5设计人-机交互子系统205
- 8.5.1设计人-机交互界面的准则205
- 8.5.2设计人-机交互子系统的策略206
- 8.6设计任务管理子系统207
- 8.6.1分析并发性208
- 8.6.2设计任务管理子系统208
- 8.7设计数据管理子系统209
- 8.7.1选择数据存储管理模式209
- 8.7.2设计数据管理子系统210
- 8.7.3例子212
- 8.8设计类中的服务212
- 8.8.1确定类中应有的服务212
- 8.8.2设计实现服务的方法213
- 8.9设计关联214
- 8.9.1关联的遍历214
- 8.9.2实现单向关联214
- 8.9.3实现双向关联215
- 8.9.4关联对象的实现方法215
- 8.10设计优化215
- 8.10.1确定优先级215
- 8.10.2提高效率的几项技术216
- 8.10.3调整继承关系217
- 8.11面向对象分析与设计实例218
- 8.11.1面向对象分析219
- 8.11.2面向对象设计221
- 8.12小结225
- 习题226
- 第9章面向对象实现227
- 9.1程序设计语言227
- 9.1.1面向对象语言的优点227
- 9.1.2面向对象语言的技术特点228
- 9.1.3选择面向对象语言231
- 9.2程序设计风格232
- 9.2.1提高可重用性232
- 9.2.2提高可扩充性234
- 9.2.3提高健壮性234
- 9.3测试策略235
- 9.3.1面向对象的单元测试235
- 9.3.2面向对象的集成测试235
- 9.3.3面向对象的确认测试236
- 9.4设计测试用例236
- 9.4.1测试类的方法236
- 9.4.2集成测试方法238
- 9.5小结240
- 习题240
- 第四篇软件项目管理242
- 第10章计划242
- 10.1度量软件规模242
- 10.1.1代码行技术243
- 10.1.2功能点技术245
- 10.2工作量估算245
- 10.2.1静态单变量模型245
- 10.2.2动态多变量模型245
- 10.2.3COCOMO2模型246
- 10.3进度计划248
- 10.3.1基本原则249
- 10.3.2估算软件开发时间250
- 10.3.3Gantt图251
- 10.3.4工程网络252
- 10.3.5估算进度253
- 10.3.6关键路径254
- 10.3.7机动时间255
- 10.4小结256
- 习题257
- 第11章组织259
- 11.1民主制程序员组259
- 11.2主程序员组260
- 11.3现代程序员组262
- 11.4软件项目组263
- 11.4.1三种组织方式264
- 11.4.2四种组织范型265
- 11.5小结266
- 习题266
- 第12章控制267
- 12.1风险管理267
- 12.1.1软件风险分类267
- 12.1.2风险识别268
- 12.1.3风险预测272
- 12.1.4处理风险的策略274
- 12.2质量保证275
- 12.2.1软件质量275
- 12.2.2软件质量保证措施276
- 12.3配置管理279
- 12.3.1软件配置279
- 12.3.2软件配置管理过程281
- 12.4小结286
- 习题286
- 第13章国际标准288
- 13.1IEEE1058.1软件项目管理计划标准288
- 13.1.1软件项目管理计划的组成288
- 13.1.2IEEE软件项目管理计划288
- 13.2ISO9000质量标准289
- 13.2.1基本思想291
- 13.2.2ISO9000-3标准291
- 13.3ISO/IEC12207软件生命周期过程标准292
- 13.3.1概述294
- 13.3.2软件生命周期过程294
- 13.4ISO/IECTR15504软件过程评估标准295
- 13.4.1概述298
- 13.4.2标准的结构299
- 13.5能力成熟度模型299
- 13.5.1能力成熟度模型的结构300
- 13.5.2能力成熟度等级301
- 13.5.3关键过程域302
- 13.5.4应用CMM303
- 13.6小结304
- 习题305
- 第五篇高级课题306
- 第14章形式化方法306
- 14.1概述306
- 14.1.1非形式化方法的缺点306
- 14.1.214.1.2软件开发过程中的数学307
- 14.1.3应用形式化方法的准则307
- 14.2有穷状态机308
- 14.2.1基本概念308
- 14.2.2电梯问题309
- 14.2.3评论312
- 14.3Petri网312
- 14.3.1基本概念312
- 14.3.2应用实例314
- 14.4Z语言315
- 14.4.1简介315
- 14.4.2评论317
- 14.5小结318
- 习题318
- 第15章统一建模语言UML320
- 15.1概述320
- 15.1.1UML的产生和发展320
- 15.1.2UML的结构321
- 15.1.3UML的图322
- 15.1.4UML的应用领域323
- 15.2静态建模机制324
- 15.2.1用例图324
- 15.2.2类图和对象图327
- 15.3动态建模机制336
- 15.3.1消息336
- 15.3.2状态图336
- 15.3.3顺序图337
- 15.3.4协作图339
- 15.3.5活动图340
- 15.4描述物理架构的机制341
- 15.4.1逻辑架构和物理架构341
- 15.4.2构件图341
- 15.4.3配置图342
- 15.5使用和扩展UML343
- 15.5.1使用UML的准则343
- 15.5.2扩展UML的机制344
- 15.6小结345
- 习题345
- 第16章软件重用346
- 16.1可重用的软件成分346
- 16.2软件重用过程347
- 16.2.1构件组装模型347
- 16.2.2类构件348
- 16.2.3重用过程模型349
- 16.3领域工程350
- 16.3.1分析过程350
- 16.3.2领域特征351
- 16.3.3结构建模和结构点352
- 16.4开发可重用的构件352
- 16.4.1为了重用的分析与设计352
- 16.4.2基于构件的开发353
- 16.5分类和检索构件354
- 16.5.1描述可重用的构件355
- 16.5.2重用环境357
- 16.6软件重用的效益357
- 16.7小结358
- 习题359
- 参考文献360