软件工程导论class18面向对象实现.ppt_第1页
软件工程导论class18面向对象实现.ppt_第2页
软件工程导论class18面向对象实现.ppt_第3页
软件工程导论class18面向对象实现.ppt_第4页
软件工程导论class18面向对象实现.ppt_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、软件工程导论第18课,第12章 面向对象实现,第12章 面向对象实现,2项主要工作: (1)把面向对象设计结果翻译成用某种程序语言书写的面向对象程序, (2)测试并调试面向对象程序 采用的语言的特点和程序设计风格影响程序的可靠性、可重用性和维护 封装、继承、多态给测试带来新特点,要进一步探索更有效的测试方法,12.1 程序设计语言,面向对象设计的结果可以用面向对象语言,也可以用非面向对象语言实现。 非面向对象语言实现困难比较多。 语言选择要考虑功能的强大,便于实现面向对象概念,可重用性和可维护性 好的语言会有以下优点:,12.1 程序设计语言,1 一致的表示方法 一致的表示方法应该从问题域到O

2、OA,OOD,OOP始终稳定不变。 有利于在软件开发过程中始终使用统一的概念,有利于维护人理解软件的各种配置。 2 可重用性 OOA,OOD,OOP的结果都可以重用。,12.1 程序设计语言,3 可维护性 实际情况是:维护人员最终面对的只有源程序本身,没有文档。 在选择编程语言时,要选择能最好地表达问题域语义的,便于维护人员理解程序和维护 最好选用面向对象语言,12.1.2 面向对象语言的技术特点,面向对象语言 20世纪50年代 LISP语言 动态联编 20世纪60年代 SIMULA语言 类,继承 20世纪70年代 Modula_2, Ada 抽象 20世纪80年代 Smalltalk, Ei

3、ffel 过程语言上增加面向对象机制 C+ 面向对象语言的技术特点如下:,1 支持类与对象概念的机制,用户动态创建对象,用指针引用动态创建的对象。 系统必须进行动态内存管理,分配和释放内存。不释放会用尽内存。 自动回收,有时系统回收不太好。 C+采用析构函数的方式释放内存。,2 实现整体-部分(聚集)结构的机制,2种方法实现整体-部分结构 使用指针的方式,和独立的关联方式 3 实现一般特殊结构的机制(泛化) 实现继承机制,解决名字冲突的机制。 名字冲突就是重名问题, 尽是避免名字冲突,4 实现属性和服务的机制,实现属性的机制考虑问题:支持实例连接的机制,属性的可见性控制,对属性值的约束。 服务

4、考虑的因素:支持消息连接的机制,控制服务可见性的机制,动态联编。 动态联编:系统在运行过程中,当需要执行一个特定服务的时候,选择实现该服务的适当算法。虚函数是动态联编。,5 类型检查,弱类型:仅要求每个变量或属性隶属于一个对象 强类型:语法规定每个变量或属性必须准确地隶属于某个特定的类 Smalltalk是无类型语言,C+是强类型 强类型的优点:有利于在编译时发现错误; 增加了优化的可能性。,6 类库,大多数面向对象语言都提供实用的类库。 编译系统提供类库。 类库增加重用性 类库中包含通用的数据结构类,把这些类称为包容类 关联类,接口类,用户界面类,7 效率,面向对象的程序效率并不低。 类库中

5、的算法和数据结构更先进,代码更精巧。 类的动态联编查找方法经过优化,速度快。 8 持久保存对象 保存数据的方法,保存数据用于传递数据,恢复数据。 人工进行数据保存,保存数据的类,9 参数化类,一些软件元素,功能相同,处理对象不同。 参数化类就是使用一个或多个类型去参数化一个类的机制。 程序员先定义一个参数化的类模板,然后把数据类型作为参数传递进去,从而把这个模板应用在不同的应用程序中。 Effel语言中有参数化类,C+提供了类模板。,10开发环境,开发环境包括的基本软件工具: 编辑程序,编译程序,解释程序、浏览工具、调试器。 编译程序代码效率比解释程序高 编译先翻译成中间语言程序,再翻译成目标

