您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > 第12章面向对象实现
第12章面向对象实现面向对象实现主要包括以下工作:把面向对象设计结果翻译成用某种程序语言书写的面向对象程序;测试并调试面向对象的程序。(注意:在OO开发中,测试不是一个单独的阶段,而是贯穿在各个阶段中)1.Simula语言(混合型OOPL)1967年挪威的奥斯陆大学和挪威计算中心研制。具有:类、子类、继承和多态机制,用于仿真。该语言相当于ALGOL60+OO概念2.Smalltalk语言(纯OOPL)70年代由AlanKay在犹他大学提出,后Xerox公司的parc研究中心在AlanKay的基础上推出多个版本的语言,其中:Smalltalk-80最具影响,成为OOPL的里程碑。特点:①具有现代OOPL的大部分特点;②首次引入“虚拟机”的技术;一.OO程序设计语言(OOPL)介绍③具有较强的存储管理和垃圾自动收集能力;④采用GUI和类库;⑤弱类型,语句功能极强,如:Dialogwarn“Helloworld!”则弹出一个对话框并在其中显示字符串“Helloworld!”意思是向对象Dialog发出消息warn参数是“Helloworld!”又如:99factorial即向99对象发送消息:factorial无参数,返回99的阶乘。3.Eiffel语言(纯OOPL)85年由Meyer在美国ISE公司设计的,以法国Eiffel铁塔的设计师命名。Eiffel语言具有Smalltalk全部功能,同时为保证设计质量引入“按契约设计”的思想,并加入多继承的概念,有人说它是Smalltalk的后继版本。4.C++语言(混合型OOPL)86年AT&T公司Bell实验室设计的,相当于在C的基础上增加了面向对象的概念。·C++语法复杂,具有:操作符重载、多继承、友元函数、模板、指针、虚拟继承、虚函数、预编译等·C++是强类型语言所有变量必须预先定义,执行效率高·C++的问题是不具备内存自动管理和垃圾自动收集功能,内存的申请和释放由程序员管理。5.Java语言(纯OOPL)Java是SunMicrosystem公司95年推出的跨平台OOPL,语法上类似C++,语义上类似Smalltalk-80Java把C++中一些容易引起问题的特性(比如:指针、运算符重载、多继承等)删掉,加入动态内存管理、垃圾自动收集等机制,使程序员不必管理内存(构造函数和析构函数)。Java的虚拟机技术,借鉴于Smalltalk.使得它具有跨平台的特点。Java最初是用于写出一些小程序Applet嵌入到网页中,使其显示动画、声音等功能,后来渐渐移到服务器端应用(如:Servlet)。所以Java虽然是通用语言,但它在动态网站的应用上(服务器端)更具特色。6.其它OOPLa)CLOSb)Ada95c)Oberond)Selfe)ObjectCf)ObjectPascal……7.UML面向对象的建模语言(一)面向对象语言的技术特点20世纪50年代诞生的LISP语言中引入了动态联编的概念和交互式开发环境的思想。20世纪80年代以来,面向对象语言像雨后春笋般大量涌现,形成了两大类OOPL。纯面向对象语言和混合型面向对象语言。二.面向对象语言的技术特点和选择一般说来,纯面向对象语言着重支持面向对象方法研究和快速原型的实现,而混合型面向对象语言的目标则是提高运行速度和使传统程序员容易接受面向对象思想。成熟的面向对象语言通常都提供丰富的类库和强有力的开发环境。(二)面向对象语言的选择选择面向对象语言时,应该考虑以下因素:1.将来能否占主导地位2.可重用性3.类库和开发环境4.其他因素比如:提供的培训服务、技术支持及开发工具、开发平台,以及集成已有软件的容易程度等。(三)程序设计风格1.提高可重用性2.提高方法的内聚3.减小方法的规模4.保持方法的一致性5.把策略与实现分开6.全面覆盖7.尽量不使用全局信息8.利用继承机制9.封装实现策略10.精心确定公有方法11.预防用户的操作错误12.先测试后优化三.面向对象实现1.实现类的关联1)单向关联Java代码:2)双向关联Java代码:3)关联的角色和多重性Java代码:4)自反关联Java代码:5)关联类Java代码:2.实现类的聚集上图的实现代码同双向关联代码:3.实现类的泛化JavaCode:4.综合例子(1)综合例子(2)Java代码:综合例子(3)4.实现类的服务实现服务应考虑·支持消息连接(表达对象交互)·控制服务的可见性机制·动态联编5.类型检查弱类型语言给程序设计带来方便,但运行效率慢;强类型语言有利于在编译时发现程序错误,同时也增加优化的可能性、提高软件可靠性及运行效率。所以现代语言大部分是强类型的。6.类库类库一般由编译系统提供,有了类库许多组件就不必由程序员从头编写了。类库中包括:1)实现通用数据结构的类(如:动态数组、链表、队列、栈、树…等)以及实现各种关联的类。2)更完整的类库包括独立于具体设备的接口类(如:输入/输出流等)还包括各种用户界面的类及相对独立的图形库。7.其它(略)测试软件的经典策略是,从“小型试”开始,逐步过渡到“大型测试”。用软件测试的专业术语描述,就是从单元测试开始,逐步进入集成测试,最后进行确认测试(和系统测试)。四.面向对象测试由于一个类可以包含一组不同的操作,而一个特定的操作也可能存在于一组不同的类中。因此,单元测试的含义发生了很大变化。1.面向对象的单元测试传统的Top-Down(或Bottom-Up)方法失效(1)基于线程的测试。把响应系统的一个输入或一个事件所需要的那些类集成起来。分别集成并测试每个线程。(2)基于使用的测试。首先测试不使用服务器类的那些类(即独立类),再测试使用独立类的下一个层次的类(称为依赖类)。一个层次一个层次地持续进行下去,直至测完整个系统。2.面向对象的集成测试为了导出确认测试用例,测试人员应该认真研究UseCase模型及其它动态模型,认真研究描述系统行为的脚本,以便确认系统是否真正满足用户需求。当然,传统的黑盒测试方法(见本书第7章)也可用于设计确认测试用例。3.面向对象的确认测试目前,面向对象软件的测试用例的设计方法,还处于研究、发展阶段。1.测试类的方法测试单个类的方法主要有随机测试、划分测试和基于故障的测试等3种。五.设计测试用例1)随机测试例如:银行应用系统的account(账户)有下列操作:open(打开)setup(建立)deposit(存款)withdraw(取款)balance(余额)summarize(清单)creditLimit(透支限额)close(关闭)。一个account类实例的最小行为历史包括下列操作:open·setup·deposit·withdraw·close这就是对account类的最小测试序列。在最小测试序列中随机加入对account的操作,就构成测试用例,例如:#r1:open·setup·deposit·deposit·balance·summarize·withdraw·close#r2:open·setup·deposit·withdraw·deposit·balance·creditLimit·withdraw·close2)划分测试与传统软件等价划分方法(partitiontesting)类似。首先,把输入和输出分类,然后设计测试用例以测试划分出的每个类别。(1)基于状态的划分再一次考虑account类,状态操作包括deposit和withdraw,而非状态操作有balance,summarize和creditLimit。测试用例1(改变状态)#p1:open·setup·deposit·deposit·withdraw·withdraw·close测试用例2(不改变状态)#p2:open·setup·deposit·summarize·creditLimit·withdraw·close(2)基于属性的划分这种方法根据类操作使用的属性来划分类操作。对于account类来说,可以使用属性balance来定义划分,从而把操作划分成3个类别:使用balance的操作;修改balance的操作;不使用也不修改balance的操作。然后,为每个类别设计测试序列。(3)基于功能的划分可以把account类中的操作分类为:初始化操作(open,setup)计算操作(deposit,withdraw)查询操作(balance,summarize,creditLimit)终止操作(close)。然后为每个类别设计测试序列。3)其它测试基于故障的测试(faultbasedtesting)与传统的错误推测法类似。(参见教科书P291)2.集成测试方法1)多类测试使用类操作符列表来生成一系列随机测试序列。(具体例子请参见教科书P291-292)2)从动态模型导出测试用例(具体例子请参见教科书P293)面向对象方法学把分析、设计和实现很自然地联系在一起了。为了把面向对象设计结果顺利地转变成面向对象程序,首先应该选择一种适当的程序设计语言。应充分掌握把设计模型转换成面向对象语言(比如Java)的技术。12.5小结具有方便的开发环境和丰富的类库的面向对象程序设计语言,是实现面向对象设计的最佳选择。良好的程序设计风格对于面向对象实现来说格外重要。面向对象测试的总目标与传统软件测试的目标相同,也是用最小的工作量发现最多的错误。但是,面向对象测试的策略和技术与传统测试有所不同,测试的焦点从传统模块移向了对象类。
本文标题:第12章面向对象实现
链接地址:https://www.777doc.com/doc-3300519 .html