面向对象实现优秀PPT.ppt

上传人:石*** 文档编号:65784876 上传时间:2022-12-08 格式:PPT 页数:58 大小:1MB
返回 下载 相关 举报
面向对象实现优秀PPT.ppt_第1页
第1页 / 共58页
面向对象实现优秀PPT.ppt_第2页
第2页 / 共58页
点击查看更多>>
资源描述

《面向对象实现优秀PPT.ppt》由会员分享,可在线阅读,更多相关《面向对象实现优秀PPT.ppt(58页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、面向对象实现面向对象实现第一页,本课件共有58页面向对象实现主要包括两项工作:面向对象实现主要包括两项工作:把面向对象设计结把面向对象设计结果翻译成用某种程序语言书写的面向对象程序;测试果翻译成用某种程序语言书写的面向对象程序;测试并调试面向对象的程序。并调试面向对象的程序。面向对象程序的质量基本上由面向对象设计的质量决定,面向对象程序的质量基本上由面向对象设计的质量决定,但是,所采用的程序语言的特点和程序设计风格也将对程但是,所采用的程序语言的特点和程序设计风格也将对程序的可靠性、可重用性及可维护性产生深远影响。序的可靠性、可重用性及可维护性产生深远影响。目前,软件测试仍然是保证软件可靠性的

2、主要措施,对目前,软件测试仍然是保证软件可靠性的主要措施,对于面向对象的软件来说,情况也是如此。面向对象测试于面向对象的软件来说,情况也是如此。面向对象测试的目标,也是用尽可能低的测试成本发现尽可能多的软的目标,也是用尽可能低的测试成本发现尽可能多的软件错误。件错误。第二页,本课件共有58页 面向对象设计的结果既可以用面向对象语言、也可面向对象设计的结果既可以用面向对象语言、也可以用非面向对象语言实现。以用非面向对象语言实现。使用面向对象语言时,由于语言本身充分支持面向对使用面向对象语言时,由于语言本身充分支持面向对象概念的实现,因此,编译程序可以自动把面向对象概象概念的实现,因此,编译程序可

3、以自动把面向对象概念映射到目标程序中。念映射到目标程序中。12.1 程序设计语言程序设计语言 12.1.1 面向对象语言的优点面向对象语言的优点第三页,本课件共有58页到底应该选用面向对象语言还是非面向对象语言,关到底应该选用面向对象语言还是非面向对象语言,关键不在于语言功能强弱。从原理上说,使用任何一种键不在于语言功能强弱。从原理上说,使用任何一种通用语言都可以实现面向对象概念。当然,使用面向通用语言都可以实现面向对象概念。当然,使用面向对象语言,实现面向对象概念,远比使用非面向对象对象语言,实现面向对象概念,远比使用非面向对象语言方便,但是,方便性也并不是决定选择何种语言语言方便,但是,方

4、便性也并不是决定选择何种语言的关键因素。选择编程语言的关键因素,是语言的一的关键因素。选择编程语言的关键因素,是语言的一致的表达能力、可重用性及可维护性。从面向对象观致的表达能力、可重用性及可维护性。从面向对象观点看来,能够更完整、更准确地表达问题域语义的面点看来,能够更完整、更准确地表达问题域语义的面向对象语言的语法是非常重要的,因为这会带来下述向对象语言的语法是非常重要的,因为这会带来下述几个重要优点:几个重要优点:第四页,本课件共有58页1.一致的表示方法一致的表示方法面向对象开发基于不随时间变化的、一致的表示方法。这面向对象开发基于不随时间变化的、一致的表示方法。这种表示方法应该从问题

5、域到种表示方法应该从问题域到OOA,从,从OOA到到OOD,最后,最后从从OOD到面向对象编程到面向对象编程(OOP),始终稳定不变。一致的,始终稳定不变。一致的表示方法既有利于在软件开发过程中始终使用统一的概表示方法既有利于在软件开发过程中始终使用统一的概念,也有利于维护人员理解软件的各种配置成分。念,也有利于维护人员理解软件的各种配置成分。第五页,本课件共有58页2.可重用性可重用性为了能带来可观的商业利益,必须在更广泛的范围中为了能带来可观的商业利益,必须在更广泛的范围中运用重用机制,而不是仅仅在程序设计这个层次上进运用重用机制,而不是仅仅在程序设计这个层次上进行重用。因此,在行重用。因

6、此,在OOA,OOD直到直到OOP中都显式地表中都显式地表示问题域语义,其意义是十分深远的。随着时间的推移,示问题域语义,其意义是十分深远的。随着时间的推移,软件开发组织既可能重用它在某个问题域内的软件开发组织既可能重用它在某个问题域内的OOA结果,结果,也可能重用相应的也可能重用相应的OOD和和OOP结果。结果。第六页,本课件共有58页3.可维护性可维护性尽管人们反复强调保持文档与源程序一致的必要性,但是,尽管人们反复强调保持文档与源程序一致的必要性,但是,在实际工作中很难做到交付两类不同的文档,并使它们保在实际工作中很难做到交付两类不同的文档,并使它们保持彼此完全一致。特别是考虑到进度、预

7、算、能力和人员持彼此完全一致。特别是考虑到进度、预算、能力和人员等限制因素时,做到两类文档完全一致几乎是不可能的。等限制因素时,做到两类文档完全一致几乎是不可能的。因此,维护人员最终面对的往往只有源程序本身。因此,维护人员最终面对的往往只有源程序本身。第七页,本课件共有58页两大类面向对象语言。两大类面向对象语言。一类是纯面向对象语言,如一类是纯面向对象语言,如Smalltalk和和Eiffel等语言。等语言。另一类是混合型面向对象语言,也就是在过程语言的基础上另一类是混合型面向对象语言,也就是在过程语言的基础上增加面向对象机制,如增加面向对象机制,如C+等语言。等语言。一般说来,纯面向对象语

8、言着重支持面向对象方法研究和一般说来,纯面向对象语言着重支持面向对象方法研究和快速原型的实现,而混合型面向对象语言的目标则是提高快速原型的实现,而混合型面向对象语言的目标则是提高运行速度和使传统程序员容易接受面向对象思想。成熟的运行速度和使传统程序员容易接受面向对象思想。成熟的面向对象语言通常都提供丰富的类库和强有力的开发环境。面向对象语言通常都提供丰富的类库和强有力的开发环境。12.1.2 面向对象语言的技术特点面向对象语言的技术特点第八页,本课件共有58页1.支持类与对象概念的机制支持类与对象概念的机制所有面向对象语言都允许用户动态创建对象,并且可以所有面向对象语言都允许用户动态创建对象,

9、并且可以用指针引用动态创建的对象。允许动态创建对象,就意用指针引用动态创建的对象。允许动态创建对象,就意味着系统必须处理内存管理问题味着系统必须处理内存管理问题(释放内存释放内存)有两种管理内存的方法,一种是由语言的运行机制自有两种管理内存的方法,一种是由语言的运行机制自动管理内存,即提供自动回收动管理内存,即提供自动回收“垃圾垃圾”的机制;另一的机制;另一种是由程序员编写释放内存的代码。种是由程序员编写释放内存的代码。第九页,本课件共有58页2.实现整体实现整体-部分部分(即聚集即聚集)结构的机制结构的机制一般说来,有两种实现方法,分别使用指针和独立的一般说来,有两种实现方法,分别使用指针和

10、独立的关联对象实现整体关联对象实现整体-部分结构。大多数现有的面向对象部分结构。大多数现有的面向对象语言并不显式支持独立的关联对象,在这种情况下,语言并不显式支持独立的关联对象,在这种情况下,使用指针是最容易的实现方法,通过增加内部指针可使用指针是最容易的实现方法,通过增加内部指针可以方便地实现关联。以方便地实现关联。第十页,本课件共有58页3.实现一般实现一般-特殊特殊(即泛化即泛化)结构的机制结构的机制既包括实现继承的机制也包括解决名字冲突的机制。既包括实现继承的机制也包括解决名字冲突的机制。所谓解决名字冲突,指的是处理在多个基类中可能出所谓解决名字冲突,指的是处理在多个基类中可能出现的重

11、名问题,这个问题仅在支持多重继承的语言中现的重名问题,这个问题仅在支持多重继承的语言中才会遇到。某些语言拒绝接受有名字冲突的程序,另才会遇到。某些语言拒绝接受有名字冲突的程序,另一些语言提供了解决冲突的协议。不论使用何种语言,一些语言提供了解决冲突的协议。不论使用何种语言,程序员都应该尽力避免出现名字冲突。程序员都应该尽力避免出现名字冲突。第十一页,本课件共有58页4.实现属性和服务的机制实现属性和服务的机制对于实现属性的机制应该着重考虑以下几个方面:对于实现属性的机制应该着重考虑以下几个方面:支持支持实例连接的机制;属性的可见性控制;对属性值的约束。实例连接的机制;属性的可见性控制;对属性值

12、的约束。对于服务来说,主要应该考虑下列因素:对于服务来说,主要应该考虑下列因素:支持消息连接支持消息连接(即表达对象交互关系即表达对象交互关系)的机制;控制服务可见性的机制;的机制;控制服务可见性的机制;动态联编。动态联编。所谓动态联编,是指应用系统在运行过程中,当需要执所谓动态联编,是指应用系统在运行过程中,当需要执行一个特定服务的时候,选择行一个特定服务的时候,选择(或联编或联编)实现该服务的适实现该服务的适当算法的能力。动态联编机制使得程序员在向对象发当算法的能力。动态联编机制使得程序员在向对象发送消息时拥有较大自由,在发送消息前,无须知道接送消息时拥有较大自由,在发送消息前,无须知道接

13、受消息的对象当时属于哪个类。受消息的对象当时属于哪个类。第十二页,本课件共有58页5.类型检查类型检查程序设计语言可以按照编译时进行类型检查的严格程程序设计语言可以按照编译时进行类型检查的严格程度来分类。如果语言仅要求每个变量或属性隶属于一度来分类。如果语言仅要求每个变量或属性隶属于一个对象,则是弱类型的;如果语法规定每个变量或属个对象,则是弱类型的;如果语法规定每个变量或属性必须准确地属于某个特定的类,则这样的语言是强性必须准确地属于某个特定的类,则这样的语言是强类型的。面向对象语言在这方面差异很大,例如,类型的。面向对象语言在这方面差异很大,例如,Smalltalk实际上是一种无类型语言实

14、际上是一种无类型语言(所有变量都是未指定所有变量都是未指定类的对象类的对象);C+和和Eiffel则是强类型语言。混合型语言则是强类型语言。混合型语言(如如C+,Objective_C等等)甚至允许属性值不是对象而甚至允许属性值不是对象而是某种预定义的基本类型数据是某种预定义的基本类型数据(如整数,浮点数等如整数,浮点数等),这可以提高操作的效率。这可以提高操作的效率。第十三页,本课件共有58页强类型语言主要有两个优点:强类型语言主要有两个优点:一是有利于在编译时发现程一是有利于在编译时发现程序错误,二是增加了优化的可能性。通常使用强类型编译序错误,二是增加了优化的可能性。通常使用强类型编译型

15、语言开发软件产品,使用弱类型解释型语言快速开发原型语言开发软件产品,使用弱类型解释型语言快速开发原型。总的说来,强类型语言有助于提高软件的可靠性和运型。总的说来,强类型语言有助于提高软件的可靠性和运行效率,现代的程序语言理论支持强类型检查,大多数新行效率,现代的程序语言理论支持强类型检查,大多数新语言都是强类型的。语言都是强类型的。6.类库类库大多数面向对象语言都提供一个实用的类库。某些语言本大多数面向对象语言都提供一个实用的类库。某些语言本身并没有规定提供什么样的类库,而是由实现这种语言的身并没有规定提供什么样的类库,而是由实现这种语言的编译系统自行提供类库。存在类库,许多软构件就不必由编译

16、系统自行提供类库。存在类库,许多软构件就不必由程序员重头编写了,这为实现软件重用带来很大方便。程序员重头编写了,这为实现软件重用带来很大方便。第十四页,本课件共有58页类库中往往包含实现通用数据结构类库中往往包含实现通用数据结构(例如,动态数组、例如,动态数组、表、队列、栈、树等等表、队列、栈、树等等)的类,通常把这些类称为包容类。的类,通常把这些类称为包容类。在类库中还可以找到实现各种关联的类。在类库中还可以找到实现各种关联的类。更完整的类库通常还提供独立于具体设备的接口类更完整的类库通常还提供独立于具体设备的接口类(例如,例如,输入输出流输入输出流),此外,用于实现窗口系统的用户界面类也非

17、,此外,用于实现窗口系统的用户界面类也非常有用,它们构成一个相对独立的图形库。常有用,它们构成一个相对独立的图形库。第十五页,本课件共有58页7.效率效率许多人认为面向对象语言的主要缺点是效率低。产生这种许多人认为面向对象语言的主要缺点是效率低。产生这种印象的一个原因是,某些早期的面向对象语言是解释型的印象的一个原因是,某些早期的面向对象语言是解释型的而不是编译型的。事实上,使用拥有完整类库的面向对象而不是编译型的。事实上,使用拥有完整类库的面向对象语言,有时能比使用非面向对象语言得到运行更快的代码。语言,有时能比使用非面向对象语言得到运行更快的代码。这是因为类库中提供了更高效的算法和更好的数

18、据结构,这是因为类库中提供了更高效的算法和更好的数据结构,例如,程序员已经无须编写实现哈希表或平衡树算法的代例如,程序员已经无须编写实现哈希表或平衡树算法的代码了,类库中已经提供了这类数据结构,而且算法先进、码了,类库中已经提供了这类数据结构,而且算法先进、代码精巧可靠。代码精巧可靠。第十六页,本课件共有58页 认为面向对象语言效率低的另一个理由是,这种语认为面向对象语言效率低的另一个理由是,这种语言在运行时使用动态联编实现多态性,这似乎需要在言在运行时使用动态联编实现多态性,这似乎需要在运行时查找继承树,以得到定义给定操作的类。事实运行时查找继承树,以得到定义给定操作的类。事实上,绝大多数面

19、向对象语言都优化了这个查找过程,上,绝大多数面向对象语言都优化了这个查找过程,从而实现了高效率查找。只要在程序运行时始终保持从而实现了高效率查找。只要在程序运行时始终保持类结构不变,就能在子类中存储各个操作的正确入口类结构不变,就能在子类中存储各个操作的正确入口点,从而使得动态联编成为查找哈希表的高效过程,点,从而使得动态联编成为查找哈希表的高效过程,不会由于继承树深度加大或类中定义的操作数增加而不会由于继承树深度加大或类中定义的操作数增加而降低效率。降低效率。第十七页,本课件共有58页8.持久保存对象持久保存对象任何应用程序都对数据进行处理,如果希望数据能够任何应用程序都对数据进行处理,如果

20、希望数据能够不依赖于程序执行的生命期而长时间保存下来,则需不依赖于程序执行的生命期而长时间保存下来,则需要提供某种保存数据的方法。希望长期保存数据主要要提供某种保存数据的方法。希望长期保存数据主要出于以下两个原因:出于以下两个原因:(1)为实现在不同程序之间传递数据,需要保存数据;为实现在不同程序之间传递数据,需要保存数据;(2)为恢复被中断了的程序的运行,首先需要保存数据。为恢复被中断了的程序的运行,首先需要保存数据。一些面向对象语言,没有提供直接存储对象的机制。这些一些面向对象语言,没有提供直接存储对象的机制。这些语言的用户必须自己管理对象的输入输出,或者购买面向语言的用户必须自己管理对象

21、的输入输出,或者购买面向对象的数据库管理系统。对象的数据库管理系统。第十八页,本课件共有58页另外一些面向对象语言另外一些面向对象语言(例如,例如,Smalltalk),把当前的执,把当前的执行状态完整地保存在磁盘上。还有一些面向对象语言,行状态完整地保存在磁盘上。还有一些面向对象语言,提供了访问磁盘对象的输入输出操作。提供了访问磁盘对象的输入输出操作。通过在类库中增加对象存储管理功能,可以在不改变语通过在类库中增加对象存储管理功能,可以在不改变语言定义或不增加关键字的情况下,就在开发环境中提供言定义或不增加关键字的情况下,就在开发环境中提供这种功能。然后,可以从这种功能。然后,可以从“可存储

22、的类可存储的类”中派生出需要中派生出需要持久保存的对象,该对象自然继承了对象存储管理功能。持久保存的对象,该对象自然继承了对象存储管理功能。这就是这就是Eiffel语言采用的策略。语言采用的策略。理想情况下,应该使程序设计语言语法与对象存储管理想情况下,应该使程序设计语言语法与对象存储管理语法实现无缝集成。理语法实现无缝集成。第十九页,本课件共有58页9.参数化类参数化类在实际的应用程序中,常常看到这样一些软件元素在实际的应用程序中,常常看到这样一些软件元素(即函数、类等软件成分即函数、类等软件成分),从它们的逻辑功能看,彼此,从它们的逻辑功能看,彼此是相同的,所不同的主要是处理的对象是相同的

23、,所不同的主要是处理的对象(数据数据)类型不同。类型不同。例如,对于一个向量例如,对于一个向量(一维数组一维数组)类来说,不论是整型向类来说,不论是整型向量,浮点型向量,还是其他任何类型的向量,针对它量,浮点型向量,还是其他任何类型的向量,针对它的数据元素所进行的基本操作都是相同的的数据元素所进行的基本操作都是相同的(例如,插入、例如,插入、删除、检索等删除、检索等),当然,不同向量的数据元素的类型是不,当然,不同向量的数据元素的类型是不同的。如果程序语言提供一种能抽象出这类共性的机制,同的。如果程序语言提供一种能抽象出这类共性的机制,则对减少冗余和提高可重用性是大有好处的。则对减少冗余和提高

24、可重用性是大有好处的。第二十页,本课件共有58页所谓参数化类,就是使用一个或多个类型去参数化一所谓参数化类,就是使用一个或多个类型去参数化一个类的机制,有了这种机制,程序员就可以先定义一个类的机制,有了这种机制,程序员就可以先定义一个参数化的类模板个参数化的类模板(即在类定义中包含以参数形式出即在类定义中包含以参数形式出现的一个或多个类型现的一个或多个类型),然后把数据类型作为参数传递进,然后把数据类型作为参数传递进来,从而把这个类模板应用在不同的应用程序中,或用在来,从而把这个类模板应用在不同的应用程序中,或用在同一应用程序的不同部分。同一应用程序的不同部分。Eiffel语言中就有参数化类,

25、语言中就有参数化类,C+语言也提供了类模板。语言也提供了类模板。第二十一页,本课件共有58页10.开发环境开发环境软件工具和软件工程环境对软件生产率有很大影响。软件工具和软件工程环境对软件生产率有很大影响。由于面向对象程序中继承关系和动态联编等引入的特由于面向对象程序中继承关系和动态联编等引入的特殊复杂性,面向对象语言所提供的软件工具或开发环殊复杂性,面向对象语言所提供的软件工具或开发环境就显得尤其重要了。至少应该包括下列一些最基本境就显得尤其重要了。至少应该包括下列一些最基本的软件工具:的软件工具:编辑程序,编译程序或解释程序,浏览编辑程序,编译程序或解释程序,浏览工具,调试器工具,调试器(

26、debugger)等。等。第二十二页,本课件共有58页编译程序或解释程序是最基本、最重要的软件工具。编译程序或解释程序是最基本、最重要的软件工具。编译与解释的差别主要是速度和效率不同。利用解释编译与解释的差别主要是速度和效率不同。利用解释程序解释执行用户的源程序,虽然速度慢、效率低,程序解释执行用户的源程序,虽然速度慢、效率低,但却可以更方便更灵活地进行调试。编译型语言适于但却可以更方便更灵活地进行调试。编译型语言适于用来开发正式的软件产品,优化工作做得好的编译程用来开发正式的软件产品,优化工作做得好的编译程序能生成效率很高的目标代码。有些面向对象语言序能生成效率很高的目标代码。有些面向对象语

27、言(例例如如Objective_C)除提供编译程序外,还提供一个解释工除提供编译程序外,还提供一个解释工具,从而给用户带来很大方便。具,从而给用户带来很大方便。第二十三页,本课件共有58页某些面向对象语言的编译程序,先把用户源程序翻译成某些面向对象语言的编译程序,先把用户源程序翻译成一种中间语言程序,然后再把中间语言程序翻译成目标一种中间语言程序,然后再把中间语言程序翻译成目标代码。这样做可能会使得调试器不能理解原始的源程序。代码。这样做可能会使得调试器不能理解原始的源程序。在评价调试器时,首先应该弄清楚它是针对原始的面向在评价调试器时,首先应该弄清楚它是针对原始的面向对象源程序,还是针对中间

28、代码进行调试。如果是针对对象源程序,还是针对中间代码进行调试。如果是针对中间代码进行调试,则会给调试人员带来许多不便。此中间代码进行调试,则会给调试人员带来许多不便。此外,面向对象的调试器,应该能够查看属性值和分析消外,面向对象的调试器,应该能够查看属性值和分析消息连接的后果。息连接的后果。第二十四页,本课件共有58页在开发大型系统的时候,需要有系统构造工具和变动控在开发大型系统的时候,需要有系统构造工具和变动控制工具。因此应该考虑语言本身是否提供了这种工具,制工具。因此应该考虑语言本身是否提供了这种工具,或者该语言能否与现有的这类工具很好地集成起来。经或者该语言能否与现有的这类工具很好地集成

29、起来。经验表明,传统的系统构造工具验表明,传统的系统构造工具(例如,例如,UNIX的的Make)目前目前对许多应用系统来说都已经太原始了。对许多应用系统来说都已经太原始了。第二十五页,本课件共有58页开发人员在选择面向对象语言时,还应该着重考虑以开发人员在选择面向对象语言时,还应该着重考虑以下一些实际因素。下一些实际因素。1.将来能否占主导地位将来能否占主导地位在若干年以后,哪种面向对象的程序设计语言将占主在若干年以后,哪种面向对象的程序设计语言将占主导地位呢导地位呢?为了使自己的产品在若干年后仍然具有很为了使自己的产品在若干年后仍然具有很强的生命力,人们可能希望采用将来占主导地位的语强的生命

30、力,人们可能希望采用将来占主导地位的语言编程。言编程。12.1.3 选择面向对象语言选择面向对象语言第二十六页,本课件共有58页根据目前占有的市场份额,以及专业书刊和学术会议上根据目前占有的市场份额,以及专业书刊和学术会议上所做的分析、评价,人们往往能够对未来哪种面向对象所做的分析、评价,人们往往能够对未来哪种面向对象语言将占据主导地位做出预测。语言将占据主导地位做出预测。但是,最终决定选用哪种面向对象语言的实际因素,但是,最终决定选用哪种面向对象语言的实际因素,往往是诸如成本之类的经济因素而不是技术因素。往往是诸如成本之类的经济因素而不是技术因素。2.可重用性可重用性采用面向对象方法开发软件

31、的基本目的和主要优点,是采用面向对象方法开发软件的基本目的和主要优点,是通过重用提高软件生产率。因此,应该优先选用能够最通过重用提高软件生产率。因此,应该优先选用能够最完整、最准确地表达问题域语义的面向对象语言。完整、最准确地表达问题域语义的面向对象语言。第二十七页,本课件共有58页3.类库和开发环境类库和开发环境决定可重用性的因素,不仅仅是面向对象程序语言本身,决定可重用性的因素,不仅仅是面向对象程序语言本身,开发环境和类库也是非常重要的因素。事实上,语言、开发环境和类库也是非常重要的因素。事实上,语言、开发环境和类库这开发环境和类库这3个因素综合起来,共同决定了可重用个因素综合起来,共同决

32、定了可重用性。性。考虑类库的时候,不仅应该考虑是否提供了类库,还应考虑类库的时候,不仅应该考虑是否提供了类库,还应该考虑类库中提供了哪些有价值的类。随着类库的日益该考虑类库中提供了哪些有价值的类。随着类库的日益成熟和丰富,在开发新应用系统时,需要开发人员自己成熟和丰富,在开发新应用系统时,需要开发人员自己编写的代码将越来越少。编写的代码将越来越少。第二十八页,本课件共有58页为便于积累可重用的类和重用已有的类,在开发环境为便于积累可重用的类和重用已有的类,在开发环境中,除了提供前述的基本软件工具外,还应该提供使中,除了提供前述的基本软件工具外,还应该提供使用方便的类库编辑工具和浏览工具。其中的

33、类库浏览用方便的类库编辑工具和浏览工具。其中的类库浏览工具应该具有强大的联想功能。工具应该具有强大的联想功能。4.其他因素其他因素在选择编程语言时,应该考虑的其他因素还有:在选择编程语言时,应该考虑的其他因素还有:对用户对用户学习面向对象分析、设计和编码技术所能提供的培训服学习面向对象分析、设计和编码技术所能提供的培训服务;在使用这个面向对象语言期间能提供的技术支持;务;在使用这个面向对象语言期间能提供的技术支持;能提供给开发人员使用的开发工具、开发平台、发行平能提供给开发人员使用的开发工具、开发平台、发行平台;对机器性能和内存的需求;集成已有软件的容易程台;对机器性能和内存的需求;集成已有软

34、件的容易程度等。度等。第二十九页,本课件共有58页 第第7章已经强调指出,良好的程序设计风格对保证程序章已经强调指出,良好的程序设计风格对保证程序质量的重要性。良好的程序设计风格对面向对象实现来说质量的重要性。良好的程序设计风格对面向对象实现来说尤其重要,不仅能明显减少维护或扩充的开销,而且有助尤其重要,不仅能明显减少维护或扩充的开销,而且有助于在新项目中重用已有的程序代码。于在新项目中重用已有的程序代码。良好的面向对象程序设计风格,既包括传统的程序设计良好的面向对象程序设计风格,既包括传统的程序设计风格准则,也包括为适应面向对象方法所特有的概念风格准则,也包括为适应面向对象方法所特有的概念(

35、例如,例如,继承性继承性)而必须遵循的一些新准则。而必须遵循的一些新准则。12.2 程序设计风格程序设计风格第三十页,本课件共有58页面向对象方法的一个主要目标,就是提高软件的可重面向对象方法的一个主要目标,就是提高软件的可重用性。软件重用有多个层次,在编码阶段主要涉及代用性。软件重用有多个层次,在编码阶段主要涉及代码重用问题。一般说来,代码重用有两种:码重用问题。一般说来,代码重用有两种:一种是本一种是本项目内的代码重用,另一种是新项目重用旧项目的代项目内的代码重用,另一种是新项目重用旧项目的代码。内部重用主要是找出设计中相同或相似的部分,码。内部重用主要是找出设计中相同或相似的部分,然后利

36、用继承机制共享它们。为做到外部重用,则必然后利用继承机制共享它们。为做到外部重用,则必须有长远眼光,需要反复考虑精心设计。虽然为实现须有长远眼光,需要反复考虑精心设计。虽然为实现外部重用而需要考虑的面,比为实现内部重用而需要外部重用而需要考虑的面,比为实现内部重用而需要考虑的面更广,但是,有助于实现这两类重用的程序考虑的面更广,但是,有助于实现这两类重用的程序设计准则却是相同的。下面讲述主要的准则:设计准则却是相同的。下面讲述主要的准则:12.2.1 提高可重用性提高可重用性第三十一页,本课件共有58页1.提高方法的内聚提高方法的内聚一个方法一个方法(即服务即服务)应该只完成单个功能。如果某个

37、方法涉应该只完成单个功能。如果某个方法涉及两个或多个不相关的功能,则应该把它分解成几个更小及两个或多个不相关的功能,则应该把它分解成几个更小的方法。的方法。2.减小方法的规模减小方法的规模应该减小方法的规模,如果某个方法规模过大应该减小方法的规模,如果某个方法规模过大(代码长度代码长度超过一页纸可能就太大了超过一页纸可能就太大了),则应该把它分解成几个更小,则应该把它分解成几个更小的方法。的方法。第三十二页,本课件共有58页3.保持方法的一致性保持方法的一致性保持方法的一致性,有助于实现代码重用。一般说来,保持方法的一致性,有助于实现代码重用。一般说来,功能相似的方法应该有一致的名字、参数特征

38、功能相似的方法应该有一致的名字、参数特征(包括参包括参数个数、类型和次序数个数、类型和次序)、返回值类型、使用条件及出错条件、返回值类型、使用条件及出错条件等。等。4.把策略与实现分开把策略与实现分开从所完成的功能看,有两种不同类型的方法。一类方从所完成的功能看,有两种不同类型的方法。一类方法负责做出决策,提供变元,并且管理全局资源,可法负责做出决策,提供变元,并且管理全局资源,可称为策略方法。另一类方法负责完成具体的操作,但称为策略方法。另一类方法负责完成具体的操作,但却并不做出是否执行这个操作的决定,也不知道为什却并不做出是否执行这个操作的决定,也不知道为什么执行这个操作,可称为实现方法。

39、么执行这个操作,可称为实现方法。第三十三页,本课件共有58页策略方法应该检查系统运行状态,并处理出错情况,策略方法应该检查系统运行状态,并处理出错情况,它们并不直接完成计算或实现复杂的算法。策略方法它们并不直接完成计算或实现复杂的算法。策略方法通常紧密依赖于具体应用,这类方法比较容易编写,通常紧密依赖于具体应用,这类方法比较容易编写,也比较容易理解。也比较容易理解。实现方法仅仅针对具体数据完成特定处理,通常用于实现实现方法仅仅针对具体数据完成特定处理,通常用于实现复杂的算法。实现方法并不制定决策,也不管理全局资源,复杂的算法。实现方法并不制定决策,也不管理全局资源,如果在执行过程中发现错误,它

40、们应该只返回执行状态而如果在执行过程中发现错误,它们应该只返回执行状态而不对错误采取行动。由于实现方法是自含式算法,相对独不对错误采取行动。由于实现方法是自含式算法,相对独立于具体应用,因此,在其他应用系统中也可能重用它们。立于具体应用,因此,在其他应用系统中也可能重用它们。第三十四页,本课件共有58页为提高可重用性,在编程时不要把策略和实现放在同一个为提高可重用性,在编程时不要把策略和实现放在同一个方法中,应该把算法的核心部分放在一个单独的具体实现方法中,应该把算法的核心部分放在一个单独的具体实现方法中。为此需要从策略方法中提取出具体参数,作为调方法中。为此需要从策略方法中提取出具体参数,作

41、为调用实现方法的变元。用实现方法的变元。5.全面覆盖全面覆盖如果输入条件的各种组合都可能出现,则应该针对所有组如果输入条件的各种组合都可能出现,则应该针对所有组合写出方法,而不能仅仅针对当前用到的组合情况写方法。合写出方法,而不能仅仅针对当前用到的组合情况写方法。例如,如果在当前应用中需要写一个方法,以获取表中第例如,如果在当前应用中需要写一个方法,以获取表中第一个元素,则至少还应该为获取表中最后一个元素再写一一个元素,则至少还应该为获取表中最后一个元素再写一个方法。个方法。第三十五页,本课件共有58页此外,一个方法不应该只能处理正常值,对空值、极此外,一个方法不应该只能处理正常值,对空值、极

42、限值及界外值等异常情况也应该能够作出有意义的响限值及界外值等异常情况也应该能够作出有意义的响应。应。6.尽量不使用全局信息尽量不使用全局信息应该尽量降低方法与外界的耦合程度,不使用全局信息应该尽量降低方法与外界的耦合程度,不使用全局信息是降低耦合度的一项主要措施。是降低耦合度的一项主要措施。第三十六页,本课件共有58页7.利用继承机制利用继承机制在面向对象程序中,使用继承机制是实现共享和提高在面向对象程序中,使用继承机制是实现共享和提高重用程度的主要途径。重用程度的主要途径。(1)调用子过程。最简单的做法是把公共的代码分离出来,调用子过程。最简单的做法是把公共的代码分离出来,构成一个被其他方法

43、调用的公用方法。可以在基类中定义构成一个被其他方法调用的公用方法。可以在基类中定义这个公用方法,供派生类中的方法调用,如图这个公用方法,供派生类中的方法调用,如图12.1所示。所示。第三十七页,本课件共有58页图图12.1 通过调用公用方法实现代码重用通过调用公用方法实现代码重用第三十八页,本课件共有58页(2)分解因子。有时提高相似类代码可重用性的一个分解因子。有时提高相似类代码可重用性的一个有效途径,是从不同类的相似方法中分解出不同的有效途径,是从不同类的相似方法中分解出不同的“因子因子”(即不同的代码即不同的代码),把余下的代码作为公用方法中,把余下的代码作为公用方法中的公共代码,把分解

44、出的因子作为名字相同算法不同的的公共代码,把分解出的因子作为名字相同算法不同的方法,放在不同类中定义,并被这个公用方法调用,如方法,放在不同类中定义,并被这个公用方法调用,如图图12.2所示。使用这种途径通常额外定义一个抽象基类,所示。使用这种途径通常额外定义一个抽象基类,并在这个抽象基类中定义公用方法。把这种途径与面并在这个抽象基类中定义公用方法。把这种途径与面向对象语言提供的多态性机制结合起来,让派生类继向对象语言提供的多态性机制结合起来,让派生类继承抽象基类中定义的公用方法,可以明显降低为增添承抽象基类中定义的公用方法,可以明显降低为增添新子类而需付出的工作量,因为只需在新子类中编写新子

45、类而需付出的工作量,因为只需在新子类中编写其特有的代码。其特有的代码。第三十九页,本课件共有58页图图12.2 通过因子分解实现代码重用通过因子分解实现代码重用第四十页,本课件共有58页(3)使用委托。继承关系的存在意味着子类使用委托。继承关系的存在意味着子类“即是即是”父类,因此,父类的所有方法和属性应该都适用于子父类,因此,父类的所有方法和属性应该都适用于子类。仅当确实存在一般类。仅当确实存在一般-特殊关系时,使用继承才是恰特殊关系时,使用继承才是恰当的。继承机制使用不当将造成程序难于理解、修改当的。继承机制使用不当将造成程序难于理解、修改和扩充。和扩充。当逻辑上不存在一般当逻辑上不存在一

46、般-特殊关系时,为重用已有的代特殊关系时,为重用已有的代码,可以利用委托机制,如本书码,可以利用委托机制,如本书11.11.3小节所述。小节所述。第四十一页,本课件共有58页(4)把代码封装在类中。程序员往往希望重用用其他方法编把代码封装在类中。程序员往往希望重用用其他方法编写的、解决同一类应用问题的程序代码。重用这类代码的写的、解决同一类应用问题的程序代码。重用这类代码的一个比较安全的途径,是把被重用的代码封装在类中。一个比较安全的途径,是把被重用的代码封装在类中。例如,在开发一个数学分析应用系统的过程中,已知有现例如,在开发一个数学分析应用系统的过程中,已知有现成的实现矩阵变换的商品软件包

47、,程序员不想用成的实现矩阵变换的商品软件包,程序员不想用C+语言语言重写这个算法,于是他定义一个矩阵类把这个商品软重写这个算法,于是他定义一个矩阵类把这个商品软件包的功能封装在该类中。件包的功能封装在该类中。第四十二页,本课件共有58页上一小节所述的提高可重用性的准则,也能提高程序的上一小节所述的提高可重用性的准则,也能提高程序的可扩充性。此外,下列的面向对象程序设计准则也有助可扩充性。此外,下列的面向对象程序设计准则也有助于提高可扩充性:于提高可扩充性:1.封装实现策略封装实现策略应该把类的实现策略应该把类的实现策略(包括描述属性的数据结构、修改属包括描述属性的数据结构、修改属性的算法等性的

48、算法等)封装起来,对外只提供公有的接口,否则将封装起来,对外只提供公有的接口,否则将降低今后修改数据结构或算法的自由度。降低今后修改数据结构或算法的自由度。12.2.2 提高可扩充性提高可扩充性第四十三页,本课件共有58页2.不要用一个方法遍历多条关联链不要用一个方法遍历多条关联链一个方法应该只包含对象模型中的有限内容。违反这一个方法应该只包含对象模型中的有限内容。违反这条准则将导致方法过分复杂,既不易理解,也不易修条准则将导致方法过分复杂,既不易理解,也不易修改扩充。改扩充。3.避免使用多分支语句避免使用多分支语句一般说来,可以利用一般说来,可以利用DO_CASE语句测试对象的内部状语句测试

49、对象的内部状态,而不要用来根据对象类型选择应有的行为,否则态,而不要用来根据对象类型选择应有的行为,否则在增添新类时将不得不修改原有的代码。应该合理地在增添新类时将不得不修改原有的代码。应该合理地利用多态性机制,根据对象当前类型,自动决定应有利用多态性机制,根据对象当前类型,自动决定应有的行为。的行为。第四十四页,本课件共有58页4.精心确定公有方法精心确定公有方法公有方法是向公众公布的接口。对这类方法的修改往往会公有方法是向公众公布的接口。对这类方法的修改往往会涉及许多其他类,因此,修改公有方法的代价通常都比较涉及许多其他类,因此,修改公有方法的代价通常都比较高。为提高可修改性,降低维护成本

50、,必须精心选择和定高。为提高可修改性,降低维护成本,必须精心选择和定义公有方法。私有方法是仅在类内使用的方法,通常利用义公有方法。私有方法是仅在类内使用的方法,通常利用私有方法来实现公有方法。删除、增加或修改私有方法所私有方法来实现公有方法。删除、增加或修改私有方法所涉及的面要窄得多,因此代价也比较低。涉及的面要窄得多,因此代价也比较低。第四十五页,本课件共有58页程序员在编写实现方法的代码时,既应该考虑效率,也应程序员在编写实现方法的代码时,既应该考虑效率,也应该考虑健壮性。通常需要在健壮性与效率之间做出适当的该考虑健壮性。通常需要在健壮性与效率之间做出适当的折衷。必须认识到,对于任何一个实

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 资格考试

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com