6、代码 传统的系统构造工具(例如UNIX的make)落后了。 例:C+的Visual Studio,12.1.3 选择面向对象语言,开发人员选择面向对象语言时考虑的因素: 1 将来能否占主导地位 2 可重用性 3 类库和开发环境 考虑类库中具有哪些有价值的类, 开发环境具有方便的编辑工具和浏览工具 4 其他因素 培训、技术支持,开发工具、开发平台、 发行平台、对机器性能和内存的要求,集成已有软件的容易程度。,12.2 程序设计风格,良好的程序设计风格有利于维护、扩充,重用。 为适应面向对象方法所特有的概念而必须遵循的一些新准则。 可重用性,可扩展性,12.2.1 提高可重用性,在编码阶段主要是代

7、码重用 2种代码重用: 内部重用即本项目内的代码重用 外部重用即新项目重用旧项目的代码 内部重用:找出相似部分,用继承共享它们 外部重用:要精心设计 下面是实现重用的准则:,1 提高方法的内聚,一个方法应该只完成单个功能,如果一个方法涉及多个功能,要进行分解。 2 减小方法的规模 如果某个方法过大,应该把它分解成几个小方法。 3 保持方法的一致性 功能相似的方法有一致的名字、参数特征、返回值类型、使用条件、出错条件等。,4 把策略与实现分开,两种方法 做出决策,提供变元,并且管理全局资源的方法称为策略方法。 完成具体操作的方法称为实现方法。 策略方法检查系统运行状态,处理出错情况。 实现方法完

8、成特定处理、实现算法 为提高可重用性,不要把策略和实现放在同一个方法中,算法的核心部分放在实现方法中。在策略方法中提取出具体参数,调用实现方法。,5 全面覆盖,针对输入条件的各种组合,对所有能出现的组合写出方法。 一个方法要能处理正常值,并能处理空值、极限值、界外值等异常情况。 6 尽量不使用全局变量 尽量降低方法与外界耦合的程度,不使用全局变量是降低耦合的一项主要措施。,7 利用继承机制,继承是实现共享和提高重用程度的主要途径 (1)调用子过程。把公共的代码分离出来,构成一个被其他方法调用的公共方法,在基类中定义这个公共方法,供派生类调用。 (2)分解因子。从不同类的相似方法中分解出不同的因

9、子(即不同的代码),把余下的代码作为公用方法的公共代码。在抽象基类中定义公用方法,与多态性结合,让派生类继承公用方法。,(3) 使用委托,当逻辑上不存在一般-特殊关系时,为重用已有的代码,可以利用委托机制。(把一类对象作为另一类对象的属性,从而在两类对象间建立组合关系) (4)把代码封装在类中。把可以重用的代码封装在类中。,12.2.2 提高可扩充性,下面是有利于提高可扩充性的准则: 1 封装实现策略 把类的实现策略(包括描述属性的数据结构,修改属性的算法等)封装起来,对外只提供公有接口。 2 不要用一个方法遍历多条关联链 不要使程序过分复杂、不易理解、不易修改扩充。,3 避免使用多分支语句,

10、不要用DO_CASE语句根据对象类型选择行为。要利用多态性机制,根据对象当前的类型,自动决定应有的行为。 精心确定公有方法 修改公有方法的代价比较高,为提高可修改性,降低维护成本,必须精心设计和定义公有方法。私有方法只在类内使用,利用私有方法实现公有方法。,12.2.3 提高健壮性,健壮性就是硬件故障、输入的数据无效或操作错误等意外环境下,系统能做出适当响应的程度。 健壮性不可忽略。 健壮性是不何忽略的质量指标。 为提高健壮性的几条准则,1 预防用户的操作错误,软件系统必须具有处理用户操作错误的能力。当用户输入错误时,给出错误提示。 2 检查参数的合法性 对公有方法,尤其要检查参数的合法性 3

11、 不要预先确定限制条件 不预先设定数据结构的最大容量需求。最好用动态内存分配。,4 先测试后优化,应该在为提高效率而进行优化前,先测试程序的性能。 仔细研究,哪些部分需要重点测试。 经过测试,合理地确定为提高性能应该着重优化的关键部分。,12.3 测试策略,小型测试-大型测试 单元测试-集成测试-确认测试-系统测试 测试面向对象软件时,不能再孤立地测试单个操作。,12.3.1 面向对象的单元测试,最小的测试单元是封装起来的类和对象。 一个类可以包含一组不同的操作,一个特定的操作可以存在于一组不同的类中。 测试面向对象软件时,不能再孤立地测试单个操作,而应该把操作作为类的一部分来测试。 例子:超

