导图社区 软工导论
这是一篇关于软工导论的思维导图,知识点包括:面向对象分析、面向对象设计、软件危机、软件工程概述等,欢迎下载学习使用。
编辑于2021-07-02 17:32:22软件工程
面向对象方法学
概述
尽可能模拟人类习惯的思维方式
任何事务都是对象
把所有的对象都划分成各种对象类
按照子类于于父类的关系,把若干个对象类组成一个层次结构系统,有继承特性
对象之间仅能通过传递消息相互联系
面向对象就是即使用对象又使用类和继承,且对象之间仅能通过传递消息实现彼此通信
面向对象方法学优点
与人类习惯的思维方法一致
稳定性好
较易开发大型软件产品
可重用性好
可维护性好
概念
对象
任何事务都可作为对象
特点
以数据为中心
对象是主动的
实现了数据封装
本质上具有并行性
模块独立性好
类
类是对具有相同数据和相同操作的一组相似对象的定义
类是支持继承的抽象数据类型,对象是类的实例
实例
是由某个特定的类所描述的一个具体的对象
消息
要求某个对象执行再定义它的那个类中所定义的某个操作的规格说明
方法
对象所能执行的操作,类中定义的服务
属性
类中所定义的数据,对客观世界实体所具有的性质的抽象
封装
把数据和实现操作的代码集中起来放在对象的内部
继承
能够直接获得已有的性质和特征,不必重复定义他们
多态
在类等级的不同层次中,可以共享一个方法的名字,而不同层次中的每个类却按自己的需求来实现这个行为
重载
在同一作用域内,若干个参数特征不同的函数可以使用相同的函数名字
面向对象建模
对象模型
描述系统数据,使用数据结构
动态模型
描述系统控制结构,执行操作
功能模型
描述系统功能,完成数据值的变化
对象模型
概念
对象模型表示静态的、结构化的系统的数据性质,他是对模拟客观世界实体的对象以及对象彼此间的关系映射,描述了系统的静态结构
对象模型为建立动态模型和功能模型,提供了是指性的框架
类图的基本符号
定义类
定义属性
定义符号
表示关系的符号
关联
普通关联
关联的角色
限定关联
关联类
聚集
共享聚集
组合聚集
泛化
普通泛化
继承
受限泛化
依赖和细化
依赖关系
细化关系
动态模型
表示顺势的、行为话的系统的控制性质,它规定了对象模型中的对象的合法变化序列
用UML提供的状态图来描绘对象的装态
功能模型
概念
指明了系统应该做什么
数据流图和用例图
用例图
系统
用例
可以感受到的一个完整功能
行为者
外部实体
用例之间的关系
扩展关系、使用关系
用例建模
定义系统
寻找行为者和用例
定义用例之间的关系
确认模型
三种模型之间的关系
功能模型指明系统应该做什么
动态模型规定什么时候做
对象模型定义了做事情的实体
面向对象分析
面向对象分析的基本过程
三个子模型和五个层次
主题层
类与对象层
结构层
属性层
服务层
需求陈述
建立对象模型
确定类与对象
找出候选的类与对象
帅选出正确的类与对象
确定关联
初步确定关联
筛选
进一步完善
确定属性
分析
选择
识别继承关系
反复修改
建立动态模型
编写脚本
设想用户界面
画事件跟踪图
确定事件
画图
画状态图
审查动态模型
建立功能模型
画出基本的系统模型图
画出功能级数据流图
描述处理框功能
定义服务
常规行为
从事件导出的操作
利用继承减少冗余操作
面向对象设计
准则
模块化
抽象
信息隐藏
弱耦合
交互耦合
继承耦合
强内聚
服务内聚
类内聚
一般-特殊类聚
可重用
启发规则
设计结果应该清晰易懂
一般-特赦结构的深度应适当
设计简单的类
使用简单的协议
使用简单的服务
把设计及变动减至最小
软件重用
概述
重用
知识重用
方法和标准的重用
软件成分的重用
软件成分的重用级别
代码重用
设计结果重用
分析结果重用
典型的可重用软件成分
项目计划
成本估计
体系结构
需求模型和规格说明
设计
源代码
用户界面
测试用例
类构件
可重用软件应该具备的特点
模块独立性强
具有高度可塑性
接口清晰、简明、可靠
类构件的重用方式
实例重用
继承重用
多态重用
软件重用的效益
质量
生产率
成本
系统分解
子系统之间的两种交互方式
客户-供应商关系
平等伙伴关系
组织系统的两种方案
层次组织
块状组织
设计系统的拓扑结构
软件危机
软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题(表现)
对软件开发成本和进度的估计常常不准确
用户对已完成的软件系统不满意的现象经常发生
软件产品的质量常常靠不住
软件通常没有合适的文档资料
软件常常是不可维护的
软件成本在计算机系统的总成本中所占比例逐年上升
软件开发生产率提高的速度远远跟不上计算机应用迅速普及深入的趋势
子主题
原因
与软件本身的特点有关
与软件开发与维护的方法不正确有关
消除软件危机的途径
对计算机软件有正确认识
程序
能够完成预定功能和性能的可执行的指令序列
数据
是程序能够适当的处理信息的数据结构
文档
开发、使用和维护程序所需要的图文资料
既要有技术措施(方法和工具)
又要有必要的组织管理措施
子主题
软件工程概述
介绍
①把系统的、规范的、可度量的途径用于软件开发、运行和维护过程,也就是把工程应用于软件
②研究①中提到的途径
本质特征
软件工程关注大型程序的构造
软件工程的中心主题是控制复杂性
软件经常变化
开发软件的效率非常重要
和谐的合作是开发软件的关键
软件必须有效地支持他的用户
在软件工程领域中通常由具有一种文化背景的人替另一种文化背景的人创造产品
基本原理
用分阶段的生命周期计划严格管理
坚持进行阶段评审
实行严格的产品控制
采用现代化程序设计技术
结果应能清楚的审查
开发小组人员应该少而精
承认不断改进软件工程实践的必要性
软件工程方法学
传统方法学
自顶向下
面向对象方法学
主动反复多次迭代
软件生命周期
软件定义
问题定义
可行性研究
需求分析
软件开发
总体设计
详细设计
编码和单元测试
综合测试
软件维护
改正性维护
适应性维护
完善性维护
预防性维护
软件过程
瀑布模型
阶段间具有顺序性和依赖性
推迟实现的观点
质量保证的观点
文档驱动型模型
快速原型模型
快速建立一个能反映用户主要需求的原型系统
不带反馈环,能基本上做到顺序开发
增量模型
分批逐步想用户提交产品
螺旋模型
在每个阶段之前都增加了风险分析过程的快速原型
适用于大规模的软件项目
喷泉模型
典型的面向对象的软件过程模型
体现了迭代和无缝的特性
子主题
Rational 统一过程 RUP
最佳实践
迭代式开发
管理需求
使用基于构系的体系结构
可视化建模
验证软件质量
控制软件变更
敏捷过程
个体和交互胜过过程和工具
可以工作的软件胜过面面俱到的文档
客户合作胜过合同谈判
响应变化胜过遵循计划
极限编程xp
有效实践
客户作为开发团队的成员
使用用户素材
短交付周期
验收测试
结对编程
测试驱动开发
集体所有
持续集成
可持续的开发速度
可行性研究
可行性研究的任务
确定问题是否值得去解决
技术可行性
经济可行性
操作可行性
社会可行性
可行性研究过程
复查系统规模和目标
研究目前正在使用的系统
导出新系统的高层逻辑模型
进一步定义问题
导出和评价供选择的解法
推荐行动方针
草拟开发计划
书写文档提交审查
系统流程图
数据流图
数据字典
成本效益分析
成本估计
代码估计
任务分解技术
自动估计成本技术
投资回收期
使累计的经济收益等于最初投资所需要的事件
纯收入
累计经济收益与投资之差
需求分析
概述
准确回答系统必须做什么
应该写出软件需求规格说明书
准则
必须理解并描述问题的信息与,建立数据模型
必须定义软件应完成的功能,建立功能模型
描述作为外部事件结果的软件行为,建立行为模型
必须对描述信息、功能和行为的模型进行分解,用层次的方式展示细节
需求分析的任务
确定对系统的综合要求
功能需求
性能需求
可靠性和可用性需求
出错处理需求
接口需求
约束
逆向需求
将来可能提出的需求
分析系统的数据要求
与用户沟通获取需求的方法
分析建模与规格说明
实体联系图
数据规范化
状态转换图
图形工具
层次方框图
Warnier图
IPO图
验证软件需求
方面
一致性
完整性
现实性
有效性
形式化说明技术
概述
软件工程的使用的方法划分
非形式化:用自然语言描述需求规格
半形式化:用数据流ER图建立模型
形式化:有坚实的数学基础
非形式化的缺点
可能存在矛盾、二义性、含糊性、不完整性等问题
形式化的优点
简洁准确的描述
形式化方法的准则
应用形式化方法的规则
应该选用适当的表示方法
应该形式化,但不要过分
应该估算成本
子主题
总体设计
系统应该怎样实现,站在全局高度上,花较少成本,从较抽象的层次上分析对比多种可能的系统实现方案和软件结构
设计过程
设想供选择的方案
选取合理的方案
推荐最佳方案
功能分解
设计软件结构
设计数据库
指定测试计划
书写文档
系统说明
用户手册
详细的实现计划
测试计划
数据库设计结果
审查和复审
设计原理
模块化
模块化就是把程序划分成独立命名且可独立访问的模块
抽象
子主题
逐步求精
模块独立
耦合
是对一个软件结构内不同模块之间相互连接程度的度量
数据耦合
仅通过参数交换信息,交换的信息仅仅是数据,低耦合
控制耦合
交换的信息含有控制信息,中等耦合
特征耦合
把整个数据结构作为参数传递,而被调用的模块只需要使用其中一部分数据元素
公共环境耦合
当两个或多个模块通过一个公共数据环境相互作用时
内容耦合
最高程度耦合
内聚
标志着一个模块内哥哥元素彼此结合的紧密程度
低内聚
偶然内聚
各种元素之间没有实质性的联系
逻辑内聚
一个模块完成的任务在逻辑上属于相同或相似一类
时间内聚
如果一个模块包含的任务必须在同一段时间内执行
中内聚
过程内聚
一个模块内的处理元素的,必须以特定的次序执行
通信内聚
模块中所有元素都使用同一个输入数据和产生同一个输出数据
高内聚
顺序内聚
必须顺序执行
功能内聚
模块内所有处理元素属于一个整体,完成一个单一的功能
启发规则
改进软件结构提高模块独立性
模块规模应该适中
深度、宽度、扇出、扇入都应适当
深度:控制层数
宽度:同一个层次上模块总数的最大值
扇出:一个模块直接控制的模块数目
扇入:一个模块有多少个上级模块直接调用它
模块的作用域应该在控制域之内
作用域:受该模块内一个判定影响的所有模块的集合
控制域:这个模块本身以及所有直接或间接从属于他的模块集合
力争降低模块接口的负责程度
设计单入口出口的模块
模块功能应该可以预测
描绘软件结构的图形工具
层次图和HIPO图
结构图
面向数据流的设计方法
概念
把信息流映射成软件结构
变换流
信息以外部世界的形式进入软件系统,经过处理后再以外部世界的形式离开系统
事务流
以事务为中心,接受输入数据、分析事务确定类型、根据十五类型选取一条活动通路
变换分析
把具有变换流特点的数据流图按预先确定的模式映射成软件结构
详细设计
确定应该怎样具体地实现所要求的系统
结构程序设计
顺序、选择、循环
人机界面设计
设计问题
系统响应时间
用户帮助设施
出错信息处理
命令交互
设计过程
过程设计工具
程序流程图
盒图
PAD图
判定表
判定树
面向数据结构的设计方法
Jackson图
jackson方法
子主题
程序复杂程度的定量度量
MeCabe方法
一个顺序的处理框序列和一个菱形判定框,可以映射成一个节点
一条边必须终止于一个节点
计算复杂度:判定节点的数目加一
Halstead方法
实现
编码和测试
编码
选择程序语言
编码风格
程序内部文档
数据说明
语句构造
输入输出
效率
程序运行时间
存储器效率
输入输出的效率
软件测试基础
目标
测试是为了发现程序中的错误而执行程序的过程
好的测试方案是极可能发现未发现的错误的测试方案
软件测试准则
所有测试都应追溯到用户需求
应该远在测试开始之前就指定测试计划
把Pareto原理应用到测试中
从小规模到大规模
穷举测试不可能
由独立的第三方从事测试工作
测试方法
黑盒测试
白盒测试
测试步骤
模块测试
每一个模块作为单独的实体来测试
往往是编码和详细设计的错误
集成测试
子系统测试
把经过单元测试的模块放在一起形成一个子系统来测试
着重测试接口
系统测试
验收测试
验证系统确实能够满足用户的需要
平行运行
同时运行新开发的系统和他要取代的系统
目的
测试阶段的信息流
输入信息有两类
软件配置:需求说明书、设计说明书、源程序清单
测试配置:测试计划和测试方案
单元测试
概述
人工测试和计算机测试
集中检测最小单元--模块
主要使用白盒测试技术
测试重点
模块接口
参数的数目、次序、属性、单位系统、变元
局部数据结构
重要的执行通路
出错处理通路
对错误的描述难以理解
对错误处理之前,以及引起系统干预
遇到错误与记下错误不同
对错误的处理不正确
描述错误的信息不足以帮助确定造成错误的位置
代码审查
组长
程序设计者
程序编写者
程序测试者
计算机测试
为每个单元测试开发驱动软件和存根软件
驱动程序接受测试数据,把这些数据传送给被测试的模块
存根程序代替被测试的模块所调用的模块
集成测试
概念
是测试和组装软件的系统化技术
非渐增式测试:分别测试每个模块、再把所有模块结合成程序测试
渐增式:把下一个要测试的模块同已经测试好的模块结合进行测试
自顶向下集成
概念
从主控制模块开始,沿着程序的控制层次向下移动,逐渐把各个模块结合起来
对主控模块进行测试,测试时用存根程序代替所有直接符数于主控制模块的模块
根据选的结合策略,每次用一个实际模块带换一个存根程序
进行回归测试
自底向下的集成
从原子模块开始组装和测试,不需要存根程序
把底层模块组合成实现某个特定的软件子功能的族
写一个驱动程序,协调测试数据的输入和输出
对由子模块组成的子功能族进行测试
去掉驱动程序,沿软件结构自下向上移动,把子功能族结合形成更大的子功能族
不同集成测试策略的比较
自顶向下
优点
不需要驱动程序
能够子啊测试早期阶段实现并验证系统的主要功能
早期发现上层模块的接口错误
缺点
需要存根程序
底层关键模块中错误发现较晚
早期不能充分展开人力
自底向上
刚好相反
回归测试
重新执行已经做过的测试的某个子集,保证变化未带来非预期的副作用
检测软件全部功能的代表性测试用例
专门针对可能受修改影响的软件功能的附加测试
针对被修改过的软件成分测试
确认测试
验收测试,验证软件的有效性
确认测试的范围
软件配置复查
Alpha测试
开发者和用户
Beta测试
用户
白盒测试技术
把测试数据和预期的输出结果称为测试用例
逻辑覆盖
语句覆盖
每个语句至少执行一次
判定覆盖
每个判定的每个分支至少执行一次
条件覆盖
每个条件取到各种可能的结果
判定/条件覆盖
同时满足条件覆盖和判定覆盖
条件组合覆盖
美感判定表达式中条件的各种可能组合出现一次
点覆盖
语句覆盖
边覆盖
判定覆盖
路径覆盖
每条路径执行一次
控制结构测试
基本路径测试
每条语句执行一次,每个条件执行时都将分别取真假两个值
条件测试
无f,f
循环测试
简单循环
嵌套循环
串接循环
黑盒测试技术
概念
主要用于后期
功能不正确或遗忘功能
界面错误
数据结构错误或外部访问数据库错误
初始化和终止错误
等价划分
把程序的输入域划分成若干个数据类
规定了输入范围,可划分处一个有效的等价类,两个无效等价类
规定输入数据个数,划分一个有效类和两个无效类
规定了输入数据一组值,划分一个有效类和一个无效类
规定了输入数据的规则,一个有效类和若干个无效类
规定输入数据为整型,可划分为正整数,零和负整数三个有效类
边界值分析
确定边界情况
错误推测
靠经验和直觉
调试
试图找出产生症状的原因,以便改正错误
途径
蛮干法
回溯法
原因排除法
对分查找法
归纳法
演绎法
软件可靠性
软件可靠性
在给定的时间间隔内,按照规格说明书的规定成功运行的概率
软件可用性
在给定的时间点,按照规格说明书的规定成功运行的概率
估算平均无故障时间的方法
维护
定义
软件生命周期的最后一个阶段
软件交付之后为了改正错误或满足新的需求而修改的软件过程
改正性维护
把诊断和改正错误
适应性维护
为了和变化了的环境相适应
完善性维护
增加新功能或修改已有功能,提出一般性修改建议
预防性维护
改进未来的可维护性或可靠性,为了给未来的改进奠定更好的基础而修改软件
以上四类维护活动必须应用于整个软件配置,维护软件文档和维护软件的可执行代码是同样重要的
软件维护的特点
非结构化维护
软件配置的唯一成分是程序代码
结构化维护
有一个完整的软件配置,从评价设计文档开始
维护代价高昂
维护问题
理解别人写的程序通常非常困难
需要维护的软件往往没有合格的文档
开法人员没有自习说明软件
软件维护过程
维护组织
维护报告
维护的事件流
保存维护记录
评价维护活动
软件的可维护性
决定因素
可理解性
可测试性
可修改性
可移植性
可重用性
文档
用户文档
功能描述
安装文档
使用手册
参考手册
操作员指南
系统文档
指从问题定义、需求说明到验收测试计划这样一系列和系统实现有关的文档
可维护性复审
预防性维护
软件再过程过程
库存目录分析
保存其用于的所有应用系统的库存目录
文档重构
老程序一般缺乏文档,采用“使用时建文档”
逆向工程
恢复设计结果的过程
代码重构
重构可以模块代码
数据重构
分解数据结构,定义数据模型,标识数据对象和属性,复审现存的数据结构
正向工程
恢复设计信息,重构现有系统