已阅读5页,还剩32页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章 面向对象程序设计方法,面向对象方法与结构化方法,结构化程序设计方法的主要技术是自顶向下,逐步求精,采用单入口/单出口的控制结构。 面向对象程序设计建立在结构化程序设计基础上,最重要的改变是程序围绕被操作的数据来设计,而不是围绕操作本身。 结构化程序设计方法在解决中等复杂问题时表现了卓越的性能,但随着程序规模与复杂度的增加及软件行业的产业化,程序中数据结构与这些数据的操作同样重要,面向对象的程序设计方法逐渐展示其生命力,成为人们普遍看好的软件问题解决方案。 面向对象程序设计与结构化程序设计是解决问题两种不同的思维方式,在程序设计技术迅速发展的今天,两种方法和语言都必须掌握。,面向对象程序设计方法学主要内容,为什么需要面向对象 面向对象程序设计方法的基本概念 面向对象程序设计方法的起源 面向对象计算的基本原理 面向对象程序设计的基本原则 面向对象程序设计的一般方法 应用框架 设计模式,3.1为什么需要面向对象,实践中人们认识到重用已有开发结果的重要性,提出了软件重用的概念。 重用中有一种常见情况:软件开发中遇到的新问题常常与解决过的问题(重用库提供的功能)类似,但又不完全相同。 已有模块的功能与需要有差异,就不能以其“现有”形式直接使用。 模块功能的修改只能通过修改源代码的方式进行,程序员就只能拷贝这个模块的源代码,深入研究后设法修改之。,3.1为什么需要面向对象,面向对象的方法和程序技术,为基于模块(一个类也可以看作一个模块)的重用问题提供了一条解决途径。 面向对象技术的最重要能力,是使程序员比较容易以外部附加的方式,在原有抽象的基础上定义新的数据抽象。 容易定义一些操作的框架,使新的数据抽象可以使用这些框架,并把针对该类抽象的实例的具体操作插入框架中(重用和调整)。,3.2基本概念,封装(encapsulation) 信息/实现的隐藏(information/implementation hiding) 对象标识(object identity) 消息(message) 类(class) 继承(inheritance) 多态性(polymorphism) 接口(interface),3.2基本概念,封装,将属性和操作包装成一个单元,使得对状态的访问和修改只能通过封装提供的接口进行。 信息/实现的隐藏,将某些属性或方法限制在封装内部使用,限制外部的可见性。 对象标识,每个对象可以作为软件实体被标识和处理,每个对象都有一个对象标识符(object identifier, OID)。 消息,对象间发送请求的载体。 接口,一组没有公共代码的对象共享实现。,类,类是对象的类型(模板),对象是类的实例。 继承,子类隐式使用超类(或父类)的属性和操作。 多态性,子类覆盖(overriding)父类的方法。 它和重载(overloading)的区别在于重载是在同一对象层次中,利用参数的不同来进行动态绑定(dynamic binding)。,3.3面向对象程序设计方法的起源,1.符号抽象 Backus1957 的Fortran实现使用了人们习惯的符号记法,而且确保了编译后的运行效率。 2.过程抽象 C语言的发展使函数概念得到了普及和大规模应用。一些相对完整的功能代码被封装在一个函数里面实现。 3.信息隐藏和抽象数据类型 Wirth1980的Modula-2语言实现了模块,不降低运行效率的情况下实现了信息隐藏和抽象数据类型。,3.3面向对象程序设计方法的起源,4.类型抽象 挪威计算中心的Kristen Nygaard和Ole-Johan Dahl开发了Simula67语言; 70年代中期,Xerox Palo Alto研究中心开发了Smalltalk语言; 这些语言用类、对象、重载、动态绑定技术实现了抽象数据类型,但是其运行效率不能让人满意,其抽象类型概念也不能让人接受,直到C和C+,3.4面向对象计算的基本原理,面向对象的抽象原理 数据抽象原理 数据抽象提供了面向对象方法的始点,其核心就是实现了模块化与信息隐藏,同时它也是面向对象方法学的基础。 行为共享原理 行为共享是指许多实体具有相同的接口,将不同实体的相同操作定义为抽象的操作,从而给用户带来方便。,面向对象的抽象原理,进化原理 进化包括两种含义: 一是指系统随需求变化而修改和增加的情况; 二是指对复杂问题的增量式的求解过程。 进化建议面向对象对修改封闭,对增加开放。 正确性原理 正确性的问题主要是由行为共享所导致的,当一个实体请求另外一个实体的某种行为时候,系统必须确保能够在共享的行为组中找到正确的行为实现并运行它 。,面向对象计算的基本原理,面向对象计算模型是指对上述面向对象抽象原理的具体实现技术,大部分面向对象语言使用如下三类技术: 1.封装 封装实现了数据抽象技术 2.分类 分类是实现行为共享的基础 A 集合 B 抽象数据类型 C 类,面向对象计算的基本原理,3.共享 共享技术用于实现行为共享和进化原理。在面向对象语言系统中,共享又统称为多态性。 多态性表明一个对象可以属于多于一个的分类,这样,就有可能让两个不同的分类共享相同的行为。,强制多态预先规定了语言中各种类型之间的映射关系,是一种隐式做类型转换的方法。(类型强制转换) 例如:2.0 + 2.0、2.0 + 2、2.0 + “2“ 重载允许一个函数名使用多次,每次带有不同的参数,例如print(PrintWriter)和print(FileWriter),同样的命名使得程序容易设计和理解。 强制和重载合起来被称为特定的多态性,因为两者都用于特定的目的,还有两种多态用于比特定多态更加基础的形式。,多态性,参数化多态性 所谓参数化多态性,是指将一段程序所处理的对象的类型参数化,这样,这段程序就可以处理某个类型范围之内的各种类型的对象,这些类型呈现某种共同的结构。,多态性,包含多态性 是一种强调分类之间关系的程序设计风格,一种分类可以替代一种分类,分类之间不再孤立,分类之间体现了继承关系 。 通常期望面向对象的语言应该具有包含多态性的特征,因为它是一种很好的实现自底向上的设计工具。 另外一种观点则认为目前对继承关系的滥用破坏了面向对象思想的优秀性,应该在面向对象程序中放弃继承,通过其它的方式实现行为共享原理。,多态性,3.5一些面向对象的设计原则,1.开闭原则(OCP) 2.里氏代换原则(LSP) 3.依赖倒转原则(DIP) 4.接口隔离原则(ISP) 5.合成聚合复用原则(CARP) 6.迪米特法则(LoD) 7.单责任原则(SRP),1 开闭原则(OCP),开闭原则是面向对象程序设计的第一原则,这个原则最早由Bertrand Meyer提出。 内容:“Software entities should be open for extension,but closed for modification”,即一个软件实体应该对扩展开放,对修改关闭。 含义是:当一个软件需要增加或者修改某些功能的时候,应该尽可能的只是在原来的实体中增加代码,而不是修改代码。 作用:开闭原则保证了系统具有一定的稳定性,同时保证了系统的灵活性。 开闭原则的另外一个叫法称为“对可变性的封装原则”。,1 开闭原则(OCP),计算部件数组中各个部件价格的总和。,若财务部颁布主板和内存应使用额外费用,则需修改如下:,1 开闭原则(OCP),1 开闭原则(OCP),较好的一种设计方式是:将计价策略合并到Part的getPrice()方法中。Part和ConcretePart类的示例如下:,2 里氏代换原则(LSP),里氏代换原则最早由Barbara Liskov提出:“基类出现的地方,子类一定可以出现”,也就是对基类是合法的操作,对子类也一定合法。 正方形是否是长方形的子类?,里氏代换原则(LSP),public class Rectangle long width; long height; public void setWidth(long width) this.width = width; public long getWidth() return width; public void setHeight(long height) this.height = height; public long getHeight() return height; ,长方形类,里氏代换原则 (LSP),public class Square extends Rectangle public void setWidth(long width) this.width = width; this.height = width; public long getWidth() return width; public void setHeight(long height) this.width = height; this.height = height; public long getHeight() return height; ,正方形类,一个Rectangle对象的合法操作,对Square却非法! public void resize(Rectangle r) while(r.getHeight()=r.getWidth() r.setHeight(r.getHeight()+1); ,2 里氏代换原则(LSP),一个数学意义上的正方形是一个四边形,但是一个Square对象不是一个Rectangle对象,因为一个Square对象的行为与一个Rectangle对象的行为是不一致的!,3 依赖倒转原则(DIP),依赖倒转原则要求用户尽量依赖于抽象而不是实现。 传统的过程式的程序设计方法倾向于使得高层次的模块依赖于低层次的模块,DIP原则把这个依赖关系倒转过来。 一般而言,高抽象层次包含的是应用系统的商务逻辑和宏观的控制过程,而低层次模块包含一些具体的算法。低层次代码经常会变动,高层次则相对稳定一些。为了更有效的保持系统的稳定性,应该使得低层次的模块依赖于高层次模块。,3 依赖倒转原则(DIP),从复用的角度来看,只有实现依赖倒转原则,才会避免当低层次模块发生改变的时候不会导致高层次模块的修改。,例如: Vector vec = new Vector( ); List list = new Vector( ); 后一行代码较前一行代码 具有更高的可维护性。,4 接口隔离原则(ISP),尽量使用多个小而专用的接口而不是单一的接口,5 合成聚合复用原则(CARP),优先使用合成和聚合,而不是继承来达到复用的目的。聚合: 表示拥有或整体与部分的关系。合成:更强的聚合关系。 继承复用有如下的优点和缺点: 1)容易实现。 2)继承复用破坏了封装,将超类的实现细节暴露给子类。 3)如果超类发生改变,子类也不得不跟着改变。 4)继承是静态的。 合成/聚合是将已有对象作为自己的成员,新对象调用对象已有的功能。这有很多优点: 1) 这种复用是黑箱操作,把成员对象的细节封装起来。 2)这种复用可以动态的改变,新对象可以动态的引用其他的同类对象,6 迪米特法则(LoD),迪米特法则又称为最少知识法则,是指一个对象应当对其它对象尽可能少的了解,并尽可能少的与其他对象发生联系。这种思想是和模块化程序设计中的模块低耦合高内聚同样的道理。,public class Someone public void operation1(Friend friend) Stranger stranger = vide(); stranger.operation3(); public class Friend private Stranger stranger = new Stranger(); public void operation2() public Stranger provide() return stranger; ,Someone的方法operation1不满足迪米特法则, 因为这个方法引用了Stranger对象。,7 单责任原则(SRP),一个类应该有且仅有一个职责。 关于职责的含意,面向对象大师Robert.C Martin有一个著名的定义:所谓一个类的职责是指引起该类变化的原因。 如果一个类具有一个以上的职责,那么就会有多个不同的原因引起该类变化,其实就是耦合了多个互不相关的职责,就会降低这个类的内聚性。,面向对象技术的未来发展,面临问题 运行效率问题 类库的化简问题 类库的可靠性问题 目前的研究所涉及的领域 面向对象编程语言 面向对象设计 面向对象数据库 面向对象分析,软件重用,定义 软件重用(Software Reuse,又称软件复用或软件再用) :是利用事先建立好的软部品创建新软件系统的过程。 软件重用包括两个方面 系统地开发可重用的软部品。 系统地使用这些软部品作为构筑模块,来建立新的系统。 软件重用分类 横向重用是指重用不同应用领域中的软件元素。 纵向重用是指在一类具有较多公共性的应用领域之间进行软部品重用。 流行的软件重用技术 库函数,模板,面向对象、设计模式、组件、框架、构架,参数化多态性,C+中支持参数化多态性的工具模板 模板定义 template 声明 其中:template 是关键字。 当声明函数模板时,“声明”是一个函数声明;当声明一个类模板时,“声明”是一个类声明。 “模板参数表”是由下列形式的表项构成的一个列表 class 标识符 类型表达式 标识符 ( 中的“标识符”代表“声明”定义的类或函数所参数化的类型; 中的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年阳江市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及答案详解(历年真题)
- 朝阳市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(模拟题)
- 2026年汕尾市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(培优)
- 延边朝鲜族自治州农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及答案详解(必刷)
- 甘孜藏族自治州农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(综合题)
- 海口市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(基础题)
- 2026年三明市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及答案详解(名校卷)
- 秀山土家族苗族自治县农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(满分必刷)
- 2025年高校教师资格证之高等教育法规题库附参考答案【模拟题】
- 2025年高危孕产妇救治学习班考试题及答案
- 孝感市孝昌县2025年教师进城考试真题库及答案
- 上海市2025上海博物馆招聘21人笔试历年参考题库附带答案详解
- GB/T 46105-2025陆地生态系统碳汇核算指南
- 上海某高档KTV装修工程施工组织设计方案x
- 解放军核生化防护课件
- 医疗质量安全专项整治行动方案培训
- 工程塑料改性方案(3篇)
- 李煜《破阵子》鉴赏课件
- 保洁员用电安全培训课件
- 电工技能实训 课件 项目七 照明电路的设计与安装
- 销售主管培训基础知识课件
评论
0/150
提交评论