软件工程 --
原理、方法与应用电子教案
48学时( 32理论 +16理论)
课程安排
理论
内容:基本原理、方法和技术
形式:讲授、自学、讨论
实践
内容:构造一个应用系统(包括分析、设计、
编码、测试)
形式:分组、分阶段文档、编码、集成软件工程的主要内容
软件工程的基本概念
软件开发模型
软件开发各阶段的任务、技术、方法
传统方法、面向对象方法
软件工程管理
软件质量保证
软件工程环境第一章 绪论
软件与软件危机
软件工程学
传统软件工程和面向对象软件工程
软件工程的应用软件
程序、软件与软件产品独唱 -->小合唱 -->合唱 -->万人大合唱
| | |
简单程序 较复杂程序 软件
软件定义,软件 =程序 +数据 +文档程序:按事先设计的功能和性能需求执行的指令序列数据:是程序能正常操纵信息的数据结构文档:与程序开发、维护和使用有关的图文材料软件的特征
软件是逻辑的,而不是物理的
软件开发与人关系密切
软件开发成本大
软件生产是简单的拷贝
软件不会磨损和老化
软件受环境影响大
软件维护易产生新的问题软件开发的发展过程计算机应用发展 软件数量多规模大软件成本高质量低个体化软件开发方法 软件维护困难软件危机 软件工程软件危机
定义计算机软件的开发和维护过程所遇到的一系列严重问题
表现
对软件开发成本和进度的估算很不准确
用户很不满意
质量很不可靠
没有适当的文档
软件成本比重上升
供不应求:软件开发生产率跟不上计算机应用迅速深入的趋势硬件 /软件成本变化趋势硬件软件
100%
0%
1955 1970 1985
软件技术进步落后于需求增长软件危机
原因
客观:软件本身特点
逻辑部件
规模庞大
主观:不正确的开发方法
忽视需求分析
错误认为:软件开发 =程序编写
轻视软件维护软件危机
解决途径
组织管理
工程项目管理方法
技术措施
软件开发技术与方法
软件工具软件工程学的范畴
软件工程学
指导计算机软件开发和维护的工程学科
工程管理 +开发技术
软件开发技术
软件开发方法学
软件工具
软件工程环境
软件工程管理
软件管理学
软件经济学
软件度量学两种程序设计方法
程序设计的两次飞跃
结构化程序设计
程序 =数据结构 +算法
面向对象程序设计
程序 = 对象 + 消息面向过程和面向对象的编码存款取款利息结算帐户余额帐户余额利息结算存款取款两类软件工程方法
传统软件工程
软件分析 → 总体设计 → 详细设计 → 面向过程的编码 → 测试
面向对象软件工程
软件分析与对象抽取 → 对象详细设计 → 面向对象的编码 → 测试软件工程的应用
软件工程指导中小型软件
软件工程指导大型软件
软件工程的成就
软件工程的局限第二章 软件开发模型
传统开发模型
瀑布模型( waterfall model)
快速原型模型( rapid prototype model)
演化开发模型
增量模型( incremental model)
螺旋模型( spiral model)
面向对象开发模型
构件集成模型( component integration model)
形式化开发模型
转换模型( transformational model)
净室模型( cleanroommodel)
软件生存周期
计划时期
问题定义
可行性分析
开发时期
需求分析
软件设计
编码
测试
运行时期
软件维护瀑布模型问题定义可行性研究需求分析软件设计编 码测 试维 护计划时期开发时期运行时期瀑布模型
特点
阶段的顺序性和依赖性
推迟实现的观点
质量保证
存在问题
不适合需求模糊的系统快速原型模型需求分析原型开发最终系统设计原型评价最终系统实现用户反馈快速原型模型
特点
快速开发工具
循环
低成本
种类
渐进型
抛弃型增量模型规格说明 设计 实现和集成 交付客户规格说明 设计 实现和集成 交付客户规格说明 设计 实现和集成 交付客户规格说明 设计 实现和集成 交付客户增量 1
增量 2
增量 3
增量 n
增量模型
增量
小而可用的软件
特点
在前面增量的基础上开发后面的增量
每个增量的开发可用瀑布或快速原型模型
迭代的思路螺旋模型螺旋模型
特点
瀑布模型 +快速原型 +风险分析
迭代过程
一个螺旋 式周期
确定目标,选择方案,选定完成目标的策略
风险角度分析该策略
启动一个开发阶段
评价前一步的结果,计划下一轮的工作构件集成模型构件集成模型
特点
面向对象
基于构件库
融合螺旋模型特征
支持软件开发的迭代方法
软件重用面向对象的基本概念
对象 Object
类 Class
继承 Inheritance
消息 Message
面向对象
对象 +类 +继承 +消息通信对象 Object
客观世界中的实体
状态(静态属性 Attributes)
操作(动态行为 Methods)
对象,:=<ID,MS,DS,MI>
Identifier
Method Set
Data Structure
Message Interface
对象的特点
以数据为中心
对象是主动的
实现数据封装
本质上有并行性
模块独立性好类 Class和实例 Instance

