第六章 面向对象的设计
面向对象的设计模型
系统设计
对象设计
领域对象设计面向对象设计的任务
面向对象设计的任务
系统设计
系统整体结构的设计
对象设计
对 OOA模型中类 /对象模型的具体化和细化
消息设计
从对象 - 关系模型,设计出消息模型
设计模型 复审面向对象设计责任设计消息设计类及对象设计子系统设计属性,操作,
协作者对象 -行为模型对象 -
关系模型类 / 对象模型 使用实例系统设计过程
划分子系统;
确定需要并发运行的子系统并为它们分配处理器;
描述子系统之间的通信;
确定系统资源的管理和控制;
确定人机交互构件;
选择实现数据管理和任务管理的基本策略 。
四种主要子系统
问题域子系统
人机交互 子系统
任务管理 子系统
数据管理 子系统划分子系统
划分原则
模块化、功能独立、信息隐藏
同一个子系统的类拥有共同特性
同一个子系统的类具有共同目的
同一个子系统的类提供相似服务
同一个子系统的类间相对高耦合
子系统标准
有明确的借口,与其他子系统通信
一般类只和子系统内部的其它类协作处理并发操作
并发的对象(子系统)
同时
异步
作用于同一事件
处理
将并发子系统分配到不同处理器
将并发子系统分配到同一处理器
系统提供同步控制描述子系统间的通信
子系统协作模型
客户 /服务器
端对端请求客户子系统
contract
服务器子系统
peer
subsystem
peer
subsystem
请求请求人机交互设计
分类分析用户特点,设计不同界面
增加用户界面专用的类和对象
利用快速原型演示,改进界面设计任务管理设计
策略
确定任务的特征
定义一个协调者任务和与之关联的对象
集成其它任务和协调者
步骤
识别由事件驱动和时间驱动的任务
识别关键性任务、任务优先级和任务管理类
定义任务
必要时扩充有关任务的类和对象数据管理设计
解决对象数据的存储和检索
数据管理设计
定义数据格式
与所使用的数据存储管理模式相关
设计相应的操作
说明对象及所属类和对象如何存储自己对象设计设计模型对象数据结构算法消息传递控制分析模型类属性方法关系行为对象描述
对象描述
协议描述:一组消息和对消息的注释
实现描述:对对象接收到某个消息后所执行的操作的实现细节的描述
算法设计
程序构件与接口
对象间的接口和对象的整体结构领域对象的设计
设计目的 ——支持软件复用
设计内容
调整需求
复用已有的组件
引入父类,分组管理领域类
添加一般化类以建立协议
调整 OOA模型
设计复审
设计模板第七章 统一建模语言 UML
UML简介
静态建模
动态建模
物理架构建模
RUP
UML
Unified Modeling Language
近 10年来 OOSE最重要的成果
贡献者,Grady Booch,Ivar Jacobson,
Jin Rumbaugh
中文网站
http://www,umlchina.com
http://www.uml.com.cn
UML的组成
UML的模型元素
表示模型中的某个概念
表示模型元素之间的关系
UML的元模型结构
元元模型层
元模型层
模型层
用户模型层
UML模型
UML模型

