您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > 第12章面向对象实现.
第12章面向对象实现12.1程序设计语言12.2程序设计风格12.3测试策略12.4设计测试用例12.5小结1面向对象实现与面向过程的一样应包括:编码,测试。面向对象的分析和设计共同的模型使它们难于分开。面向对象编程(OOP)需要OOP语言OOLOOL具有自己的特点和风格。面向对象程序中的封装、继承和多态等机制,给测试带来新特点,增加了测试和调试的难度。2应用的实现•应用的实现是在所有的类都被实现之后的事情。•实际上,当把类开发出来时就已经实现了应用。•每个类提供了完成应用所需要的某种功能。•在C++和C中有一个main()函数。可以使用这个过程来说明构成应用的主要对象的那些类的实例。3面向对象的设计适宜用OOL来实现,理论上也可以用非OOL实现但不可取。若用非OOL编写面向对象程序,则程序员必须自己实现OOL编译程序自动提供的面向对象的概念和机制:类,继承,封装。若有可能,应选用OOL,因为它的下述重要优点。12.1程序设计语言12.1.1面向对象语言OOL的优点41.一致的表示方法面向对象开发基于不随时间变化的、一致的表示方法OO模型:OOA,OOD,OOP。2.可重用性软件开发组织可重用OOA,OOD和OOP结果。3.可维护性保持文档与源程序一致的完全一致几乎不可能。OOL的可读性(对象名等)=可维护性。5两大类面向对象语言:纯面向对象语言:Smalltalk和Eiffel等混合型面向对象语言:过程语言+OO,如C++纯面向对象语言着重支持面向对象方法研究和快速原型的实现,混合型面向对象语言的目标则是提高运行速度和使传统程序员容易接受面向对象思想。比较面向对象语言/开发环境时需要考察的特点:12.1.2面向对象语言的技术特点61.支持类与对象概念的机制:内存管理允许用户动态创建对象意味着系统必须处理内存管理问题。有两种管理内存的方法:1)语言的运行机制自动管理内存,即自动回收“垃圾”的机制;(必须采用先进的垃圾收集算法)2)由程序员编写释放内存的代码。(例如:程序员定义析构函数(destructor)。每当一个对象超出范围或被显式删除时,就自动调用析构函数。这种机制使得程序员能够方便地构造和唤醒释放内存的操作)72.实现整体-部分(即聚集)结构的机制两种实现关联方法:指针和独立的关联对象大多数现有的面向对象语言并不显式支持独立的关联对象,在这种情况下,使用指针是最容易的实现关联的方法。83.实现一般-特殊(即泛化)结构的机制实现继承+解决名字冲突。名字冲突指的是继承多个基类可能出现的重名问题。某些语言拒绝接受有名字冲突的程序,另一些语言提供了解决冲突的协议。程序员应该尽力避免出现名字冲突。94.实现属性和服务的机制属性的机制:支持实例连接;属性的可见性控制;对属性值的约束。服务的机制:支持消息连接(即表达对象交互关系);控制服务可见性;动态联编。105.类型检查强/弱类型:语法规定变量/属性分类的严格性。强类型优点:一是在编译时能发现程序错误,二是增加了优化的可能性。强类型有助于提高软件的可靠性和运行效率.强类型宜用于开发软件产品,弱类型适于快速开发原型。116.类库类库:编译/开发环境提供的重用类构件。类库包含实现通用数据结构(例如,动态数组、表、队列、栈、树等等)的类,GUI用户界面类。7.效率面向对象语言的主要缺点是效率低:解释型语言,动态联编.类库中提供的算法和数据结构更高效.差别可以忽略,利大于弊。128.持久保存对象不依赖于程序执行的生命期而长时间保存数据对象的两个原因:(1)实现不同时运行程序间传递数据(2)恢复被中断了的程序的运行理想情况下,应该使程序设计语言语法与对象存储管理语法实现无缝集成。139.参数化类类的数据(属性)类型可以由参数给定。一个类可以对不同的数据类型施以同样的操作。如对整数和实数排序。Eiffel和C++语言提供了参数化类/类模板。10.开发环境软件工具或开发环境对软件生产率有很大影响。一个语言可有不同的编译程序。CASE工具与语言的兼容性。14选择面向对象语言应考虑的因素:1.将来能否占主导地位语言的生命力及稳定性:维护的考虑。2.可重用性影响重用的要素:封装,继承,多态。3.类库和开发环境语言、开发环境和类库这3个因素共同决定可重用性。类库是否提供有价值的类?开发环境是否提供使用方便的类库编辑和浏览工具。12.1.3选择面向对象语言154.其他因素在选择编程语言时,应该考虑的其他因素还有:对用户学习面向对象分析、设计和编码技术所能提供的培训服务;在使用这个面向对象语言期间能提供的技术支持;能提供给开发人员使用的开发工具、开发平台、发行平台;对机器性能和内存的需求;集成已有软件的容易程度(调用其它语言的模块)。16为适应面向对象方法所特有的概念(例如,继承性)而必须遵循的一些新准则。12.2程序设计风格17两种代码重用:1)本项目内的代码重用,2)重用旧/外项目的代码。1)内部重用:利用继承机制共享相同或相似的部分12.2.1提高可重用性17两种代码重用:1)本项目内的代码重用,2)重用旧/外项目的代码。1)内部重用:利用继承机制共享相同或相似的部分12.2.1提高可重用性18实现两类重用的程序设计准则:1.提高方法的内聚一个方法(即服务)只完成单个功能,否则把它分解成几个更小的方法。2.减小方法的规模把规模过大的方法(代码长度超过一页纸),分解成几个更小的方法。3.保持方法的一致性功能相似的方法应该有一致的名字、参数特征(包括参数个数、类型和次序)、返回值类型、使用条件及出错条件等。194.把策略与实现分开两种不同类型的方法:策略与实现。策略方法(拼积木)调用实现方法(积木)来完成任务(实现图案)。策略方法通常紧密依赖于具体应用。实现方法针对具体数据完成特定处理,用于实现复杂的算法。相对独立于应用,因此,较可能被重用。205.全面覆盖方法的实现不仅满足当前应用而且应该考虑其它应用的潜在需要。此外,方法对空值、极限值及界外值等异常情况也应该能够作出有意义的响应。6.尽量不使用全局信息应该尽量降低方法与外界的耦合程度,不使用全局信息,如类变量。217.利用继承机制继承是实现共享和提高重用的主要途径。(1)调用子过程:把公共的代码分离出来,构成一个被其他方法调用的公用方法,并在基类中定义它。(2)分解因子。从不同类的相似方法中分解出不同的“因子”(即不同的代码),把余下的代码作为公用方法中的公共代码,把分解出的因子作为名字相同(多态性机制)算法不同的方法,放在不同类中定义,并被这个公用方法调用,如图所示。22(3)使用委托。仅当确实存在一般-特殊关系时,使用继承才是恰当的,否则,可以利用委托机制,如本书11.11.3小节所述。(4)把代码封装在类中。(与继承无关)把被重用的代码封装在类中比较安全和修改。23提高可重用性的准则,也能提高程序的可扩充性。此外,下列准则也有助于提高可扩充性:1.封装实现策略把类的实现策略(包括描述属性的数据结构、修改属性的算法等)封装起来,将提高今后修改数据结构或算法的自由度。12.2.2提高可扩充性242.不要用一个方法遍历多条关联链一个方法应该只包含对象模型中的有限内容,除非内容与方法无关。否则将导致方法过分复杂,既不易理解,也不易修改扩充。3.避免使用多分支语句可以利用DO_CASE语句测试对象的内部状态,而不要用来根据对象类型选择应有的行为(强耦合),否则在增添新类时将不得不修改原有的代码。应该利用多态性机制,根据对象当前类型,自动决定应有的行为。254.精心确定公有方法公有方法是向公众公布的接口。对这类方法的修改往往会涉及许多其他类。为提高稳定性,可修改性,降低维护成本,必须精心选择和定义公有方法。删除、增加或修改私有方法所涉及的面要窄得多,因此代价也比较低。26既应该考虑效率,也应该考虑健壮性。需要在健壮性与效率之间做出适当的折衷。为提高健壮性应该遵守以下几条准则:1.预防用户的操作错误软件系统必须具有处理用户操作错误的能力。任何一个接收用户输入数据的方法,对其接收到的数据都必须进行检查,发现了错误,应该给出恰当的提示信息,并准备再次接收用户的输入。12.2.3提高健壮性272.检查参数的合法性对公有方法,尤其应该着重检查其参数的合法性,因为调用公有方法时可能违反参数的约束条件。3.不要轻易限定数据容量在设计阶段,很难准确地预测出应用系统中数据结构的最大容量需求。如果有必要和可能,应该使用动态内存分配机制。284.先测试后优化测试程序的性能以确定是否为提高效率而进行优化。如果实现某个操作的算法有许多种,则应该综合考虑内存需求、速度及实现的简易程度等因素,经合理折衷选定适当的算法。29测试面向对象软件的策略与与面向过程的策略基本相同,但也有许多新特点。12.3测试策略30最小的可测试单元是单个封装起来的类和对象。测试一个类就是测试它的对象子集(不可穷尽).测试对象主要是测试它的操作.不能孤立地测试单个操作:同一个操作在不同状态下行为不同.同一个操作在不同类中有不同的实现(多态性).有必要在每个子类的语境中测试操作比面向过程更复杂12.3.1面向对象的单元测试31集成=组装有关联的类不存在层次的控制结构(隐含在类中)传统的自顶向下/自底向上的集成策略无意义。12.3.2面向对象的集成测试32面向对象软件的集成测试的两种策略:(1)基于线程的测试(threadbasedtesting):把响应系统的一个输入或一个事件所需要的那些类(线程)集成起来。(2)基于使用的测试(usebasedtesting):首先测试独立类(几乎不使用其它类的类),再测试使用独立类的下一个层次的类(称为依赖类)。据此依赖关系持续下去,直至把整个软件系统构造完为止。集群测试(clustertesting):用精心设计的测试用例检查一群相互协作的类(通过研究对象模型可以确定协作类),以发现不同的类之间的协作错误。33和传统的确认测试一样,面向对象软件的确认测试也集中检查用户可见的动作和用户可识别的输出。从动态模型和描述系统行为的脚本可导出确认测试用例,以发现用户交互需求可能错误的情景。黑盒测试方法也可用于设计上述确认测试用例。12.3.3面向对象的确认测试34与传统软件测试不同,面向对象测试关注设计适当的操作序列以检查类的状态。•(1)传统方法的可用性•白盒测试:用于类级别的测试。测试类中封装的操作,检查类的状态以确定是否存在错误。•黑盒测试:用于集成测试、确认测试。12.4设计测试用例35着重测试单个类和类中封装的方法主要有:随机测试、划分测试和基于故障的测试等3种。12.4.1测试类(单元)的方法351.随机测试•随机选取测试类操作序列以测试该类对象不同的生命历史•问题的性质隐含了一些限制例:银行应用系统的account(账户)类有下列操作:open(打开),setup(建立),deposit(存款),withdraw(取款),balance(余额),summarize(清单),creditLimit(透支限额)和close(关闭)。限制:必须在其他操作前打开账户,完成了全部操作之后才能(/必须)关闭账户。36一个account类实例的最小(正常)行为历史包含下列操作:open·setup·deposit.withdraw·close可能发生许多其他行为:Open·setup·deposit·[deposit|withdraw|balance|summarize|creditLimit]n.withdraw·close从上列序列可以随机地产生一系列不同的操作序列:#r1:open·setup·deposit·deposit·balance·summarize.withdraw·close#r2:open·setup·deposit·creditLimit·withdraw·close也要考虑异常(用户或编程)序列:open·setup·.withdraw·closesetup·deposit.withdraw·close372.划分测试划分测试(partit
本文标题:第12章面向对象实现.
链接地址:https://www.777doc.com/doc-2153356 .html