相同属性和行为的对象的抽象
实例
特定类所描述的一个具体对象
子类直接继承父类的数据和操作
继承的传递性,单继承、多重继承继承( Inheritance)
家具桌子 椅子 衣柜 床椅子的实例多态性 Polymorphism
概念
不同类层次共享一个方法名
相同的参数特征和返回值类型
多种不同实现
C++中虚函数实现
动态联编重载 Overloading
函数重载
同一作用域
多个名字相同的函数
参数特征不同
静态联编
运算符重载消息 Message
对象间的交互手段
形式:
Message:[dest,op,para]
Destination Object
Operation
Parameters
转换模型形式化规格说明与需求比较后修正变换 2
变换 1
变换 n
测试形式化开发记录系统需求 目标系统转换模型
特点
形式化软件开发方法
形式化需求规格说明
变换技术
程序自动生成技术
确保正确净室模型需求收集盒结构规约形式化设计 统计性使 用测试正确性证明代码生成与检查测试计划认证需求收集盒结构规约形式化设计 统计性使 用测试正确性证明代码生成与检查测试计划认证需求收集盒结构规约形式化设计 统计性使 用测试正确性证明代码生成与检查测试计划认证增量 1
增量 2
增量 n
净室模型
净室思想
在分析和设计阶段消除错误
在,洁净,状态下实现软件制作
形式化
盒结构表示分析和设计
正确性验证
增量模型小结
软件开发模型是不断发展的
各种软件开发模型各有优缺点
选用时不必拘泥与某种模型
可组合多种模型
也可根据实际创建新的模型第三章 软件需求分析
需求分析的任务与步骤
需求获取的常用方法
分析建模
软件需求说明
结构化分析方法
面向对象分析方法需求分析的任务和步骤
需求分析的任务
建立分析模型
编写需求说明
需求分析的步骤
需求获取
需求提炼
需求描述
需求验证需求获取的常用方法
联合分析小组
用户代表、领域专家和系统分析员
客户访谈
充分准备,寻找共同语言
循循序渐进、逐步逼近
问题分析与确认
多个来回分析建模
结构化分析模型
面向对象分析模型
分析模型描述工具
DFD,DD和 PSPEC
CFD,CSPEC和 STD
E-R图
用例图,对象 -关系图,对象 -行为图结构化分析模型加工说明数据对象说明
CFD,STD图
DFD图E-R图
DD
控制说明面向对象分析模型属性,操作,协作者对象 -行为模型对象 -
关系模型类 /对象模型使用实例分析模型描述工具
结构化分析工具
DFD,DD和 PSPEC
CFD,CSPEC和 STD
E-R图
面向对象分析工具
用例图,类对象图
对象 -关系图
对象 -行为图数据流图 DFD
描述系统逻辑模型
信息在系统中的流动和处理
用途
交流信息的工具
结构化分析和设计的工具数据流图 DFD
组成符号
圆框代表加工
箭头代表数据流向
方框代表源点和终点
双杠表示数据文件或数据库
分层
从高层到低层
分解前后的数据流必须一致
命名
数据流
处理领书单 进书通知购书单 缺书单
DFD练习 — 售 书系统学生教材购销系统书库保管员领书单 进书通知进书通知购书单 缺书单
DFD练习 — 售 书系统
1
销售
2
采购书库保管员学生
F1教材存量表
F2缺书登记表数据字典 DD
DFD中所有元素的定义的集合
内容
数据流
数据流分量
数据存储
处理(一般不用 DD描述)
数据字典 DD
定义数据的方法
自顶向下分解数据
数据元素的组合方式
顺序,A+B
选择,[A|B]
重复,1{A}5
可选,( A)
数据字典 DD
DD的用途
分析阶段的交流工具
包含控制信息
数据库设计的基础
例子
P41例 3.6
加工说明
加工说明 PSPEC
说明 DFD中的每个加工
描述工具
结构化语言
判定表
判定树加工说明 — 例子
结构化语言
P42-43,例 3.7,3.8
判定树
P44,例 3.9
判定表
P44,例 3.9
CFD和 CSPEC
适合实时系统的分析
与 DFD和 PSPEC类似
和 DFD与 PSPEC配合使用
表示控制流和控制加工
CFD和 DFD的关系数据条件控制输入加工激活信号控制输出输入数据加工模型
PSPEC
控制模型
CSPEC
输出数据
C F D
控制输入
D F D
CFD的符号表示控制信息或事件引用控制说明
DFD和 CFD例子 ---DFD
信号半分钟数据光电管采集计数传送工控机处理实时数据显示班数据处理半小时数据 班数据
DFD和 CFD例子 ---CFD
翻屏人工驱动信息时钟半小时半分钟某型号累加物品经过信号半分钟数据光电管采集计数传送工控机处理实时数据显示班数据处理半小时数据 班数据
STD
描述软件状态变迁
符号表示
矩形 ---系统状态
箭头 ---状态转变方向
规则表达式 ---事件 /触发行为状 态 1 状 态 2事件 /触发行为
STD例子
20秒到 /翻屏生成最新数据 /翻屏半小时到 /工控处理半分钟到 /传送空闲 /采集物品经过 /计数采集 PLC计数传送 工控处理实时翻屏
E-R图
用于对复杂数据的用作数据分析和建模
实体、属性和关系
组成符号
0,1 1,1 0,m 1:m
E-R图例子电话机 生产厂商经销商用户生产购买使用经销用例图
用例:系统和外部角色的交互
符号表示:
系统名称系统用例名用例 角色 关联
Use Case图例子保险商务系统签定保险单销售统计客户统计客户 保险销售员用例之间的关系
扩展关系
使用关系
组合关系
,扩展,
签保险单签汽车购买契约
,使用,,使用,
签保险单签汽车保险单 签房屋保险单对象 -关系图
从 E-R图演变而来
描述对象间关系学生 书 出版商购买 来自
1,1 0,m 1,1 1,1
对象 -行为图
描述对象的动态行为
对象状态转换图
事件轨迹图
事件流图对象状态转换图例子加纸纸用完故障修复打印故障打印完成接到打印命令就绪 打印缺纸故障事件轨迹图例子
[打印机忙 ]
保存文件
[打印机就绪 ]
打印文件打印文件打印文件 计算机 打印服务器 打印队列打印机事件流图例子
[打印机忙 ]
保存文件
[打印机就绪 ]
打印文件打印文件计算机 打印队列打印服务器 打印机软件需求说明( SRS)
引言
信息描述
功能描述
行为描述
质量保证
接口描述
其它结构化分析方法
基本步骤
自顶向下,功能分解
分层 DFD
由后向前,定义数据和加工
DD,PSPEC
根据需要,分析复杂数据和动态模型
E-R图,CFD,CSPEC,STD
编写 SRS
DFD的复审
父图和子图不平衡
未区分局部文件和局部外部项
分解的速度太快
不遵守加工编号规则面向对象分析方法
基本步骤
定义系统的用例
领域分析,建立类对象模型
建立对象 -关系模型
建立对象 -行为模型
编写 SRS
定义用例
回答问题 — 发 现角色
使用系统主要功能的人是谁?
需要借助于系统完成日常工作的人是谁?
谁来维护、管理系统,保证系统正常工作?
系统控制的硬件设备有哪些?
系统需要和哪些其它系统接口?
对系统产生的结果感兴趣的人和事是哪些?
定义用例
回答问题 — 发 现用例
角色需要从系统中获得哪种功能?需要角色做什么?
角色需要读取、产生、删除、修改或存储系统中的某种信息吗?
系统中发生的事件需要通知角色吗?角色需要通知系统某件事吗?这些事件能干什么?
系统需要输入 /输出的是什么信息?这些输入 /输出信息从哪儿来?到哪儿去?
系统当前的实现要解决的问题是什么?
领域分析
目的
发现或创建可广泛应用的类,以便复用
分析特定的应用领域
形式
公共对象、类、子集合和框架等类对象建模(一)
确定分析模型中的类对象
考察系统用例
汇总名词、名词短语
得到候选对象
确定类对象
必要的信息、需求、服务
多个属性、公共操作类对象建模(二)
定义类结构与层次
一般 ----特殊
整体 ----部分
定义主题和子系统
高层抽象例子电话话筒按键 连接线话机人 电话人教师大学生 小学生学生中学生建立对象 — 关系模型
步骤
复审需求描述和用例陈述
找出表示关系的动词或动词短语
用线连接起来,箭头表示方向
给连接命名,标上基数对象 -关系图例子
1:1
0:1
1:1
1,1 0:1
1:m
1:1
1:1
1,m
0:m 1,1
1:1
0:m
1:1 1:1
1:m
1:1
1:m
1:1
1:m
1:1
部门 流水线工序材料 在制品
1:m
不良品指标数据
1:m
1:1
规格实时数据建立对象行为模型
基本过程
评估用例,理解系统中的交互序列
找出驱动交互序列的事件
为每个用例创建事件轨迹
为对象创建状态转换图第四章 软件设计概述
软件设计的任务
软件设计的基本概念
模块化设计
设计需要处理的问题
设计文档及其复审软件设计的任务
分析模型 设计模型 设计文档
回答 How to do?
可以分为概要设计、详细设计
软件设计包括
数据设计
体系结构设计
接口设计
过程设计软件设计的任务
数据设计
信息模型 软件数据结构
体系结构设计
定义软件部件间的关系
接口设计
软件内部、外部及与人之间的通信
过程设计
软件组件的过程性描述软件设计的基本概念
模块( module)与构件 (component)
模块:定义输入、输出和特性的程序实体
构件:可重复使用的软件组件
抽象( abstract)与细化 (refinement)
抽象:分层次考虑和处理问题 (数据和过程 )
细化:从高到低的逐步分解过程
信息隐藏
对其它模块隐藏模块内部的数据和过程
软件复用
Design with reuse,design for reuse
模块化设计 (modular design)
分解( decomposition)
模块独立性( module independence)
自顶向下( top— down design)
自底向上( bottom— up design)
分解( decomposition)
C (P1+P2)>C (P1)+C (P2)
E (P1+P2)>E (P1)+E (P2)
C为问题的复杂度,E为解题需要的工作量模块数接口成本最小成本区
M
软件开发工作量总成本模块成本模块独立性( module independence)
内聚( cohesion)
模块内部各成分之间
耦合( coupling)
一个模块与其它模块之间
模块的独立性高
块内联系强
块间联系弱内聚
1 2 3 4 5 6 7
弱 强低内聚 中内聚 高内聚内聚 cohesion
1,偶然性内聚 coincidental cohesion
2,逻辑性内聚 logical cohesion
3,时间性内聚 temporal cohesion
4,过程性内聚 procedural cohesion
5,通讯性内聚 communicational cohesion
6,顺序性内聚 sequential cohesion
7,功能性内聚 functional cohesion
逻辑性模块读入分数平均 /最高?
计算平均分 计算最高分输出结果耦合 coupling
1.非直接耦合 no direct coupling
2.数据耦合 data coupling
3.特征耦合 stamp coupling
4.控制耦合 control coupling
5.外部耦合 external coupling
6.公共耦合 common coupling
7.内容耦合 content coupling
弱耦合数据耦合非直接耦合模块 2模块 1
模块 4模块 3
特征耦合 ( 参数表传递数据结构 )
公共耦合

