第1页:第12章面向对象的设计与实现 本节目录
- 第12章面向对象的设计与实现
- 12.1面向对象设计准则
- 12.2面向对象启发规则
- 12.3面向对象的实现
- 12.4面向对象的软件测试
第2页:面向对象设计准则
12.1面向对象设计准则
- (1)模块化。在面向对象软件开发模式中,对象就是把数据结构和操作这些数据的方法紧密地结合在一起所构成的模块。
- (2)抽象。面向对象方法支持过程抽象及数据抽象,还支持参数化抽象。
- (3)信息隐藏。类结构分离了接口与实现,从而支持了信息隐藏。
- (4)弱耦合。耦合主要指不同对象之间相互关联的紧密程度。一般来说,对象之间的耦合可分为两大类。
- ①交互耦合。对象之间的耦合通过消息连接来实现。设计类接口时可尽量降低消息连接的复杂程度、减少对象发送的消息数都可以使交互耦合尽可能松散。
- ②继承耦合。通过集成关系结合起来的基类和派生类,构成了系统中粒度更大的模块,这种耦合程度越紧密越好。
第3页:①服务内聚
- (5)强内聚。设计中使用的一个构件内的各个元素,对完成一个定义明确的目的所做出的贡献程度。在面向对象设计中存在下述3种内聚:
- ①服务内聚。一个服务仅完成一个功能。
- ②类内聚。一个类有一个用途,它的属性和服务是高内聚的,都是完成该类对象的任务所必需的。如果某个类有多个用途,通常应将其分解成多个专用的类。
- ③一般—特殊内聚。设计一般—特殊结构,这种结构是对相应领域知识的正确抽取。
- (6)可重用。重用有两方面的含义:一是尽量使用已有的类;二是如果确实需要创建新类,则在设计这些新类的协议时,应该考虑将来的可重复使用性。软件成分的重用类别有:代码重用;分析结果重用;设计结果重用。12.1面向对象设计准则
第4页:面向对象设计启发规则
12.2面向对象设计启发规则
- (1)设计结构应清晰易懂。
- (2)一般—特殊结构的深度应适当。
- (3)设计简单的类。
- (4)使用简单的协议。
- (5)使用简单的服务。
- (6)把设计变动减至最小。
第5页:面向对象的实现
12.3面向对象的实现12.3.1面向对象语言12.3.2程序设计风格12.3.3从设计产品到代码
第6页:面向对象语言
12.3.1面向对象语言
- (1)面向对象语言的优点选择编程语言的关键因素,是语言的一致的表达能力、可重用性及可维护性。从面向对象观点看,能够更完整、更准确地表达问题域语义的面向对象语言的语法是非常重要的,因为这会带来下述几个优点:
- ①一致的表示方法。有利于在软件开发过程中始终使用统一的概念,也有利于维护人员理解软件的各种配置成分。
- ②可重用性。在OOA、OOD和OOP中显式地表示问题域语义,利于其分析设计结果的重用。
- ③可维护性。使用面向对象的程序设计语言可以更好地表达问题域语义,进行软件维护时可助于维护人员对软件理解。
第7页:面向对象语言技术特点
12.3.1面向对象语言
(2)面向对象语言的技术特点-支持类与对象概念的机制。
-实现整体-部分(即聚集或组合)结构的机制。
-实现一般-特殊(即泛化)结构的机制。
-实现属性和服务的机制。
-类型检查。
-提供实用的类库。
-语言效率高。
-持久保存对象。
-提供参数化类的机制。
-完善的开发环境。
第8页:面向对象语言选择
12.3.1面向对象语言
(3)面向对象语言的选择-将来能否占主导地位。
-可重用性好。
-类库和开发环境。
-其他因素。
如开发工具、开发平台、发行平台,以及对机器性能和内存的需求,集成已有软件的容易程度等。
第9页:程序设计风格
- 良好的程序设计风格对保证程序质量的重要性,它对面向对象实现来说尤其重要,不仅能明显减少维护或扩充的开销,而且有助于在新项目中重用已有的程序代码。
- 良好的面向对象程序设计风格,既包括传统的程序设计风格准则,也包括为适应面向对象方法所特有的概念而必须遵循的一些新准则。12.3.2程序设计风格
第10页:提高可重用性2.提高可扩充性
- 1.提高可重用性2.提高可扩充性
- ①提高方法的内聚;
- ①把接口与实现分离;
- ②减小方法的规模;
- ②避免使用多分支语句;
- ③保持方法的一致性;
- ③精心确定公有方法。
- ④全面覆盖输入条件;
- ⑤利用继承机制。3.提高健壮性
- ①预防用户的错误操作;
- ②检查参数的合法性;
- ③不要预先确定限制条件;
- ④先测试后优化12.3.2程序设计风格
第11页:从设计产品到代码
这个过程是由OOA、OOD阶段生成的成果向OOP转换的重要过程。
12.3.3从设计产品到代码
第12页:将类图映射为代码(1)单个类映射为代码1
- 1.将类图映射为代码
- (1)单个类映射为代码12.3.3从设计产品到代码Class SampleClass{private int privateAttribute;protected double protectedAttribute;private long packageAttribute;public Boolean publicAttribute;public Boolean publicMethod(int parameter1){…}private float privateMethod(byte parameter1, float parameter2){…}protected double protectedMethod(){…}public void packageMethod(short parameter1){…} }SampleClass
第13页:包映射为路径包的名称是存放包中所含类
(2)包映射为路径包的名称是存放包中所含类的路径。
要想使用包中的类,需要将包的父目录的路径添加到CLASSPATH(Java运行时的一个环境变量)中。
12.3.3从设计产品到代码
第14页:继承机制的映射
- (3)继承机制的映射
- ①类继承抽象类或具体类。
- ②类继承接口。12.3.3从设计产品到代码
第15页:类间关联关系的映射
- (4)类间关联关系的映射
- ①实现一对一关联关系。
- ②实现一对多关联关系。12.3.3从设计产品到代码
第16页:类间关联关系的映射
- (4)类间关联关系的映射
- ③映射受限关联。
- ④实现一对多关联关系。-如果关联关系没有额外的属性,可以在每一方都使用向量或者散列表。-如果关联关系还有其他属性,那么对于关联关系的每个属性,关联对象之间的每条链接都有单独的值。需要单独的关联关系类来存放对象间的链接。关联关系类还可以用来存放关联关系的额外属性。12.3.3从设计产品到代码
第17页:类间关联关系的映射
- (4)类间关联关系的映射
- ⑤映射聚合和组合关系。应用“一对多”关联关系实现聚合关系和组合关系。12.3.3从设计产品到代码
第18页:活动图映射为代码将活动图元素转换成程
- 2.活动图映射为代码将活动图元素转换成程序代码的一般规则:
- (1)活动状态。将它转换成动作语句,如方法调用语句或计算性语句。
- (2)条件分支。将它转换成if-then-else语句。
- (3)并发分支。将每个控制流分配一个线程。
- (4)循环。将活动图中的循环转换成while循环语句。12.3.3从设计产品到代码
第19页:状态图映射为代码非主动对象构成的状态
- 3.状态图映射为代码非主动对象构成的状态图转换成代码的原则如下:
- (1)将状态图映射为一个类。
- (2)将消息映射为类的属性。
- (3)将事件映射为一个方法,并将状态转换的条件和动作都映射到该方法中。
- (4)对于具有顺序子状态的组合状态来说,有必要创建一个嵌套类用来实现这些顺序子状态。父状态机可以调用嵌套类的方法来处理嵌套状态图内部的状态转换。
- (5)对于具有并发子状态的组合状态来说,可以创建嵌套类用来实现每个子状态。这种实现方法类似于实现嵌套状态图的方法。当所有并发子状态到达汇合点时,才会退出组合状态。12.3.3从设计产品到代码
第20页:从设计产品到代码状态图转换成代码
12.3.3从设计产品到代码状态图转换成代码
第21页:顺序图映射为代码将顺序图映射为代码的
- 4.顺序图映射为代码将顺序图映射为代码的一般规则:
- (1)将消息转换成适当的方法调用。例如,创建消息将被转换成接收消息的对象的构造方法,在Java中就是new语句。
- (2)在接受消息的对象中添加一个方法,该方法名与消息名相同。
- (3)将条件分支映射为if-then-else语句。
- (4)使用线程实现主动对象。
- (5)使用并发线程映射并发分支。12.3.3从设计产品到代码
第22页:面向对象的实现
12.3.3从设计产品到代码将顺序图转换成代码
第23页:面向对象的软件测试
- 面向对象软件测试的特点:
- (1)原有集成测试所要求的逐步将开发的模块搭建在一起进行测试的方法在面向对象测试中不可行;
- (2)面向对象软件对每个开发阶段都有不同以往的要求和结果,不可能用功能细化的观点来检测面向对象分析和设计的结果;
- (3)针对面向对象软件的开发特点,应该有一种新的测试模型。面向对象测试的主要活动包括:
- (1)类测试,包括功能性测试、结构性测试;
- (2)交互测试,包括汇集类的测试、协作类的测试;
- (3)系统测试,包括功能测试、性能测试、强度测试、安全测试、健壮性测试/恢复测试,安装/卸载测试等;
- (4)验收测试。12.4面向对象的软件测试
第24页:面向对象测试模型针对面向对象的开发模
12.4.1面向对象测试模型针对面向对象的开发模型,同时结合传统的测试步骤,面向对象的软件测试分为:-面向对象分析测试;-面向对象设计测试;-面向对象编程测试;-面向对象单元测试;-面向对象集成测试;-面向对象系统测试。
第25页:面向对象分析测试面向对象分析就是分析
- 12.4.2面向对象分析测试面向对象分析就是分析、验证对象及其关系的合理性、可行性。对一个面向对象的系统而言,对象是相对稳定的,关系是相对不稳定的。因此,对面向对象分析的测试,应从以下方面考虑:
- (1)对分析模型中对象的测试和确认;
- (2)对分析模型中关系的测试和确认;
- (3)对分析模型中对象属性和方法的测试和确认。
第26页:面向对象设计测试OOD确定类和类结构
- 12.4.3面向对象设计测试OOD确定类和类结构不仅要满足当前需求分析的要求,更重要的是通过重新组合或加以适当的补充、细化和分解,能方便系统的实现、对象的重用和系统的扩展,以不断适应用户的要求。对面向对象设计的测试,应从以下三个方面考虑:
- (1)对设计模型中的类的测试和确认;
- (2)对设计模型中的类层次结构的测试和确认;
- (3)对类库的测试和确认。
第27页:面向对象编程测试面向对象程序是把功能
- 12.4.4面向对象编程测试面向对象程序是把功能的实现分布在类中。因此,在面向对象编程阶段,忽略类功能实现的细则,将测试的目光集中在类功能的实现和相应的面向对象程序风格上,测试主要体现为以下两个方面:
- (1)数据成员是否满足数据封装的要求;
- (2)类是否实现了要求的功能。
第28页:面向对象单元测试测试面向对象软件时
12.4.5面向对象单元测试测试面向对象软件时,单元测试是指对类及其实例的测试。
最小的可测试单位是封装的类或对象,类包含一组操作和属性,此时不能再孤立地测试单个操作,而应该把操作作为类的一部分来进行测试。
第29页:面向对象集成测试面向对象软件的集成测
- 12.4.6面向对象集成测试面向对象软件的集成测试主要有下述两种不同的策略:
- (1)基于线程的测试这种策略把响应系统的一个输入或一个事件所需要的那些类集成起来。分别集成并测试每个线程,同时应用回归测试以保证没有产生副作用。
- (2)基于使用的测试。这种方法首先测试几乎不使用服务器类的那些类(称为独立类),把独立类都测试完之后,再测试使用独立类的下一个层次的类(称为依赖类)。对依赖类的测试逐层持续进行下去,直至把整个软件系统构造完为止。另外,集群测试作为面向对象软件集成测试的一个步骤,依照集群测试的测试思想,设计出来的测试用例来检查一群相互协作的类(通过研究对象模型可以确定协作类),这些测试用例主要用来发现不同的类之间的协作错误。
第30页:面向对象系统测试面向对象的系统测试应
12.4.7面向对象系统测试面向对象的系统测试应该尽量搭建与用户实际使用环境相同的测试平台,应该保证被测系统的完整性,对临时没有的系统设备部件,也应有相应的模拟手段。
系统测试时,应该参考OOA的结果,检测软件是否能够完全“再现”问题空间。
系统测试不仅是检测软件的整体行为表现,也是对软件开发设计的再确认。
第31页:面向对象确认测试面向对象软件的确认测
12.4.8面向对象确认测试面向对象软件的确认测试也集中检查用户可见的动作和用户可识别的输出。
为了导出确认测试用例,测试人员应该认真研究动态模型和描述系统行为的脚本,以确定最可能发现用户交互需求错误的情景。
对于面向对象的软件来说,主要还是根据动态模型和描述系统行为的脚本来设计确认测试用例。
第32页:测试用例的设计1.测试类的方法软件测
12.4.9测试用例的设计1.测试类的方法软件测试从“小型测试”开始,逐步过渡到“大型测试”。
对于面向对象的软件来说,小型测试着重测试单个类和类中封装的方法。
测试单个类的方法主要有随机测试、划分测试和基于故障的测试等三种。
第33页:测试用例的设计
12.4.9测试用例的设计
- (1)随机测试对类对象进行测试时,测试用例的设计可以不考虑对类对象操作的限制而设计为一组按不同次序排列的操作序列。有一个传感器类Sensor,该类有四个操作的接口,分别为read( ),enable( ),disable( )和test( )。在传感器可读之前,它必须被激活。一旦激活,可以读和测试它,且随时可以终止它,除非其正在处理警报条件则按照随机测试思想设计的测试用例可以为:#1:enable
- test
- read
- disable#2:enable
- test
- [read]n
- test
- disable#3:[read]n#4:enable
- disable
- [test
- read]
第34页:12.4.9 面向对象测试用例的设计
12.4.9测试用例的设计
- (2)划分测试
- ①基于状态的划分。这种方法根据类操作改变类状态的能力来划分类操作。根据类操作的执行是否改变类属性的状态来把类操作划分为状态操作和非状态操作。
- ②基于属性的划分。这种方法根据类操作使用的属性来划分类操作,然后为每个类别设计测试序列。
- ③基于功能的划分。这种方法根据类操作所完成的一般功能来划分类操作,如可划分为初始化操作、计算操作、查询操作、终止操作等,然后为每个类别设计测试序列。
第35页:基于故障的测试-基于故障的测试与传统
12.4.9测试用例的设计
(3)基于故障的测试-基于故障的测试与传统的错误推测法类似,也是首先推测软件可能有的错误,然后设计出最可能发现这些错误的测试用例。
-如果推测得比较准确,则使用基于故障的测试方法能够用相当低的工作量发现大量错误;反之,如果推测不准,则这种方法的效果并不比随机测试技术的效果好。
第36页:测试用例的设计2.集成测试(方法)
- 12.4.9测试用例的设计2.集成测试方法
- (1)多类测试。多类的划分测试类似于单类的测试。
- ①基于功能的划分。对于多类测试来说,可以扩充单独实现某功能的测试序列,以包括那些通过发送给协作类的消息而被调用的操作。
- ②基于与特定类的接口来划分类操作。如图12.1所示,Bank类接收来自ATM类和Cashier类的消息,因此可以通过把Bank类中的方法划分成服务于ATM类和Cashier类来分别测试。
- ③基于状态的划分,类中的操作进行进一步精化划分。
第37页:测试用例的设计2.集成测试方法
- 12.4.9测试用例的设计2.集成测试方法
- (2)从动态模型导出测试用例。这种测试方法借助状态转换图,导出测试该类(及与其协作的那些类)的动态行为的测试用例,设计出的测试用例应该覆盖所有状态,也就是说设计出的操作序列应该使得类实例遍历所有允许的状态转换。
第38页:测试用例的设计测试用例#1
- 12.4.9测试用例的设计测试用例#1:open
- setupAccnt
- deposit(initial)
- withdraw(final)
- close(最小测试序列)测试用例#2:open
- setupAccnt
- deposit(initial)
- deposit
- balance
- credit
- withdraw(final)
- close
第39页:本章结束页
The End