下载

2下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 第七章 面向对象的程序设计方法

第七章 面向对象的程序设计方法.doc

第七章 面向对象的程序设计方法

浩哥
2018-09-09 0人阅读 举报 0 0 暂无简介

简介:本文档为《第七章 面向对象的程序设计方法doc》,可适用于IT/计算机领域

第七章:面向对象的程序设计方法第七章:面向对象的程序设计方法第七章:面向对象的程序设计方法学习目标·理解面向对象的程序设计思想·理解类和对象·了解面向过程和面向对象程序设计方法各自优缺点·理解面向对象四大特征·理解OOA与OOD的区别传统开发方法中存在的问题传统开发方法也就是面向过程的程序设计方法我们已经人所介绍。我们已经清楚其结构化程序分析和设计方法如数据流法等、清楚了其基于数据的方法如实体关系法等、清楚了其有限状态机方法、清楚了其基于规则的方法。我们发现这种结构化程序设计方法大都是从一个角度即从过程去理解一个复杂的系统对系统的整体理解整体建模理解很弱。然而现实中的系统并不是仅仅有过程还有更丰富的内容。从系统的整体角度来说:·存在着整体与部分的关系我们可以将系统的某一部件替换为其它的同类部件系统还可以正确工作。我们可以生产一系统标准的部件通过这些部件组织一个全新的系统。这就是系统的可展性。·存在着自我组织、自我修复、自我适应功能当系统中某一部分出现问题时系统应自动使用它具备的其它部件替换。当系统工作的环境发生变化时系统可以改变运行策略以便生产更向的运行效率。·存在着自我学习的功能系统在运行过程中可以总结环境的变化据此来进一步地完善自己。等等实际上面向对象的开发方法并不能完全解决上述问题但它是继过程化软件开发方法后又一最要软件开发方法在软件开发方法论发展过程中将会留下重要的一笔。早期软件开发中存在的问题在使用传统开发方法即结构化方法中开发大规模的复杂软件时其固有的问题就表现出来了:·维护过于困难修改每一个地方将会牵涉到许多功能模块的变动复杂性加大。·过于僵硬扩展困难由于系统的关系错综复杂很难添加新的功能。·重用率过低导致大量冗余在每个项目中往往会出现大量的代码冗余不能很好的重用。·耦合度过高导致理解、修改困难每一个程序之间联系过于密切(强耦合)增加了阅读和修改的复杂性。一个好的系统应该具备如下的性质:可扩展性、灵活性、可插入性。PeterCodeCODE面向对象的概念(ObjectOriented)面向对象概念的一些误解“面向对象”是一个如今被人叫烂的词汇就像去年人们都喜欢把自己的公司打上“com”的标记一样。其实有多少人能真正理解这个词汇呢很难说。我喜欢这样来比喻人们对“对象”一词的滥用。“对象”就好比人们经常说的“酷”和“爽”很多人并不仔细考虑这两个词的差别在很多情况下他们是通用的“酷”和“爽”通常表达“心情不错”的意思你可以在你玩的高兴的时候大声的叫嚷“太酷了太爽了”这个时候两个词汇是通用的。但是你可以说“这个人很酷啊”但是你不能说“这个人很爽啊”。人们对“对象”这个词汇的滥用就发生在这里“面向对象”和“基于对象”就好比“酷”和“爽”,这是两个不同的概念但是人们通常将这两个词汇混为一谈一律用“面向对象”来表达。常见的错误可以在此列举一些:·有个人兴高采烈的和你说“我不喜欢flash的脚本语言flash版本的actionscript采用了新的面向对象的“”语法写起来很舒服。我现在一直用flash来做东西。”(同样的话语也发生在director的lingo脚本语言中)·visualbasic采用了面向对象的属性和方法比起过去的basic语言有了很大的提高。·javascript是面向对象的。等等。通常听到类似的话你都要认真审视说话之人分析他说的话。可以肯定一点他并非真正懂得什么是面向对象的思想。很多人没有区分“面向对象”和“基于对象”两个不同的概念。面向对象的三大特点(封装继承多态)却一不可通常“基于对象”使用对象但是无法利用现有的对象模板产生新的对象类型继而产生新的对象也就是说“基于对象”没有继承的特点而“多态”是表示为父类类型的子类对象实例没有了继承的概念也就无从谈论“多态”。现在的很多流行技术都是基于对象的它们使用一些封装好的对象调用对象的方法设置对象的属性。但是它们无法让程序员派生新对象类型。他们只能使用现有对象的方法和属性。所以当你判断一个新的技术是否是面向对象的时候通常可以使用后两个特性来加以判断。“面向对象”和“基于对象”都实现了“封装”的概念但是面向对象实现了“继承和多态”而“基于对象”没有实现这些的确很饶口。Java比C在贯彻面向对象的思想方面更加彻底。有人对我说:“c是打着面向对象的幌子干着过程编程的勾当”这句话我非常的赞同而且我一直以来也是这么认为的。但是仔细听他讲解后我才发现我是只是理解了这句话前两层的意思。但是还有一层意思我没有理解。你可能要问“难道c不是面向对象的吗?”。事实上c是真正的面向对象编程语言。但是它也是过程编程语言。为什么怎么说呢c的产生不但考虑了面向对象的特性而且也更多的考虑了对c语言的向后兼容使得c这种杂合语言表现出“过程”和“对象”编程的双重性。你通常既可以继续用c编译器来编写传统的c程序也可以使用c的类库或者编写自己的类来作面向对象编程。这种“两面性”使得人们可以继续保留原有的c代码同时也阻碍了面向对象思想的推广。举个简单的例子年的时候我开始学习c当时是学习turboc自己带的一个叫作turbovision的类库来做项目。我的同学也用turboc但是他一点也没有学习过c这个语言他只是用turboc编译器来重新编译他以前用turboc写的程序然后他自豪的对我说:“瞧我用c做的东西”好像意思是说“我用c开发项目了”在那个c比pascal高档pascal比foxbase高档的年代里c的标签绝对是个很"酷"的标志。我其实很清楚他的行为。这就是“c是打着面向对象的幌子干着过程编程的勾当”的第一重意思也就是说c编译器对c程序的兼容性造成了最底层的“过程勾当”。在国内有很长一段时间人们都是在用c编译器做c编程。我当时在想比起我那个同学我才是真正懂得面向对象的人。我学习了c语言我懂得封装继承和多态我学习了turbovision的类库我派生了turbovision的类库并编写了自己的类所以我是懂得面向对象的。从某种意义上说我这么想是对的。但是从面向对象程序员的分类来说我又不完全懂得面向对象的思想。从事面向对象编程的人按照分工来说可以分为“类库的创建者”和“类库的使用者”通常创建类库的人才是真正懂得面向对象思想的人他们创建类库供给那些“客户程序员”来使用他们从头开始制作类库他们进行面向对象的分析设计实现的全过程。当学习完c后我的第一个感觉是从头创建一个类库真是很麻烦的事情通常用c过程编程很容易实现的功能你必须按照类的思想来从新建立对象但是一旦类库建立好后使用类库和派生类以及维护代码都是非常舒服的事情。使用类库的人并不都是具备了面向对象思想的人通常知道如何继承和派生新对象就可以使用类库了然而我们的思维并没有真正的转过来使用类库只是在形式上是面向对象而实质上只是库函数的一种扩展。这就是我理解的“c是打着面向对象的幌子干着过程编程的勾当”的第二重意思实际上用c编程的人大部分不自己创建类而是使用类库这样就造成了他们把类库作为一种高级的库函数库来理解并没有真正理解面向对象的思想。c的面向对象的思想推广很慢直到mfc,owlvcl这样的类库出来以后人们才渐渐的接受了一些面向对象的思想。为什么这条面向对象的道路那么难走?我的答案是“因为c给了我们第二条道路去走过程编程”当然原因是为了考虑兼容c语言然而正是由于有了第二条老路才使得使得我们不会再去考虑新的面向对象编程思维方式。直到出现了java才真正迎来了面向对象的曙光。java真正是革命性的东西吗?不是所有现有的java的思想都是继承自其他的语言和技术没有什么革命的地方虚拟机的概念早在年前的ucsdpascal中就采用了只是当时得机器速度太慢虚拟机仿真造成的性能降低对于当时的硬件来说是相当严重的。java本身的很多东西也借鉴了c语言连它的创始人也说java是"c"也就是说java去除了c的一些不太好的地方。所以说java本质上没有什么革命的东西所以那些对java的赞美之词都是sun公司的宣传伎俩。没有一种语言会长久的存在下去你很难说你的孩子在二十年后还会继续使用c或java所以我们要抛开这些浮华词汇的背后找寻真正我们需要学习的东西。否则今天我们大家都是微软的傀儡明天sun公司起来了我们就都是sun的傀儡。仔细研究美国电脑技术发展的历史美国人一向喜欢象第三世界兜售他们的过时技术而他们始终可以自豪的说我们将永远领先你们第三世界国家二十年。我们始终在跟在美国人的后面学习他们的东西这的确让人担忧。我说着说着又跑题了。java虽然没有什么真正的革命性的东西但是java在真正推动面向对象编程思想方面是功不可末的。使用java编程你无需考虑到向后兼容什么语言的问题它是重新建立的语言你在掌握这门语言之前你必须将自己的编程思想由过程编程彻底转向面向对象编程因为每个java程序本身就是一个类你编写任何java程序你都不自觉的在构造一个对象模板没有第二条道路只能是面向对象编程。(我非常喜欢java将所有类定义和类声明放在一个文件中而不是象c那样cpp和h文件是分开的。通常刚刚开始学习java的人不习惯不过学习一段时间你就会体会到它的好处了。)使用java编写程序(我更喜欢说编写类而不是程序)的时候你会必须从一个对象的角度来考虑问题因为你的程序就是一个类你必须考虑把哪些东西作为成员变量哪些作为方法要生成几个类哪些变量是成员变量哪些是静态的变量和方法等等。通常做完一个项目你就已经将面向对象的思想运用其中了。之所以说java在面向对象的贯彻方面要比c彻底就是因为你只能使用面向对象的方式来编写java程序而c却可以采用另外一条非面向对象的方式来编写程序。java并没有什么真正革命性的东西它最大的贡献当然是推广面向对象的思想了。java总的来说是降低了继续过程编程的可能性但是并没有完全消除它。面向对象是一种思想是我们考虑事情的方法通常表现为为我们是将问题的解决按照过程方式来解决呢还是将问题抽象为一个对象来解决它。很多情况下我们会不知不觉的按照过程方式来解决它因为我们通常习惯于考虑解决问题的方法而不是考虑将要解决问题抽象为对象去解决它。很多新的技术使我们更加趋向于过程而非对象的思想。最明显的就是rad(快速应用程序开发)可视技术的出现人们可以通过设置属性和编写事件函数来快速开发应用程序编写事件函数就是典型的按照过程编程的思想(至少我是这么认为的)试问有多少人能区分vb和delphi,cbuilderjava的事件函数编写有什么本质的区别后三者都采用了delegation(委托模型)在java中是通过anonymous类(无名类)或者adapter类来实现delegation这是一种面向对象的构想但是vb不是所以这底层的区别都被上层的相似性所抹杀了使用jbuilder编程的时候我们如果没有仔细研究java的awtevent编程方式的话通常也是把它当作普普通通的“类vb"的编写方式来写程序而实际分析它在后台所生成的代码你才能明白这些代码是真正的面向对象的但是如果你只是简单的把它当作可视编程工具你是永远不会明白什么是”委托模型“什么是面向对象编程的。这是我理解的“c是打着面向对象的幌子干着过程编程的勾当”第三重意思。无论是c还是java都有可能走过程编程的老路java降低的过程编写的可能性但是如果你没有具备面向对象的编程思想你还是可能走面向过程的老路的。面向对象概念概述面向对象方法是一个广泛使用但涵义并不清晰的术语。年代面向对象主要指一种程序设计方法但在随后的发展中面向对象的方法已经渗透到计算机软件领域的许多分支。在了解面向对象之前我们必须得了解两个重要概念:对象和类。·WhatisanObject首先我们来了解一下什么是对象。对象的概念最早出现于五十年代人工智能的早期著作中在现实世界中我们可以将对象定义为:对象(Object):一个具有明确行为的有形实体具有行为和状态有着清晰的边界。对于现实世界中的每一个具体事物我们都会将其看待为一个对象比如狗、电视机、自行车等都可以是对象。狗有特定的名称、毛色、品种、会饿等特点还有狗叫、尾巴左右摇摆等动作同样的自行车也有品牌、重量等特点同时具备换速、刹车等动作依此类推我们不难发现现实中的每一个对象都会有自己的特点以及相关动作我们将对象所有特点(属性)称之为对象的状态而动作称之为行为。属性(Attribute):对象的一种内在的或独特的性质、特点、质量或特征它构成了一个独一无二的对象(摘自<<ObjectsOrientedAnalysisandDesignwithApplications>>)每一个学生具备名称、性别、年龄、身高、长相、爱好等属性通过这些属性我们可以很快地区分所有的学生对象因为这些属性构成了每一个独一无二的学生对象。比如说在大部分情况下我们会通过学生名称来区分每一个学生对象。我们经常会说:某某人很高某某人很年轻等高和年轻实际上就表现出某一个对象的内在的特点。因此可以这样理解我们是通过每一个对象特有的属性来区分各个对象。注意:属性都有其对应的值而且某些属性值是可以动态改变的比如学生的体重、爱好是可以改变的而DNA、指纹却是不能改变的。随着属性值的改变状态也随之改变了。比如学生甲的身高值逐渐增长了那学生甲的状态也发生了变化长高了!状态的具体定义如下:状态(State):包含对象的所有属性以及属性值会随着属性值的改变而改变没有一个对象是孤立存在的对象之间是相互作用的。行为就是指这种作用。行为(Behavior):是一个对象根据它的状态改变和消息传送所采取的行动和作出的反应代表了对象对外的可见、可测试的动作。(摘自<<ObjectsOrientedAnalysisandDesignwithApplications>>)行为和状态是相互的。Dog处于饿的状态时就会采取进食等行为进食完毕后Dog又会处于饱的状态。现实中大多对象是通过接受另一个对象传递的一个消息(操作)来改变自身的状态。比如:驾驶员扭动汽车启动钥匙至关闭位置此时汽车关闭引擎。其中驾驶员、汽车都是对象而关闭引擎则是一个特定消息是由驾驶员传递给汽车的消息汽车根据这个消息改变状态从启动状态变为关闭状态。因此消息实际上就是一个对象对另一个对象施加的操作。小练习列举现实生活中种对象以及相关的属性和可能的行为在软件开发中对象一词的正式应用是在Simula*语言中在Simula中对象是用来描述现实的某个方面。对象的范围更广除了现实中描述的对象之外还包括在软件设计中产生的一些产物这些产物一般用来实现更高级的行为功能。在软件中对象的定义:对象代表一个单独的、可确认的实体可以是具体的也可以是抽象的必须有明确定义的一个这样的角色。相似对象的属性和行为在它们的共同类中定义。在软件中对象可能有很清晰的边界然而却是抽象的也可能是具体存在的但边界不明确。注意软件中的对象和现实中对象同样有其自身的状态和行为!每一个对象在软件中都会拥有自己的空间(内存)和唯一标识名。一般我们也将对象称之为实例(instance)。通俗地讲对象指的是客观世界中的实体它能“知道一些事情”(即存储数据)“做一些工作”(即封装服务)并“与其它对象协同“(通过交换消息)从而完成(模块化)系统的所有功能。对象反映了系统保存和处理现实世界中某些事物的信息的能力。注释:Simula世纪年代产生的一种面向对象语言是所有基于对象和面向对象语言的原型用于描述系统和开发仿真的语言。·WhatisClass在现实世界中我们会将所有脊椎动物对象进行分类:鸟类、两栖爬行类、哺乳类比如我们将leopard、tiger、monkey等脊椎对象都归纳为哺乳类而eagle、crane、swan属于鸟类。那我们又是怎样去判断哪种动物是属于哪一类的?我们发现leopard、tiger、monkey都具备viviparity(胎生)、lactation(哺乳)、coat(皮毛)等哺乳动物特征而eagle、crane、swan却具备feather(羽毛)、flight(飞翔)、beak(喙)等鸟类特有的特征。不难发现。这些对象都具有一些共同的属性和行为通过这些属性和行为的划分我们将leopard、tiger、monkey划分为哺乳类而eagle、crane、swan划分为鸟类。类和对象是紧密关联的没有对象就没有类!类的定义:类(Class)是一组共享公共属性结构和公共行为的对象的集合。类可以是一种抽象即不是具体存在的它实际上是对一组对象的公共部分的归纳集合而对象却是一个具体的存在是实体而非抽象。我们可以这样说:类Mammal代表所有哺乳动物的共有特征所有的非公有特征都不属于类Mammal比如皮毛的颜色、喜好的食物等都不会归纳到类Mammal。而当我们想去识别某个特定的哺乳动物时就必须指定“这个哺乳动物”或者“那个哺乳动物”即对象也就是说当我们需要去分析哺乳动物特有的属性和行为时那就必须针对具体的对象来研究而不是针对一个抽象的类!注意:在软件开发中我们将一个对象称之为类的一个实例。没有共享结构和公共行为的对象我们不能将它们组合在一个类中。比如我们都知道不能将pinaster和squirrel组合成一个类是因为pinaster和squirrel并没有共享结构和公共行为比如pinaster有枝叶而squirrel没有squirrel能行走而pinaster不能等等。在现实世界中我们认识事物的时候都是首先将所见事物进行分类然后按照每种类别去逐一研究事物对象。同样在软件领域中我们也是将问题进行分解分类(将大问题分解成许多小问题每个小问题可以归纳为一类)然后再针对每一类进行分析设计以及实现这就是广义的面向对象。面向对象定义:尽量模仿现实世界在软件中将复杂问题中的实体都作为一个对象来处理然后根据这些对象的结构和行为再划分出类(即实现问题的分解)最后实现软件的模拟仿真。也可以理解为:现实世界中的实体抽象成模型世界、程序世界中的对象和类设计它们以完成预期任务并具有更好的可维护性和健壮的结构。注意:在软件领域中类包含了对象的属性和行为的定义是一组属性和行为操作的集合!只有掌握了对象和类的概念我们才能清晰、准确地明白什么是面向对象!当然对面向对象的深入了解还必须掌握面向对象的一些相关特性在下一小节我们将具体学习。面向对象的主要特性程序语言发展到如今已出现了多种风格不一的编程语言大体主要分为以下两种风格的语言:·面向过程(C、C、VB、PHP等)·面向对象(Java、Smalltalk、C等)并不是说哪种语言是最好的每种风格语言的好坏是针对不同方面的应用程序而言的。比如说面向过程语言适用于计算密集型操作(复杂算法等)的设计而面向对象适用于广阔的应用程序范围(这也是Java能迅速发展并占据广大市场的原因之一)。注释:面向过程(ProcessOriented)基于该风格的程序的设计都是在想怎样才能一步一步的解决问题,思维方式是过程,或是说步骤。那怎么区分面向过程和面向对象的区别只要是具备以下特点的语言我们都可以将其看作为实现了面向对象的语言:a)抽象(Abstraction)在前面我们已知道通过抽象创建出了类类就是抽象的一种表示。抽象是解决问题复杂性的一种基本方法抽象会重点强调我们应该注意什么而不应该注意什么!通过抽象我们可以着重实现需关注的细节而忽略一些非实质性或无关紧要的细节从而能够更好的分析问题解决问题!抽象:表示一个对象与其它所有对象区别的基本特征为不同的观察者提供不同的角度来观察对象。对同一个对象电视机维修员只会关注电视机的内部结构:线路是否断裂、显像管是否损坏等而购买电视的客户却只会关心电视机的画面是否逼真、外观是否好看等等客户不会也不用关心电视机的内部结构。可以看出维修员只关心电视机的内部购买用户只关心电视机的外观及实用性他们观察电视机的角度不一致这就是抽象的实现在现实生活中到处都存在着抽象!小练习列举现实生活中的抽象例子最少例。抽象强调实体的本质、内在的属性在软件开发中抽象指的是在决定如何实现对象之前的对象的意义和行为即类的实现!通过对类的了解我们也可以将抽象定义为:从许多事物中舍弃个别的、非本质的特征抽取共同的、本质性的特征。为什么需要抽象?首先:问题的复杂性日益增长其中描述的事物也越来越复杂如果分析员去了解每一个事物的所有方面那将是一个穷举耗时、低效率的工作其次:如果没有识别所有对象的共同特征的行为那么对这些对象的分类将无法进行!对象分类是面向对象中非常重要的环节而抽象则是实现该环节的必须解决方案!抽象的本质就是将问题分解在面向对象中所有对象被抽象成各种类从而让程序员集中关注于功能的实现!b)封装(Encapsulation)我们再来思考上面的例子对于客户来说他只会关心电视机的外观及性能是否良好等方面电视机中的显像管、集成电路板对客户而言是不可见的即电视机的生产商已将这些配件通过电视机外壳包装了起来对客户配件是隐藏的!现实中这样的例子很多比如计算机对于购买者而言其组成部分CPU、mainboard、HD等PC配件都被封装在机箱内是不可见的!封装的定义:封装是一种信息隐蔽技术是一个划分抽象的结构和行为的过程。封装和抽象是互补的抽象着重于对象的行为而封装着重于对象的行为的实现。抽象实现抽取众多对象的公共特征和行为而封装则是在不同的抽象之间设置明显的分隔线从而导致每一个观察者关注内容的明显分离!没有抽象的封装将无意义没有封装的抽象是不完整的!在开发中封装可以更通俗的理解为:把代码和代码所操作的数据捆绑在一起使这两者不受外界干扰和误用的机制封装可被理解为一种用做保护的包装器以防止代码和数据被包装器外部所定义的其他代码任意访问对包装器内部代码与数据的访问通过一个明确定义的接口来控制。封装代码的好处是每个人都知道怎样访问代码进而无需考虑实现细节就能直接使用它同时不用担心不可预料的副作用。c)继承(Inheritance)类和类之间的关系之一是面向对象系统的最基本要素。继承表明为一个“是一种”的关系在现实中有很多这样的例子:人类是一种哺乳动物树是一种植物类……。为什么人类是一种哺乳动物?答案:因为人类具备所有哺乳动物的特征(结构和行为)也就是说人类继承了哺乳动物的特点!我们经常会这样描述:儿子继承了父(母)亲的优(缺)点!继承:一个类共享一个或多个类中定义的结构和行为表示的是一种泛化特化的层次关系。注意:类和类之间实现继承的前提是这些类之间有着必然的联系“类A是一种类B”!假如:我们将树继承于哺乳动物而人类则继承于植物类!大家想想看结果会如何?我们在使用继承的时候必须得遵守这样的检验标准:如果类B“不是一种”类A那么类B必然不是从类A继承而来!当类B继承于一个类A那么这种继承称之为单继承。当类B继承于多个类A、C、D等那么这种继承称之为多继承。也可以这样理解当实现单继承时那类B继承了类A的所有属性和方法(比如人类继承了哺乳动物的所有属性和行为)而实现多继承时类B继承了A、C、D等多个类的所有属性和方法(比如儿子继承了母亲和父亲的所有优、缺点)。其中类B称之为子类(派生类)subclass而类A、C、D则称之为超类(基类)superclass泛化(generalization)将一些有关联的不同类中的共同结构和行为抽取出来构成一个新的超类。特化(specialization)和泛化正好相反从一个或者多个超类中派生出多个子类。简单理解就是:超类的创建代表泛化子类的派生代表特化!子类除了能通过继承共享父类的属性和行为之外还能修改继承于父类的属性和行为最重要的一点就是:能在继承父类的基础上定义属于子类自身的属性和方法从而实现扩展!以上这段话就是继承的最神奇之处!面向对象使继承得到了充分的体现!学习技巧:大部分同学在初学时往往对继承、抽象等概念一知半解建议大家多结合实际例子来学习可以多想想周边的现实世界中哪些是继承、哪些是抽象。d)多态(Polymorphism)我们来假设思考一下现实中的一个问题:假设某条snake和某条cabrite它们都取名为Jack注意snake和cabrite有着共同的超类爬行类都具备爬行类的公共行为:爬行。但我们发现虽然一个名字Jack代表两种不同类对象但是这两个对象却是用不同的方式来爬行Jack(snake)通过蠕动身上的鳞片来爬行而Jack(cabrite)则通过四肢来爬行。虽然在现实中我们可以通过给这两个对象取不同名字用以区分但上面的例子向我们演示了这样一个过程:一个名字可以表示许多不同类(这些不同类必须拥有一个共同的超类)的对象从而实现以不同的方式来响应某个共同的操作集。以上就是多态的定义多态只有通过继承才能实现!在后面章节我们会详细掌握多态以及其运用。以上就是面向对象的一些主要特征具备了这样特征的程序语言我们就可以称之为面向对象语言。·面向对象的优点·软件固有的复杂性:·维护过于困难·修改每一个地方将会牵涉到许多功能模块的变动复杂性加大。·过于僵硬扩展困难·由于系统的关系错综复杂很难添加新的功能。·重用率过低导致大量冗余在每个项目中往往会出现大量的代码冗余不能很好的重用。·耦合度过高导致理解、修改困难每一个程序之间联系过于密切(强耦合)增加了阅读和修改的复杂性。一个好的系统应该具备如下的性质:可扩展性、灵活性、可插入性。PeterCodeCODE通过面向对象就能很好的处理以上的复杂性。在面向对象过程中我们根据问题领域中的关键抽象来分解系统识别关键对象并将其分类最终达到将复杂问题分解成多方面来分析和实现。比如PC机就是一个很复杂的设备为了更好的了解PC我们就会将PC的组成部分分解再逐一了解从而达到复杂问题简单化。PC包含CPU、display、keyboard、HD等通过对这些部件的逐一熟悉PC就不会显得很复杂了。而且如果我们只想了解PC的处理速度那么就只需专注于对CPU的了解(通过抽象来实现)。面向对象是一种尽量模仿现实世界的思想以上对PC的了解就是我们在现实中对一个复杂事物进行分解熟悉的一个过程面向对象就是这样的一个过程只是复杂许多。面向对象的一些主要优点:·和现实世界更接近更符合我们人类的思维逻辑·开发出的系统容易维护和修改·适用于开发复杂、庞大的系统·开发出的程序更稳定合理·由于继承、类的机制更容易实现重用减少冗余·由于实现数据和逻辑的分离维护和扩展变得更加容易·面向对象的分析、设计和编程在面向对象开发中一般都会遵循三方面来分析解决问题:首先通过一些好的方法对问题进行分析寻找问题中的对象实体、类其次基于分析结果使用类和对象抽象在逻辑上构建系统实际上就是使用面向对象的各种分解方法来建立系统的逻辑、物理模型和动态、静态模型。最后就是运用不同的面向对象语言对设计的结果的实现即类和对象的实现。下面我们就这三方面具体来学习。面向对象分析(ObjectOrientedAnalysis)面向对象分析(OOA)方法是建立在对象及其属性、类属及其成员、整体及其部分这些基本概念的基础上。大英百科全书指出:“人类在认识和理解现实世界的过程中普遍运用着三个构造法则:·区分对象及其属性。例如区分一棵树和树的大小或空间位置关系。·区分整体对象及其组成部分。例如区分一棵树和树枝。·不同对象类的形成及区分。例如所有树的类和所有石头的类的形成和区分。”OOA就是建立在以上三个原则的基础上的每个软件都建立在特定的现实世界中OOA阶段产生的模型就是用来形式化该现实世界的“视图”我们称之为建模。有许多优秀的方法作用于整个OOA阶段如ShlaerMellor,Jacobson,CoadYourdon,CharlesAbbott等还有现今已成为建模主流的UML(UnifinedModelLanguage)。OOA就是仔细的划分系统的各个部分明确它们之间的层次关系然后将各个部分作为一个对象进行功能上的分析的一个过程。包括业务分析和需求分析。OOA定义:是一种分析方法它以可在问题域的词汇表中找到的类和对象的观点来理解、审视需求。(摘自<<ObjectsOrientedAnalysisandDesignwithApplications>>第二版)虽然面向对象分析和面向对象设计的侧重点很不相同但二者之间的界限是很模糊的在开发中我们往往不能明确的区分二者的范围。从上面的描述可以知道在分析中我们通过发现构成问题域中的词汇表来寻找类和对象从而模拟现实世界对软件建模。OOA阶段的方法众多各有其特点这里我们只介绍一种最简单的方法:非形式化的语言描述。这个方法是由Abbott提出他建议用语言(英语)写出问题的描述接着在名词和动词下面划线名词代表对象动词代表对象的操作。例:描述一个顾客购买机票的场景顾客选择某一个柜台首先顾客向柜台助手查询某一天的航班信息以及是否有机票预订柜台助手往电脑里输入查询信息并查看结果如果有机票顾客则填写预订表预订机票柜台助手输入预订信息并打印机票最后将机票返回给顾客。单下划线代表对象双下划线代表操作。通过Abbott方法我们可以分析出该场景中的对象和操作名词:顾客、柜台助手、航班信息、机票、查询信息、机票动词:查询、预订、打印。在使用UML建模时OOA阶段主要是通过另一种方法用例分析来实现系统的用例图以及简单类图和时序图等既UML是将系统用一种统一标准的图形来表示(在后期会专门学习)。面向对象设计(ObjectOrientedDesign)OOD是对OOA的细化,强调的是复杂系统的正确和有效的构建通过不同的方法来着重于系统的逻辑设计、物理设计。如果说分析是产生系统的类和对象那么设计则确定类和类之间的关系、对象和对象之间的关系、类的状态转换、模块之间的依赖性等。OOD有以下特点:·没有严格的界线·OOD的结果直接用于编码·与OOA的输出一样只是更加详细完善OOD定义:是一种设计方法包含面向对象分解的过程以及一种表示方法用来描述设计中系统的逻辑与物理模型和动态与静态模型OOD步骤·细化重组类·细化和实现类间关系,明确其可见性·增加属性,指定属性的类型与可见性·分配职责,定义执行每个职责的方法·对消息驱动的系统,明确消息传递方式·利用设计模式进行局部设计·画出详细的类图与时序图、状态图、对象图等(UML)OOD与OOA的区别:·OOA偏重于理解问题描述软件要做什么而OOD偏重于理解解决方案描述软件要如何做·OOA只考虑理想的设计不关心技术与实现底层的细节而OOD需要得到更具体详细更接近于真实的代码的设计方案·在设计结果的描述上OOA偏重于描述对象的行为OOD偏重于描述对象的属性与方法·OOA只关注功能性需求OOD还需要关注非功能性需求一个设计的好坏直接决定程序的成败因此在往后的项目实战中大家一定要全面、仔细、合理的进行设计。面向对象编程(ObjectOrientedProgramming)OOP是对设计的一种代码实现方法在该阶段我们将采用合适的面向对象语言来编码实现设计阶段产生的系统架构。OOP定义:是一种实现方法程序被组织成对象的协作集合每一个对象代表某一个类的实例而类则是通过继承关系联系在一起的。OOP阶段必须满足三个标准条件:·使用对象而不是算法(面向过程则是使用算法)作为其基本逻辑构件·任何一个对象都必须是某一个类的实例·类通过继承关系和其它类相关OOP的关键就是面向对象语言的选择以及面向对象特点的实现。实际上有很多程序员对面向对象和基于对象(ObjectBased)的语言概念很模糊容易混淆。当一种语言满足以下条件时才能称之为面向对象语言:·对象必须是数据的抽象·每一对象对应相关类·子类可以从超类中继承属性如果某种语言只满足了以上的前两个条件而第三个条件并没满足(如JavaScript语言)那么我们就将该语言称之为基于对象的语言。面向对象语言的发展简史编程语言从最初的复杂机器语言发展到如今的高级面向对象语言经历了近年的历史其中产生了四代计算机语言:·第一代:()FortranI、ALCOL、Flowmatic等语言主要应用于数学和工程应用几乎全部使用数学词汇。·第二代:()FortranII、ALCOL、COBOL、Lisp等语言重点在于算法抽象集中于告诉机器应该做什么比如通过这些语言编写的算法会告诉机器应该在查看员工数据之前进行排序。第三代:()PL(FORTANALCOLCOBOL)、Pascal、Simula(最早出现类和对象的思想的语言)对数据(类)抽象描述各种类的类型。·第四代:(至今)Smalltalk、C、Ada、Java、Eiffel、PHP等语言都是面向对象或基于对象的语言。发展到至今高级语言已出现了千多种现在仍在不断出现(如Ajax等新语言)呈一个高速发展阶段而现今主流的语言就是我们所学的面向对象语言对于复杂的问题面向对象语言能比任何其他种类语言更好的解决其中的代表性语言是Java。Simula是最早出现类和对象的基本思想的语言后期产生的各种面向对象或者基于对象语言均是从Simula语言的基础上发展而来。比较典型的有:Java(纯面向对象)、Smalltalk(纯面向对象)、C(面向对象)、ObjectPascal(面向对象)、Ada(基于对象)等。扩展内容·对象不是类类却可以是对象请思考是否正确·对象之间的关系·上下级关系对象之间的一个物理或概念联系一个对象通过它与另一个对象之间的上下级关系协作通过上下级关系对象和对象之间可以相互传递消息即一个对象可以通知另一个对象并产生响应。注意:对象之间可以双向传递消息。·聚合关系表示一个整体部分的层次表示物理包含和非物理包含。如:PC包括CPU、keyboard、memorybank这就是物理包含而股东拥有股票但股票不是股东身体的一部分这就是非物理包含。图3·OOA模型的结构第一层:对象-类层表示待开发系统的基本构造块。图符的外层边界表示实例边界实际上它表明对象是非空的。而图符的内层边界则表示类边界。在某些情形下定义这种对象是很有用的。我们将它们称为模板类或抽象类。模板类可以为结成较高级的聚合体提供一条方便的途径。第二层:属性层对象的属性和实例连接共同组成了OOA模型的属性层。我们把对象所存储的数据称为对象的属性。类的实例之间互相约束它们必须遵从应用论域的某些限制条件或事务规则。例如当定金取消后相应的订户也应该被取消这可能是一项事务规则。我们称这些约束为实例连接。第三层:服务层对象的服务和消息通信组成了OOA模型的服务层。我们把对象所做的工作称为服务或方法。系统的不同对象都分别执行一定的工作或功能它们之间通过消息通信即所谓的协同。对象的服务及对象实例之间的消息通信共同组成了OOA模型的服务层。第四层结构层该层负责捕捉特定应用论域中的结构关系。泛化、特化等结构整体部分结构表达了人类的一种基本组织方式即自然的整体和部分的结构关系从而把一些部分的聚合构造成整体。例如一辆汽车由发动机、传动装置和刹车装置组成。第五层:主题层相当于全局系统的子系统或子模型。由于OOA模型的结构庞大而复杂因此众多的对象有时很难处理。于是可以把对象归到各个主题层中可以把有关的对象用一个边框框起来加以实现。例如在一个控制系统中众多的对象可分为“管理”和“控制”两个主题。·类和类之间的关系·关联·一对一保险合同与保险人、订单与客户·一对多订单与商品、职员与部门·多对多学生与课程、项目与程序员·继承泛化和特化的实现分为单继承和多重继承·聚合同对象的聚合类似·实例化定义类的一个对象参考书籍:<<ObjectsOrientedAnalysisandDesignwithApplications>>(SecondEdition)内容总结·对象(Object)是一个具有明确行为的有形实体具有行为和状态有着清晰的边界具备属性、行为、状态。·对象的属性及其值表现状态不同的状态会有不同的属性。·对象的状态和行为是相互的行为可以改变状态状态可以促使行为的产生。·类(Class)是一组共享公共属性结构和公共行为的对象的集合类是一种抽象不具体存在。一个对象称之为类的一个实例·类包含了对象的属性和行为的定义·面向对象的主要特征:抽象、封装、继承、多态。·在OOA中我们通过发现构成问题域中的词汇表来寻找类和对象从而模拟现实世界对软件建模。·OOD是对OOA的细化,强调的是复杂系统的正确和有效的构建通过不同的方法来着重于系统的逻辑设计、物理设计。·OOD与OOA的区别·面向对象与基于对象语言的区别计算机驱动器主机显示器键盘

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/24

第七章 面向对象的程序设计方法

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利