CB



自定向下和自底向上设计
自顶向下
顶层开始
逐步分解
由底向上
选择关键部分先设计
扩展到整个系统设计需要处理的问题
协同设计
谁最合适设计系统的某一方面?
如何使组内成员相互了解别人的设计?
如何协调设计组件使整个系统统一?
用户界面设计
让用户驾驭软件,不是软件驾驭用户
减少用户的记忆
保持界面的一致性
并发系统设计
怎样确保同时执行的组件间对共享数据的一致性并发处理(顺序执行)
1,组件 1查询 X是否为空 。
2,组件 1被告知 X不为空 。
3,组件 2查询 X是否为空 。
4,组件 2被告知 X不为空 。
5,组件 1出栈,删除最后一个元素 。
6,组件 2想出栈,但 X已为空,系统进入非法状态。
并发处理
1,组件 1询问栈 X是否为空 。
2,组件 1被告知栈 X不为空 。
3,组件 2询问栈 X是否为空 。
4,组件 2被告知栈 X不为空 。
5,组件 1出栈,删去最后一个元素,并锁住栈 X。
6,组件 2想出栈,但被告知 X已上锁 。
7,另一个组件加了一个元素到栈 X中 。
8,组件 2被告知 X已开锁 ( 由于外部进程或者因为组件 2 再次尝试 )
9,组件 2出栈。
软件设计文档
软件设计说明书
1) 范围
2) 数据设计
3) 体系结构设计
4) 接口设计
5) 模块的过程设计
6) 其他 包括测试的考虑,确保设计满足所有需求,设计约束和一些特殊注解等内容 。
设计复审( design review)
及早发现设计中的缺陷
差错的传播
复审的内容
概要设计复审
系统的总体结构,模块划分,内外接口
详细设计复审
各个模块的具体设计设计复审( design review)
复审的方式
Formal review
Design review meeting
Informal review
Walk-through
第五章 传统的设计方法
结构化设计模型
结构化设计方法
过程设计
Jackson方法
PSPEC
结构化设计的内容数据对象描述
CFD
DFDE-R
DD
CSPEC
过程设计接口设计体系结构设计数据设计结构化设计的内容
结构设计 — 概 要设计
体系结构设计
SC图
接口设计
SC图
数据库设计
物理数据模型
过程设计 — 详 细设计
模块的处理过程
N-S图,PAD,PDL等描述工具 — SC图
SC图的组成符号 ( P88)
矩形框来表示模块
带箭头的连线表示模块间的调用关系
传入和传出模块的数据流
SC图中的模块符号
传入
传出
变换


