12章 面向对象实现

第12章 面向对象实现

    • 12.1 程序设计语言
      • 12.1.1 面向对象语言的优点
        • 1. 一致的表示方法
        • 2. 可重用性
        • 3. 可维护性
      • 12.1.2 面向对象语言的技术特点
      • 12.1.3 选择面向对象语言
    • 12.2 程序设计风格
      • 12.2.1 提高可重用性
      • 12.2.2 提高可扩充性
      • 12.2.3 提高健壮性
    • 12.3 测试策略
      • 12.3.1 面向对象的单元测试
      • 12.3.2 面向对象的集成测试
      • 12.3.3 面向对象的确认测试
    • 12.4 设计测试用例
      • 12.4.1 测试类的方法
      • 12.4.2 集成测试方法
    • 本章小结

12章 面向对象实现_第1张图片
12章 面向对象实现_第2张图片

12.1 程序设计语言

面向对象设计的结果既可以用面向对象语言、也可以用非面向对象语言实现。
12章 面向对象实现_第3张图片
例如,C语言并不直接支持类或对象的概念,程序员只能在结构(struct)中定义变量和相应的函数(事实上,不能直接在结构中定义函数而是要利用指针间接定义)。

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

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

12.1.1 面向对象语言的优点

1. 一致的表示方法

12章 面向对象实现_第5张图片

2. 可重用性

12章 面向对象实现_第6张图片

随着时间的推移,软件开发组织既可能重用它在某个问题域内的OOA结果,也可能重用相应的OOD和OOP结果。

3. 可维护性

以ATM系统为例,说明在程序内部表达问题域语义对维护工作的意义。假设在维护该系统时没有合适的文档资料可供参阅,于是维护人员人工浏览程序或使用软件工具扫描程序,记下或打印出程序显式陈述的问题域语义,维护人员看到“ATM”、“账户”、“现金兑换卡”等,这对维护人员理解所要维护的软件将有很大帮助。

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

12章 面向对象实现_第7张图片
12章 面向对象实现_第8张图片
12章 面向对象实现_第9张图片
12章 面向对象实现_第10张图片
12章 面向对象实现_第11张图片
12章 面向对象实现_第12张图片
12章 面向对象实现_第13张图片
12章 面向对象实现_第14张图片
12章 面向对象实现_第15张图片
12章 面向对象实现_第16张图片
12章 面向对象实现_第17张图片
12章 面向对象实现_第18张图片
12章 面向对象实现_第19张图片

12.1.3 选择面向对象语言

开发人员在选择面向对象语言时,还应该着重考虑以下一些实际因素。
12章 面向对象实现_第20张图片
12章 面向对象实现_第21张图片
12章 面向对象实现_第22张图片

12.2 程序设计风格

12章 面向对象实现_第23张图片

12.2.1 提高可重用性

12章 面向对象实现_第24张图片
12章 面向对象实现_第25张图片
12章 面向对象实现_第26张图片

12章 面向对象实现_第27张图片
12章 面向对象实现_第28张图片
12章 面向对象实现_第29张图片
12章 面向对象实现_第30张图片
12章 面向对象实现_第31张图片

12.2.2 提高可扩充性

12章 面向对象实现_第32张图片
12章 面向对象实现_第33张图片
12章 面向对象实现_第34张图片

12.2.3 提高健壮性

12章 面向对象实现_第35张图片
12章 面向对象实现_第36张图片
12章 面向对象实现_第37张图片

12.3 测试策略

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

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

12章 面向对象实现_第38张图片

12.3.1 面向对象的单元测试

当考虑面向对象的软件时,单元的概念改变了。

最小的可测试单元是封装起来的类和对象。一个类可以包含一组不同的操作,而一个特定的操作也可能存在于一组不同的类中。因此,对于面向对象的软件来说,单元测试的含义发生了很大变化。

12章 面向对象实现_第39张图片

12.3.2 面向对象的集成测试

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

12章 面向对象实现_第40张图片
12章 面向对象实现_第41张图片

12.3.3 面向对象的确认测试

在确认测试或系统测试层次,不再考虑类之间相互连接的细节。和传统的确认测试一样,面向对象软件的确认测试也集中检查用户可见的动作和用户可识别的输出。为了导出确认测试用例,测试人员应该认真研究动态模型和描述系统行为的脚本,以确定最可能发现用户交互需求错误的情景。

当然,传统的黑盒测试方法(见本书第7章)也可用于设计确认测试用例,但是,对于面向对象的软件来说,主要还是根据动态模型和描述系统行为的脚本来设计确认测试用例。

12.4 设计测试用例

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

12.4.1 测试类的方法

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

12章 面向对象实现_第42张图片

12章 面向对象实现_第43张图片

12章 面向对象实现_第44张图片

12章 面向对象实现_第45张图片

12章 面向对象实现_第46张图片

12章 面向对象实现_第47张图片
12章 面向对象实现_第48张图片

12.4.2 集成测试方法

开始集成面向对象系统以后,测试用例的设计变得更加复杂。在这个测试阶段,必须对类间协作进行测试。

为了举例说明设计类间测试用例的方法,这里扩充12.4.1小节引入的银行系统的例子,使它包含下图所示的类和协作。图12.3中箭头方向代表消息的传递方向,箭头线上的标注给出了作为由消息所蕴涵的协作的结果而调用的操作。

和测试单个类相似,测试类协作可以使用随机测试方法和划分测试方法,以及基于情景的测试和行为测试来完成。

12章 面向对象实现_第49张图片
12章 面向对象实现_第50张图片
12章 面向对象实现_第51张图片
12章 面向对象实现_第52张图片
12章 面向对象实现_第53张图片
12章 面向对象实现_第54张图片
12章 面向对象实现_第55张图片

本章小结

1.为了把面向对象设计结果顺利地转变成面向对象程序,首先应该选择一种适当的程序设计语言。面向对象的程序设计语言非常适合用来实现面向对象设计结果
2.良好的程序设计风格对于面向对象实现来说格外重要。
3.面向对象测试的策略和技术与传统测试有所不同,测试的焦点从过程构件(传统模块)移向了对象类。
4.一旦完成了面向对象程序设计,就开始对每个类进行单元测试、集成测试、确认测试,并设计测试用例。主要测试方法有随机测试、划分测试和基于故障的测试。

你可能感兴趣的:(软件工程())