12、类中定义的一个操作,多个子类调用,测试时,要全部测试这些子类,12.3.2 面向对象的集成测试,自项向下、自底向上、渐增式的集成方法不能用 面向对象软件的集成测试主要有下述2种: (1)基于线程的测试(thread based testing). 把响应系统的一个输入或一个事件所需要的那些类集成起来,分别集成并测试每个线程,同时应用回归测试以保证没有产生副作用。,12.3.2 面向对象的集成测试,独立类:不使用服务器类的那些类 (2)基于使用的测试(use based testing). 首选测试独立类,把独立类都测试完后,再测试使用独立类的下一个层次的类(称为依赖类)。对依赖类一层一层的测试

13、下去,直至把整个软件系统构造完为止。 注意测试不同类之间的协作错误,采用集群测试的方法。,12.3.3 面向对象的确认测试,确认测试:保证软件确实满足用户需求而进行的测试。验证系统功能和性能的有效性。 面向对象的确认测试检查用户的输入和输出。为了导出测试用例,须认真研究动态模型和描述系统行为的脚本,以确定最可能发现用户交互需求错误的场景。 可用黑盒测试方法设计测试用例。,12.4 设计测试用例,面向对象软件的测试用例的设计方法,还处于研究、发展阶段。 关注重点:设计适当的操作序列以检查类的状态。 12.4.1 测试类的方法 面向对象软件的小型测试着重测试单个类和类中封装的方法。 测试方法:随机

14、测试、划分测试、基于故障的测试。,1 随机测试,将完成行为的各种操作,随机地产生它们的操作序列,以该操作序列测试系统。 例子:银行应用系统的帐户类有下列操作: Open, setup, deposit, withdraw, balance, summarize, creditLimit, close. 限制是:第1个操作是open, 最后一个是close 随机产生的测试用例: 1:open setup deposit deposit balance summarize withdraw close 2: open setup deposit withdraw deposit balance c

15、reditLimit withdraw close,2 划分测试,目的:减少测试类时需要的测试用例的数量 先分为输入,输出类 划分类别的方法 (1) 基于状态的划分 根据类操作改变类状态的能力来划分类操作 例子: P1: open setup deposit deposit withdraw withdraw close P2: open setup deposit summarize creditLimit withdraw close,(1) 基于状态的划分 根据类操作改变类状态的能力来划分类操作 例子: 状态操作:deposit, withdraw 非状态操作: balance, sum

16、marize, creditLimit 改变状态测试P1: open setup deposit deposit withdraw withdraw close 不改变状态测试P2: open setup deposit summarize creditLimit withdraw close,(2)基于属性的划分,根据类操作使用的属性来划分操作 例子:基于balance定义划分 使用balance操作 修改balance操作 与balance无关的操作 (3)基于功能的划分 根据类操作完成的功能来划分操作 例子:初始化(open, setup),计算(deposit, withdraw) 查

17、询(balance, summarize,creditLimit), 终止(close),3 基于故障的测试,首选推测软件中可能有的错误,然后设计出最可能发现这些错误的测试用例。 推测错误:仔细研究分析模型和设计模型,12.4.2 集成测试方法,对类间协作进行测试 和测试单个类相似,可以使用随机测试、划分测试、基于情景的测试、行为测试 1 多类测试 生成多个类的随机测试用例的步骤: (1)对每个客户类,使用类操作符列表来生成一系列随机测试序列。这些操作符向服务器类实例发送消息。,(2)对所生成的每个消息,确定协作类和在服务器对象中的对应操作。 (3)对服务器对象中的每个操作符,确定传递的消息。

18、 (4)对每个消息,确定下一层被调用的操作符,并把这些操作符结合进测试序列中。,测试用例: R3:verifyAcct verifyPIN depositRep 为找到测试涉及的协作者,考虑每个操作相关联的消息。 Bank & ValidationInfo 执行verifyAcct, verifyPIN Bank & Account 执行depositReq 协作的新测试用例是: R4: verifyAcctbank validAcctvalidation verifyPINbank validPINvalidation depositReq depositaccount,2 从动态模型导出测试用例,使用类的状态图导出测试类的动态行为

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论