软件工程-软件工程导论(第六版)第十二章 面向对象实现 (图片+文字=详细)

1 引言

软件工程导论即将结课,今天在上课之前,将第十二章的内容复习完,真热打铁在晚上就将其整理出来,分享给大家。

2 面向对象实现

面向对象实现主要包括两项工作: 

把面向对象设计结果翻译成用某种程序语言书写的面向对象程序;测试并调试面向对象的程序。

       对于面向对象的软件来说,情况也是如此。面向对象测试的目标,也是用尽可能低的测试成本发现尽可能多的软件错误。但是,面向对象程序中特有的封装、继承和多态等机制,也给面向对象测试带来一些新特点,增加了测试和调试的难度。必须在实践中努力探索适合于面向对象软件的更有效的测试方法。

2.1 程序设计语言

       面向对象设计的结果既可以用面向对象语言、也可以用非面向对象语言实现。

       使用面向对象语言时,由于语言本身充分支持面向对象概念的实现,因此,编译程序可以自动把面向对象概念映射到目标程序中。

       使用非面向对象语言编写面向对象程序,则必须由程序员自己把面向对象概念映射到目标程序中。

      所有非面向对象语言都不支持一般-特殊结构的实现,使用这类语言编程时要么完全回避继承的概念,要么在声明特殊化类时,把对一般化类的引用嵌套在它里面。

       从原理上说,使用任何一种通用语言都可以实现面向对象概念。当然,使用面向对象语言,实现面向对象概念,远比使用非面向对象语言方便,但是,方便性也并不是决定选择何种语言的关键因素。选择编程语言的关键因素,是语言的一致的表达能力、可重用性及可维护性。从面向对象观点看来,能够更完整、更准确地表达问题域语义的面向对象语言的语法是非常重要的,因为这会带来下述3个重要优点。

2.1.1 程序设计语言的优点

1.一致的表示方法

2.可重用性

3.可维护性

2.1.2 面向对象语言的技术特点

1.支持类与对象概念的机制

2.实现整体-部分(即聚集)结构的机制

3.实现一般-特殊(即泛化)结构的机制

4.实现属性和服务的机制

5.类型检查

6.类库

7.效率

8.持久保存对象

9.参数化类

10.开发环境

2.1.3 选择面向对象语言

1. 将来能否占主导地位

2. 可重用性

3. 类库和开发环境

4. 其他因素

2.2 程序设计风格

好的程序设计风格

不仅能明显减少维护或扩充的开销,

而且有助于在新项目中重用已有的程序代码。

良好的面向对象程序设计风格
既包括传统的程序设计风格准则,

也包括为适应面向对象方法所特有的概念(例如,继承性)而必须遵循的一些新准则。

2.2.1 提高可重用性

软件重用有多个层次,在编码阶段主要涉及代码重用问题。代码重用一般有两种:
 一种是本项目内的代码重用,
另一种是新项目重用旧项目的代码。
内部重用主要是找出设计中相同或相似的部分,然后利用继承机制共享它们。
为做到外部重用(即一个项目重用另一项目的代码),则必须要有长远眼光,需要反复考虑精心设计。
虽然为实现外部重用比实现内部重用考虑的面更广,但是,有助于实现这两类重用的程序设计准则却是相同的。
下面讲述主要的准则:
1. 提高方法的内聚
2. 可重用性
3. 保持方法的一致性
4. 把策略与实现分开
5. 全面覆盖
6. 尽量不使用全局信息
7. 利用继承机制

2.2.2 提高可扩充性

1. 封装实现策略
2. 不要用一个方法遍历多条关联链
3.避免使用多分支语句
4.精心确定公有方法

2.2.3 提高健壮性

1. 预防用户的操作错误
2.检查参数的合法性
3.不要预先确定限制条件
4.先测试后优化

2.3 测试策略

       测试软件的经典策略是,从“小型测试”开始,逐步过渡到“大型测试”。

       用软件测试的专业术语描述,就是从单元测试开始,逐步进入集成测试,最后进行确认测试和系统测试。

2.3.1 面向对象的单元测试

当考虑面向对象的软件时,单元的概念改变了。
       最小的可测试单元是封装起来的类和对象。一个类可以包含一组不同的操作,而一个特定的操作也可能存在于一组不同的类中。因此,对于面向对象的软件来说,单元测试的含义发生了很大变化。
       测试面向对象软件时,不能再孤立地测试单个操作,而应该把操作作为类的一部分来测试。
       这就说明,当测试面向对象软件时,传统的单元测试方法是不适用的,不能再在“真空”中(即孤立地)测试单个操作。

2.3.2 面向对象的集成测试

       因为在面向对象的软件中不存在层次的控制结构,传统的自顶向下或自底向上的集成策略就没有意义了。此外,由于构成类的各个成分彼此间存在直接或间接的交互,一次集成一个操作到类中(传统的渐增式集成方法)通常是不现实的。
面向对象软件的集成测试主要有下述两种不同的策略:
(1)基于线程的测试

(2)基于使用的测试

2.3.3 面向对象的确认测试

       在确认测试或系统测试层次,不再考虑类之间相互连接的细节。和传统的确认测试一样,面向对象软件的确认测试也集中检查用户可见的动作和用户可识别的输出。为了导出确认测试用例,测试人员应该认真研究动态模型和描述系统行为的脚本,以确定最可能发现用户交互需求错误的情景。
       当然,传统的黑盒测试方法(见本书第7章)也可用于设计确认测试用例,但是,对于面向对象的软件来说,主要还是根据动态模型和描述系统行为的脚本来设计确认测试用例。

2.4 设计测试用例

目前,面向对象软件的测试用例的设计方法,还处于研究、发展阶段。与传统软件测试(测试用例的设计由软件的输入—处理—输出视图或单个模块的算法细节驱动)不同,面向对象测试关注于设计适当的操作序列以检查类的状态。

2.4.1 测试类的方法

       对面向对象的软件来说,小型测试着重测试单个类和类中封装的方法。测试单个类的方法主要有随机测试、划分测试和基于故障的测试3种。
1.随机测试
2.划分测试
(1)基于状态的划分
(2)基于属性的划分
(3)基于功能的划分
3.基于故障的测试

2.4.2 集成测试方法

       开始集成面向对象系统以后,测试用例的设计变得更加复杂。在这个测试阶段,必须对类间协作进行测试。
       为了举例说明设计类间测试用例的方法,这里扩充12.4.1小节引入的银行系统的例子,使它包含下图所示的类和协作。图12.3中箭头方向代表消息的传递方向,箭头线上的标注给出了作为由消息所蕴涵的协作的结果而调用的操作。
       和测试单个类相似,测试类协作可以使用随机测试方法和划分测试方法,以及基于情景的测试和行为测试来完成。
1.多类测试
2.从动态模型导出测试用例

3 结束语

嗯,今天的分享到此结束。

猜你喜欢

转载自blog.csdn.net/chen_yongbo/article/details/80602008