控制
SC图中的模块调用
简单调用
选择调用
循环调用
A
B C D
A
B C
面向数据流的设计方法
DFD图的类型
变换型结构
事务型结构
从 DFD图到 SC图的映射
复审 DFD图,必要时可再次进行修改或细化
鉴别 DFD图的结构特征,事务?变换?
按照规则,把 DFD图为初始的 SC图
改进初始的 SC图变换结构的 DFD
变换中心传入 传出信息传入流 传出流变换流时间事务型结构 DFD
事务中心接受路径动作路径同时存在两类结构
T
传入 变换 传出事务中心变换分析
划分 DFD图的边界
建立初始 SC图的框架
顶层都只含一个用于控制的主模块
第一层包括传入、传出和中心变换三个模块
分解 SC图的各个分支
分解实质上是“映射”
例子 — 划 分 DFD
P
ED
CBA
W
R
U VQ
a b c
d e
p
r w
u v
传入部分变换中心传出部分第一级分解
MEMT
MC
MA
c,e
c,e u,w
u,w
传入分支的分解
GetE
AtoB
ReadD DtoE
ReadA
BtoCGetB
GetC
MA
c,e
c e
b b c
a a b
d d b
传出分支的分解
WriteW
UtoV Write V
PutU
ME
w,u
w u
u v v
变换中心的分解
MT
RPQ
e
p c,p r r
w,u
初始 SC图
MC
MT
Q P R
ME
Write
W
PutU
Uto V Write
V
A toBReadA
GetB DtoERead
D
BtoC
GetC Get E
MA
事务分析
在 DFD图上确定边界
事务中心
接受部分(包括接受路径)
发送部分(包括全部动作路径)
画出 SC图框架
DFD图的三个部分分别映射为事务控制模块,
接受模块和动作发送模块
分解和细化接受分支和发送分支例子 — 划 分 DFD
传入
T
变换 传出接受部分事务中心动作部分
Example ---- first- level
factoring
发送事务控制接收顶层第一层混合结构
C
1
A
C
3
B
C
2
D
LF
G
E KJ
a
b
b1 b2
b3
c1
c2
c3
d e
f
g
h
j
k
l
m
优化结构设计的指导规则
对模块分割、合并和变动调用关系的指导规则
提高内聚,降低耦合后
简化模块接口
少用全局性数据和控制型信息
保持高扇入 /低扇出的原则
作用域 /控制域规则
作用域不要超出控制域的范围
位置离受它控制的模块越近越好扇入和扇出
M
M
M的扇入 M的扇出例子:扇出计算实发工资取得工资数据编外人员扣 款编外人员工 资编外人员税 收薪金制工资额计时制工资额常规扣款税收扣款煎饼形结构不可取!
例子:扇出常规扣款编外人员实发工资计 算实发工资取 得工资数据计时工人实发工资计薪工人实发工资编外人员扣 款编外人员税 收编外人员工 资税收扣款计时制工资额薪金制工资额塔型结构过程设计
目的
确定模块采用的算法和块内数据结构
任务,编写软件的“过程设计说明书”
为每个模块确定采用的算法
确定每一模块使用的数据结构
确定模块接口的细节过程设计的原则
清晰第一的设计风格
结构化的控制结构
逐步细化的实现方法过程设计工具
流程图
N-S图
伪代码
PDL语言
N-S图
S1
S2
顺序
C
T F
S1 S2
选择
While C
S
S
Until C
循环
Jackson 方法
实体动作
实体结构
初始建模
系统功能
系统时间
系统实现
Jackson表示法
Jackson图
Jackson伪代码
A
B C
A
B0 C0
A
B*
顺序 选择 重复
A seq A select cond1 A iter {until 或 while} cond
B B
C or cond2 B
end A C
end A end A
(a) 顺序 (b) 选择 (c) 重复
Jackson方法和 SD方法
Jackson方法数据结构映射 程序结构 程序的过程性表示
(Jackson图 ) (Jackson图 ) (Jackson伪代码 )
程序分析 程序设计
SD 方法问题结构 映射 软件结构 各模块的过程描述
(DFD图 ) (SC图 ) (PDL等工具 )
概要设计 过程设计