您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 薪酬管理 > 第3章 面向对象程序设计方法
第3章面向对象程序设计方法面向对象方法与结构化方法结构化程序设计方法的主要技术是自顶向下,逐步求精,采用单入口/单出口的控制结构。面向对象程序设计建立在结构化程序设计基础上,最重要的改变是程序围绕被操作的数据来设计,而不是围绕操作本身。结构化程序设计方法在解决中等复杂问题时表现了卓越的性能,但随着程序规模与复杂度的增加及软件行业的产业化,程序中数据结构与这些数据的操作同样重要,面向对象的程序设计方法逐渐展示其生命力,成为人们普遍看好的软件问题解决方案。面向对象程序设计与结构化程序设计是解决问题两种不同的思维方式,在程序设计技术迅速发展的今天,两种方法和语言都必须掌握。面向对象程序设计方法学主要内容1.为什么需要面向对象2.面向对象程序设计方法的基本概念3.面向对象程序设计方法的起源4.面向对象计算的基本原理5.面向对象程序设计的基本原则6.面向对象程序设计的一般方法7.应用框架8.设计模式3.1为什么需要面向对象实践中人们认识到重用已有开发结果的重要性,提出了软件重用的概念。重用中有一种常见情况:软件开发中遇到的新问题常常与解决过的问题(重用库提供的功能)类似,但又不完全相同。已有模块的功能与需要有差异,就不能以其“现有”形式直接使用。模块功能的修改只能通过修改源代码的方式进行,程序员就只能拷贝这个模块的源代码,深入研究后设法修改之。3.1为什么需要面向对象面向对象的方法和程序技术,为基于模块(一个类也可以看作一个模块)的重用问题提供了一条解决途径。面向对象技术的最重要能力,是使程序员比较容易以外部附加的方式,在原有抽象的基础上定义新的数据抽象。容易定义一些操作的框架,使新的数据抽象可以使用这些框架,并把针对该类抽象的实例的具体操作插入框架中(重用和调整)。3.2基本概念封装(encapsulation)信息/实现的隐藏(information/implementationhiding)对象标识(objectidentity)消息(message)类(class)继承(inheritance)多态性(polymorphism)接口(interface)3.2基本概念封装,将属性和操作包装成一个单元,使得对状态的访问和修改只能通过封装提供的接口进行。信息/实现的隐藏,将某些属性或方法限制在封装内部使用,限制外部的可见性。对象标识,每个对象可以作为软件实体被标识和处理,每个对象都有一个对象标识符(objectidentifier,OID)。消息,对象间发送请求的载体。接口,一组没有公共代码的对象共享实现。3.2基本概念类,类是对象的类型(模板),对象是类的实例。继承,子类隐式使用超类(或父类)的属性和操作。多态性,子类覆盖(overriding)父类的方法。它和重载(overloading)的区别在于重载是在同一对象层次中,利用参数的不同来进行动态绑定(dynamicbinding)。3.3面向对象程序设计方法的起源1.符号抽象Backus[1957]的Fortran实现使用了人们习惯的符号记法,而且确保了编译后的运行效率。2.过程抽象C语言的发展使函数概念得到了普及和大规模应用。一些相对完整的功能代码被封装在一个函数里面实现。3.信息隐藏和抽象数据类型Wirth[1980]的Modula-2语言实现了模块,不降低运行效率的情况下实现了信息隐藏和抽象数据类型。3.3面向对象程序设计方法的起源4.类型抽象挪威计算中心的KristenNygaard和Ole-JohanDahl开发了Simula67语言;70年代中期,XeroxPaloAlto研究中心开发了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)开闭原则是面向对象程序设计的第一原则,这个原则最早由BertrandMeyer提出。内容:“Softwareentitiesshouldbeopenforextension,butclosedformodification”,即一个软件实体应该对扩展开放,对修改关闭。含义是:当一个软件需要增加或者修改某些功能的时候,应该尽可能的只是在原来的实体中增加代码,而不是修改代码。作用:开闭原则保证了系统具有一定的稳定性,同时保证了系统的灵活性。开闭原则的另外一个叫法称为“对可变性的封装原则”。1开闭原则(OCP)计算部件数组中各个部件价格的总和。若财务部颁布主板和内存应使用额外费用,则需修改如下:1开闭原则(OCP)1开闭原则(OCP)较好的一种设计方式是:将计价策略合并到Part的getPrice()方法中。Part和ConcretePart类的示例如下:2里氏代换原则(LSP)里氏代换原则最早由BarbaraLiskov提出:“基类出现的地方,子类一定可以出现”,也就是对基类是合法的操作,对子类也一定合法。正方形是否是长方形的子类?里氏代换原则(LSP)publicclassRectangle{longwidth;longheight;publicvoidsetWidth(longwidth){this.width=width;}publiclonggetWidth(){returnwidth;}publicvoidsetHeight(longheight){this.height=height;}publiclonggetHeight(){returnheight;}}长方形类里氏代换原则(LSP)publicclassSquareextendsRectangle{publicvoidsetWidth(longwidth){this.width=width;this.height=width;}publiclonggetWidth(){returnwidth;}publicvoidsetHeight(longheight){this.width=height;this.height=height;}publiclonggetHeight(){returnheight;}}正方形类一个Rectangle对象的合法操作,对Square却非法!publicvoidresize(Rectangler){while(r.getHeight()=r.getWidth())r.setHeight(r.getHeight()+1);}2里氏代换原则(LSP)一个数学意义上的正方形是一个四边形,但是一个Square对象不是一个Rectangle对象,因为一个Square对象的行为与一个Rectangle对象的行为是不一致的!3依赖倒转原则(DIP)依赖倒转原则要求用户尽量依赖于抽象而不是实现。传统的过程式的程序设计方法倾向于使得高层次的模块依赖于低层次的模块,DIP原则把这个依赖关系倒转过来。一般而言,高抽象层次包含的是应用系统的商务逻辑和宏观的控制过程,而低层次模块包含一些具体的算法。低层次代码经常会变动,高层次则相对稳定一些。为了更有效的保持系统的稳定性,应该使得低层次的模块依赖于高层次模块。3依赖倒转原则(DIP)从复用的角度来看,只有实现依赖倒转原则,才会避免当低层次模块发生改变的时候不会导致高层次模块的修改。例如:Vectorvec=newVector();Listlist=newVector();后一行代码较前一行代码具有更高的可维护性。4接口隔离原则(ISP)尽量使用多个小而专用的接口而不是单一的接口+first()+last()+prev()+next()+indexAll()+updateIndex()+search()+getResultSet()AgentClient+agent:Agent1*5合成聚合复用原则(CARP)优先使用合成和聚合,而不是继承来达到复用的目的。聚合:表示拥有或整体与部分的关系。合成:更强的聚合关系。继承复用有如下的优点和缺点:1)容易实现。2)继承复用破坏了封装,将超类的实现细节暴露给子类。3)如果超类发生改变,子类也不得不跟着改变。4)继承是静态的。合成/聚合是将已有对象作为自己的成员,新对象调用对象已有的功能。这有很多优点:1)这种复用是黑箱操作,把成员对象的细节封装起来。2)这种复用可以动态的改变,新对象可以动态的引用其他的同类对象6迪米特法则(LoD)迪米特法则又称为最少知识法则,是指一个对象应当对其它对象尽可能少的了解,并尽可能少的与其他对象发生联系。这种思想是和模块化程序设计中的模块低耦合高内聚同样的道理。publicclassSomeone{publicvoidoperation1(Friendfriend){Strangerstranger=friend.provide();stranger.operation3();}}publicclassFriend{privateStrangerstranger=newStranger();publicvoidoperation2(){}publicStrangerprovide(){returnstranger;}}Someone的方法operation1不满足迪米特法则,因为这个方法引用了Stranger对象
本文标题:第3章 面向对象程序设计方法
链接地址:https://www.777doc.com/doc-3974370 .html