十二、面向对象实现
这一章貌似考试大纲没有要求,但是大家可以稍微看看,稍微看看总是好的!!
面向对象实现主要包括两项工作:把面向对象设计结果翻译成用某种程序语言书写的面向对象程序、测试并调试面向对象程序。
面向对象程序的质量由面向对象设计的质量决定。其所使用的程序语言的特点和程序设计的风格也将对程序的可靠性、可重用性、可维护性产生深远影响。
程序设计语言
面向对象语言的优点
- 一致的表示方法
- 可重用性
- 可维护性
面向对象语言的技术特点
在选择面向对象语言时应该着重考虑以下一些技术特点。
- 支持类与对象概念机制
- 实现整体-部分(聚集)结构机制
- 实现一般-特殊(泛化)结构机制
- 实现属性和服务的机制
- 类型检查(强类型还是弱类型?)
- 类库(有库就方便多了,省的啥都得自己写)
- 效率(运行别太慢了)
- 持久保存对象(数据得给我存好了把)
- 参数化类(使用一个或多个类型去参数化一个类的机制)
- 开发环境
选择面向对象语言
开发人员在选择面向对象语言时,应该着重考虑以下因素。
- 将来是否能占主导地位
- 可重用性
- 类库和开发环境
- 其他因素(学习成本,开发工具,性能要求等等)
程序设计风格
提高可重用性
① 内部重用
即本项目内的代码重用,主要是找出设计中相同或相似的部分,然后利用继承机制共享它们。
② 外部重用
即新项目重用旧项目的代码,需要有长远眼光,反复考虑,精心设计。
可重用性的提高一般遵循以下准则:
-
提高方法的内聚
-
减小方法的规模
-
保持方法的一致性(功能相似的方法应该有一致的名字、参数特征、返回值类型、出错条件等)
-
把策略和实现分开
第一,策略万法。
策略方法应该检査系统运行状态,并处理出错情况,它们并不直接完成计算或实现复杂的算法。其紧密依赖于具体应用。
第二,实现方法。
实现方法仅仅针对具体数据完成特定处理,用于实现复杂的算法。在执行过程中发现错误,它们只返回执行状态而不对错误采取行动。其相对独立于具体应用。尽量不要把策略和实现放在同一方法中。
-
全面覆盖
-
尽量不使用全局信息
-
利用继承机制(调用子过程、分解因子、使用委托、把代码封装在类中)
提高可扩充性
- 封装实现策略
- 不要用同一个方法遍历多条关联链
- 避免使用多分枝语句
- 精心确定公有方法
提高健壮性
健壮性是在硬件故障、输入的数据无效或操作错误等意外环境下,系统能做出适当响应的程度。程序员在编
写实现方法时,需要在健壮性与效率之间做出适当的折衷。
提高健壮性因该遵守以下四条准则。
- 预防用户的操作错误
- 检查参数的合法性
- 不能预先确定限制条件
- 先测试后优化
测试策略
测试软件的经典策略是,从“小型测试”开始,逐步过渡到“大型测试”。用软件测试的专业术语描述,可
以分为以下三步:
(1) 单元测试;
(2) 集成测试;
(3) 确认测试、系统测试。
面向对象的单元测试
最小的可测试单元是封装起来的类和对象。一个类可以包含一组不同的操作,而一个特定的操作也可能存在
于一组不同的类中。测试面向对象软件时,不能再孤立地测试单个操作,而应该把操作作为类的一部分来测试。
在测试面向对象的软件时,传统的单元测试方法是不适用的,不能再在“真空”中(即孤立地)测试单个操作。
面向对象集成测试
因为在面向对象的软件中不存在层次的控制结构,传统的自顶向下或自底向上的继承策略是没有意义的。面
向对象软件的集成测试主要有下述两种不同的策略:
a. 基于线程的测试
把响应系统的一个输入或一个事件所需要的那些类集成起来。分别集成并测试每个线程,同时应用回归测试
以保证没有产生副作用。
b. 基于使用的测试
不使用服务器类的独立类,把独立类都测试完之后,再测试使用独立类的下一个层次的类(称为依赖类)。
对依赖类的测试一层一层次地测试,直至把整个软件系统构造完为止。
②集群测试
集群测试是面向对象软件集成测试的一个步骤。在这个测试步骤中,用精心设计的测试用例检査一群相互协
作的类,这些测试用例力图发现协作错误。
面向对象的确认测试
在确认测试或系统测试层次,不再考虑类之间相互连接的细节。面向对象软件的确认测试也集中检査用户可
见的动作和用户可识别的输出。为了导出确认测试用例,测试人员应该认真研究动态模型和描述系统行为的脚本,以确定最可能发现用户交互需求错误的情景。
设计测试用例
测试类的方法
1、随机测试
通过执行一些随机产生的测试用例,来对类和对象进行测试的过程。
2、划分测试
釆用划分测试方法可以减少测试类时所需要的测试用例的数量。
流程:
a. 把输入和输出分类;
b. 设计测试用例以测试划分出的每个类别。
③ 方法
a. 基于状态的划分:根据类操作改变类状态的能力来划分类操作。
b. 基于属性的划分:根据类操作使用的属性来划分类操作。
c. 基于功能的划分:根据类操作所完成的功能来划分类操作。
(3) 基于故障的测试
首先推测软件中可能有的错误,然后设计出最可能发现这些错误的测试用例。
集成测试方法
(1) 多类测试
和测试单个类相似,测试类协作可以使用随机测试方法和划分测试方法,以及基于情景的测试和行为测试来
实现。
① 随机测试
a. 对每个客户类,使用类操作符列表来生成一系列随机测试序列。
b. 对所生成的每个消息,确定协作类和在服务器对象中的对应操作符。
c. 对服务器对象中的每个操作符,确定传递的消息。
d. 对每个消息,确定下一层被调用的操作符,并把这些操作符结合进测试序列中。
② 划分测试
a. 应该扩充测试序列以包括那些通过发送给协作类的消息而被调用的操作。
b. 根据与特定类的接口来划分类操作。
(2) 从动态模型导出测试用例
类的状态图可以帮助人们导出测试该类的动态行为的测试用例。通过导出大量的测试用例,保证该类的所有
行为都被适当地测试了。在类的行为导致与一个或多个类协作的情况下,应该使用多个状态图去跟踪系统的行为流。
课后题
1、
(1)面向对象实现应该尽量选用面向对象语言来实现面向对象分析、设计的结果。
(2)原因
① 一致的表示方法。面向对象开发基于不随时间变化的、一致的表示方法。既有利于在软件开发过程中始终
使用统一的概念,也有利于维护人员理解软件的各种配置成分。
② 可重用性。既可重用面向对象分析结果,也可重用相应的面向对象设计和面向对象程序设计结果。
③ 可维护性。程序显式地表达问题域语义,对维护人员理解待维护的软件有很大帮助。在选择编程语言时,
应该考虑的首要因素是哪个语言能最恰当地表达问题域语义。
2、
(1) 支持类与对象概念的机制。
(2) 实现聚集结构的机制。
(3) 实现泛化结构的机制。
(4) 实现属性和服务的机制。
(5) 类型检査机制。
(6) 类库。
(7) 效率。
(8) 持久保存对象的机制。
(9) 参数化类的机制。
(10) 开发环境。
3、
(1)将来能否占主导地位。
(2) 可重用性。
(3) 类库和开发环境。
(4) 其他因素,包括售后服务、对运行环境的需求、集成已有软件的难易程度等。
4、
答:面向对象程序设计风格应遵循如下准则:
(1) 提高重用性。
(2) 提高可扩展性。
(3) 提高健壮性。
5、
(1)单元测试,是在类层面上的测试。由于继承和复合,类(或对象)在很多情况下巳不再是单纯意义
上的单个操作。因此,具体的测试将在多有与操作有关的每个子类语境中进行。
(2) 集成测试,由于面向对象软件中类的成分直接和间接交互,使得传统测试放法已经失去意义。因此有
两种策略可供选择,分别是基于线程的测试和基于使用的测试。
(3) 确认测试,关注与用户可见的动作和用户识别的系统输出,但基于场景的测试总是主宰面向对象系统
的确认测试。
6、
随机测试、划分测试、基于故障的测试
7、
多类测试、从动态模型中导出测试用例。也可采用随机测试、划分测试的方法。
8、
设计确认测试用例的方法主要有传统的黑盒方法、基于情景的方法。