静态图
动态图
视图
用例视图
逻辑视图
并发视图
构件视图
部署视图
UML的特点
统一标准
面向对象
表达能力强大
可视化
UML的应用
用于描述系统开发的不同类型于不同阶段
从需求分析到软件设计到软件测试及维护
可视化问题描述,帮助理解问题
帮助建立各阶段的文档
获取和交流有关应用问题求解的知识
辅助构建系统静态建模
用例模型
用例图表示
从最终用户的角度描述系统功能
类和对象模型
类图和对象图表示类图 Class Diagram
学生姓名,string
学号,string
书书名,string
价格,real1 购买? 0..*?属于对象图 Object Diagram
王平:学生姓名,王平学号,020106
英语:书书名,英语价格,26.5
数学:书书名,数学价格,21.8
对象间关系
关联关系 (Association)
聚集关系 (Aggregation)
泛化关系 (Generalization)
依赖关系 (Dependency)
细化 关系 (Refinement)
包图子系统 A 子系统 D
子系统 B
子系统 C
子系统 E 子系统 F
动态建模
状态图( State Diagram)
时序图( Sequence Diagram)
协作图( Collaboration Diagram)
活动图 ( Activity Diagram)
消息同步消息异步消息简单消息状态图 State Diagram
超时到达上楼上楼到达上楼到达在底楼 向上移动向底楼移动向下移动 空闲
[打印机就绪 ]
打印文件时序图 ( Sequence Diagram)
[打印机忙 ]
保存文件打印文件打印文件 计算机 打印服务器 打印队列计算机协作图 ( Collaboration
Diagram)
[打印机忙 ]
保存文件
[打印机就绪 ]
打印文件打印文件计算机 打印队列打印服务器 打印机活动图 Activity Diagram
Disk free
Disk full 显示磁盘满显示在打印删去显示信息建立打印文件
Win.printAll()
^printer.print()
物理架构建模
逻辑架构和物理架构
逻辑架构
物理架构
构件图
配置图
RUP—基 于 UML的统一建模过程第八章 编码和语言选择
编码的目的
编码的风格
编码使用的语言编码的目的编码模块的过程性描述一一一 >源程序
(不可执行的) (可执行的)
编码的过程
熟悉所选语言的功能和程序开发环境
仔细阅读设计文档详细设计
弄清要编码的模块的外部接口与内部过程编码的风格
追求“聪明”和“技巧” ---〉 提倡“简明”和
“直接”
使用标准的控制结构
清晰的前提下求取效率
,Make it right before you make it faster.
,Make it clear before you make it faster.
,Keep it right when you make it faster.
( 求快不忘保持程序正确 )
,Keep it simple to make it faster.
( 保持程序简单以求快 )
,don’t sacrifice clarity for,efficiency”.
( 书写清楚,不要为,效率,牺牲清楚 )
源程序的文档化 ( code
documentation)
有意义的变量名称
适当的注释
标准的书写格式
——用分层缩进的写法显示嵌套结构的层次;
——在注释段的周围加上边框;
——在注释段与程序段,以及不同程序段之间插入空行;
——每行只写一条语句;
——书写表达式时,适当使用空格或圆括号等作隔离符;
程序设计语言的发展面向机器的语言高级语言
(第 3代 )
甚高级语言机器语言
(第 1代 )
汇编语言
(第 2代 )
结构语言基础语言面向对象语言第 4代语 言语言的选择
选择编码语言的标准
应用领域
算法与计算复杂性
数据结构的复杂性
效率的考虑适用各类应用领域的语言年代 应用领域 主要语言 其他语言
20 世纪 60年代商业 COBOL Assembler
科学计算 FORTRAN ALGOL,BASIC,
APL系统 Assembler Forth
人工智能 LISP SNOBOL
现代商业 COBOL,C++,Java、
电子表格
C,PL/1
科学计算 FORTRAN,C,C++
Java
BASIC
系统 C,C++,Java Ada,Modula
人工智能 LISP,Prolog
第九章 软件测试
测试的基本概念
黑盒测试
白盒测试
测试用例设计
多模块程序的测试策略
面向对象系统的测试测试的基本概念
测试( testing)的目的与任务
目的:发现程序的错误
任务:通过执行程序,暴露潜在的错误
纠错( debugging)的目的与任务
目的:定位和纠正错误
任务:消除软件故障,保证程序的可靠运行测试的特性
挑剔性
抱着为证明程序有错的目的去测试
复杂性
设计合适的测试用例
不彻底性
Dijkstra 一句名言:“程序测试只能证明错误的存在,但不能证明错误不存在”
经济性测试的种类
静态分析(不执行程序)
静态分析器
代码复审( Code Review)
动态分析(执行程序)
黑盒测试
测试程序功能
白盒测试
测试程序结构测试的文档
测试计划
测试项目的名称
各项测试的目的、步骤和进度
测试用例的设计
测试报告
测试项目名称
实测结果与期望结果的比较
发现的问题
测试达到的效果黑盒测试
等价分类法 (equivalence partitioning)
把输入数据的可能值划分为若干等价类
有效等价类和无效等价类
每一无效等价类至少需要一个测试用例
例子某工厂公开招工,规定报名者年龄应在 16周岁至
35周岁之间 (到 2002年 3月 30日止 )即出生年月不在上述范围内,将拒绝接受,并显示,年龄不合格,
等出错信息。
“出生年月,的等价分类输入数据 有效等价类 无效等价类出生年月 ① 6位数字字符
② 有非数字字符
③ 少于 6个数字符
④ 多于 6个数字符对应数值 ⑤ 在 196702—198603之间 ⑥ <196702 ⑦ >198603
月份对应数值 ⑧ 在 1—12之间
⑨ 等于,0”
⑩ >12
黑盒测试
边界值分析法 (boundary value
analysis)
使被测程序在边界值及其附近运行,从而更有效地暴露 程序中潜藏的错误
错误猜测法 (error guessing)
猜测被测程序在哪些地方容易出错
针对可能的薄弱环节来设计测试用例白盒测试
逻辑复盖测试法 (logic coverage
testing)
用流程图来设计测试用例
逻辑复盖测试的 5种标准发现错误的能力弱强语句覆盖 每条语句至少执行一次判定覆盖 每一判定的每个分支至少执行一次条件覆盖 每一判定中的每个条件,分别按,真,,
,假,至少各执行一次判定 /条件覆盖同时满足判定复盖和条件复盖的要求条件组合覆盖求出判定中所有条件的各种可能组合值,
每一可能的条件组合至少执行一次白盒测试
路径测试法 (path testing)
着眼于程序执行路径的测试方法
程序图 (program graph)
点覆盖
边覆盖
路径覆盖测试用例设计
黑盒测试用例设计
三角形分类程序
见教材 p205
白盒测试用例设计
学生成绩查询程序
见教材 p208
软件的纠错
纠错的策略
试凑法
跟踪法
推理法
常用的纠错技术
插入打印语句
设置断点
掩蔽部分程序
蛮力纠错技术多模块程序的测试策略
测试的层次性
单元 (模块 )测试( unit testing)
综合 (集成 )测试( integration testing)
确认测试( validation testing)
系统测试( system testing)
程序错误的类型
语法错误
结构性错误
功能性错误
接口错误单元测试
目的
通过模块测试,使其代码达到模块说明书的需求
任务
(1) 对模块代码进行编译,发现并纠正其语法错误;
(2) 进行静态分析,验证模块结构及其内部调用序列是否正确;
(3) 确定模块的测试策略,并据此设计一组测试用例和必要的测试软件;
(4) 用选定的测试用例对模块进行测试,直至满足测试终止标准为止;
(5) 编制单元测试报告。
单元测试
实施步骤
编译
静态分析器检查
代码评审
动态测试
测试驱动模块
测试桩模块集成测试
目的
将经过单元测试的模块逐步组装成具有良好一致性的完整的程序
任务
制订集成测试实施策略
确定集成测试的实施步骤,设计测试用例
逐一地添加模块,进行测试集成测试
策略与步骤
自顶向下测试
先广后深实施步骤
先深后广实施步骤
由底向上测试
混合方式测试( sandwich testing)
对上层模块采取自顶向下测试
对关键模块或子系统采取由底向上测试确认测试
目的
确认组装好的程序是否满足( SRS)的要求
任务
有效性测试(黑盒测试)
配置复审( confinguration review)
验收测试 —专 用
alpha与 beta测试 —通 用系统测试
目的
软件安装到系统中以后,能否与系统的其余部分协调运行
任务
测试是否与硬件协调运行
测试是否和原来就有的其它软件协调运行
测试是否完成 SRS对它的要求终止测试的标准
规定测试策略和应达标准
规定至少要查出的错误数量面向对象系统的测试
OO软件的测试策略
OO软件测试用例设计
OO软件的测试策略
OO软件的单元测试
全面地测试类和对象所封装的属性和操纵这些属性的操作的整体
发现类的所有操作中存在的问题
与其他的类协同工作时可能出现的错误
OO软件的集成测试
基于黑盒方法的集成测试
基于线程的测试( thread-based testing)
基于使用( use-based)的测试
OO软件的测试策略
OO软件的确认测试和系统测试
采用传统的黑盒法
OOA阶段的用例所描述的用户交互进行测试
导出 OO系统测试的测试用例
对象 —行为模型
时序图等
模拟用户实际使用环境
OO软件测试用例设计
( 1) 每个测试用例都要有一个唯一的标识,
并与被测试的一个或几个类相关联起来;
( 2) 每个测试用例都要陈述测试的目的;
( 3) 对每个测试用例要有相应的测试步骤,
包括被测对象的特定状态、所使用的消息和操作、可能产生的错误、测试需要的外部环境等
OO概念对测试用例设计的影响
继承的成员函数需要测试
子类的测试用例可以参照父类
类测试用例设计
基于故障的测试用例设计
基于用例的测试用例设计
类间测试用例设计
类 —关系模型
类 —行为模型第十章 软件复用
软件复用的基本概念
领域工程
基于构件的开发
面向对象与软件复用
小结软件复用的基本概念
软件复用的定义软件复用的重要性
软件复用的目的是能更快、更好、成本更低地生产软件制品。
一般地说,在软件开发中采用复用构件可以比从头开发这个软件更加容易。
软件复用的粒度
按照可复用的粒度,软件制品从小到大分为以下几类:
源代码复用
软件体系结构复用
应用程序生成器
领域特定的软件体系结构的复用领域工程
所谓的,领域,,指的是一组具有相似或相近软件需求的应用系统所覆盖的功能区域 。
通过领域分析 (domain analysis)找出最优复用,对它们进行设计和构造,形成为可复用构件,进而建立大规模的软件构件仓库的过程,就是领域工程 。
横向复用和纵向复用
横向复用是指复用不同应用领域中的软件元素 。
纵向复用是指在一类具有较多公共性的应用领域之间进行软部品复用 。
领域分析用户需求软件开发与构件开发目标软件确认可复用构件库检索理解领域分析
定义
领域分析是在特定应用领域寻找最优复用,
以公共对象、类、子集合和框架等形式进行标识、分析和规约。
目标
是获得领域分析模型领域分析的输入和输出建造可复用构件
创建领域构件的设计框架
标准数据
标准接口协议
程序模板构件模型建立可复用构件库
三种分类模式
枚举分类
门面分类
属性 -值分类基于构件的开发
构件集成模型
应用系统工程面向对象与软件复用
OO方法对软件复用的支持
复用技术对 OO方法的支持小结
软件复用是在软件开发中避免重复劳动的解决方案 。
通过软件复用,可以提高软件开发的效率和质量 。 软件复用研究被视为解决软件危机,提高软件生产效率和质量的现实可行的途径 。
第十一章 软件维护
软件维护的种类
软件可维护性
软件维护的实施
软件维护的管理
软件再工程软件维护的种类
完善性维护( perfective maintenance)
适应性维护( adaptive maintenance)
纠错性维护( corrective maintenance)
预防性维护( preventive maintenance)
软件可维护性 ( maintainability)
影响可维护性的软件属性
可理解性( understandability)
可修改性( modifiability)
可测试性( testability)
对可维护性的定量度量
提高可维护性的途径
提供完整和一致的文档
采用现代化的开发方法软件维护的实施不严重
⊕ 维护人员纠错 严重 名单 测试
*
⊕ 已修改
⊕ 适应 维护人 * 的软件员名单 已修改完善 高 的配置
⊕ 批准交付低 用户的配置开发项目表严重性评价 错误分析优先度评价维护过程配置复审问题分析区分类型纠错项目表维护的副作用
修改编码的副作用
修改数据的副作用
修改文档的副作用软件维护的管理
维护的机构与人员
维护时期的配置管理
配置管理数据库
版本控制
变动控制
维护管理文档
维护日志
维护申请摘要报告和维护趋势图
维护费用的估算软件再工程正向工程 信息库分析文档重构逆向工程代码重构数据重构逆向工程重构代码提取抽象求精简化
“脏的”源代码干净的源代码初始的设计说明最终的设计说明处理界面数据库软件重构
代码重构
应用最新的设计和实现技术
修改老系统的代码
提高可维护性
数据重构
不改变系统结构