收藏 分销(赏)

面向过程面向对象.ppt

上传人:a199****6536 文档编号:13135912 上传时间:2026-01-26 格式:PPT 页数:37 大小:421.04KB 下载积分:12 金币
下载 相关 举报
面向过程面向对象.ppt_第1页
第1页 / 共37页
面向过程面向对象.ppt_第2页
第2页 / 共37页


点击查看更多>>
资源描述
Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,*,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,面向过程面向对象,(优选)面向过程面向对象,第一章 从过程抽象到数据抽象,1.1,从:面向过程的程序设计,到:面向对象的程序设计,程序设计方法的发展,程序设计,=,算法,+,数据结构,+,程序设计方法,+,语言工具和环境,随着计算机软、硬件技术的不断发展,出现了许许多多的程序设计语言,程序设计方法也得到不断发展。程序设计方法经历了一个由低级到高级,由复杂到简单的过程。,目前,主要有两种程序设计方法:,面向过程程序设计,面向对象程序设计,使用传统程序设计语言(如:,C,、,FORTRAN,)进行程序设计时,必须详细、准确地描述解题过程。因为,程序设计工作主要围绕设计解题过程来进行的,,所以传统的程序设计方法称为面向过程的程序设计。,1.1.1,面向过程程序设计,1.,面向过程程序设计开发思想,采用自顶向下、分而治之的方法进行模块分解与功能抽象,从而有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的函数(在此泛指例程、函数、过程),解决问题的焦点集中于函数,便于开发和维护。,函数是面向过程的,即它关注如何根据规定的条件完成指定的任务。,结构化程序使用三种结构:顺序结构、分支结构和循环结构。,2),面向过程程序设计的特点,面向过程的开发侧重于构建解决问题的处理流:,1),自顶向下,逐步求精。将较复杂任务分解为简单任务。,2,)模块化。根据任务需完成的功能,将应用程序划分为相对独立的若干模块。模块之间关系简单、相对独立。,数据结构根据处理流的要求开发。数据结构贯穿于算法过程,提供算法过程所要求操作的信息。,数据结构的设计就是选择,数据,存储方式,(,如确定问题中的信息是用数组存储还是用普通的变量存储或其他更加复杂的数据结构,),。,算法设计,就是,在选定的存储结构上设计一个好的算法。不同的数据结构的设计将导致差异很大的算法。,系统的状态是一组全局变量。这组全局变量保存系统的状态值,把状态值从一个过程传送到另一个过程。,功能抽象,数据抽象,模块分解,OO方法用类和对象作为系统的基本构成单位。,函数定义如下:,int setMAXLENGTH;,可以认为:面向对象的程序是由对象和对象间的相互作用构成的。,-这在面向过程的程序设计语言中是不能完全做到的。,datai=5;,例3集合改用链表实现,应用程序就会出错。,否则,元素elem已在pset中,结束。,(优选)面向过程面向对象,实现跨平台、动态的Web、Internet计算。,Software Technology:OOA&D&P&T,类中定义的方法,是允许施加于该类的实例化对象上的操作,是该类所有对象共享的,并不需要为每个对象都复制操作的代码。,return i,(集合的建立,-,集合的处理,-,集合的输出),集合的处理,-,(添加元素,删除元素,搜索元素),添加元素,-,(添加新元素,elem,到集合,pset,。若元素,elem,不在集合,pset,中,,elem,加到,pset,尾部,集合的元素个数,count,加,1,;否则,元素,elem,已在,pset,中。),.,2.,数据结构设计:,根据处理流的要求开发,在程序中用整数数组,set,表示整数集合:集合(数组)最多含,MAXLENGTH,个元素,集合当前有,count,个元素。数据定义如下:,int setMAXLENGTH;,unsigned count;,3,)面向过程设计程序的实例,3.,算法设计:,在选定的存储结构上,对每一个模块,设计一个好的算法,。,好算法的标准:,正确性;,可读性;,健壮性:当输入非法数据时,算法应做出适当反映或处理;,执行算法所耗费的时间(时间复杂度)好;,执行算法所耗费的存储空间(空间复杂度)好。,描述算法的方法有很多:,流程图,自然语言,伪码描述,4.,程序设计:用,选定的,程序设计语言将算法进行代码化。,(,1,),void Add(int elem,int*pset,unsigned&count),这个函数的功能是:添加新元素,elem,到集合,pset,。若元素,elem,不在集合,pset,中,,elem,加到,pset,尾部,集合的元素个数,count,加,1,;否则,元素,elem,已在,pset,中,结束。,函数定义如下:,void Add(int elem,int*pset,unsigned&count),if(countMAXLENGTH),if(!Isin(elem,pset,count),*(pset+(count)+)=elem;,(,2,),Remove(int elem,int*pset,unsigned&count),这个函数的功能是:从集合,pset,中删除元素,elem,。若元素,elem,在集合,pset,中且位于,pseti,,则将,pset,中最后一个元素,psetcount-1,替换,pseti,,集合的元素个数,count,减,1,;否则,给出元素不在集合中的提示信息。,函数定义如下:,void Remove(int elem,int*pset,unsigned&count),for(unsigned i=0;icount,if(icount),*(pset+i)=*(pset+(count-)-1);,/,集合无顺序,最后一,个移到删除之处,else,cout,待删除元素,elem,不在集合中。,endl;,(,3,),Isin(int elem,int*pset,unsigned count),这个函数的功能是:判断元素,elem,是否在集合,pset,中。从头至尾检查集合,pset,中的元素,若有元素,elem,,返回,1,;否则,返回,0,。,函数定义如下:,int Isin(int elem,int*pset,unsigned count),for(unsigned i=0;icount,return(icount);,2,完整的源程序,#include,using namespace std;,#define MAXLENGTH 100,void Add(int elem,int*pset,unsigned,void Remove(int elem,int*pset,unsigned,int Isin(int elem,int*pset,unsigned count);,int main(),int setMAXLENGTH;/,集合,unsigned count=0;/,集合中当前元素个数,int element,choice;,while(1),cout,操作选择:,endl;,cout1-,添加元素,endl;,cout2-,删除元素,endl;,cout3-,判断元素,endl;,cout0-,退出,endl;,coutchoice;,switch(choice),case 1:,coutelement;,Add(element,set,count);,break;,case 2:,coutelement;,Remove(element,set,count);,break;,case 3:,coutelement;,if(Isin(element,set,count),cout,元素,element,在集合中。,endl;,else,cout,元素,element,不在集合中。,endl;,if(choice=0)break;,return 0;,在程序中用整数数组set表示整数集合:集合(数组)最多含MAXLENGTH个元素,集合当前有count个元素。,else,(1)与人类习惯的思维方法比较一致,1 集合的实现与使用】,用传统的面向过程语言开发出来的软件很难维护,是软件危机的突出表现。,int main(),int Isin(int elem,int*pset,unsigned count),(优选)面向过程面向对象,目前,主要有两种程序设计方法:,*(pset+(count)+)=elem;,仅使用对象和消息,没有继承、多态。,(1)集合的使用者有意或无意地改写数据内容,比如在应用程序AppSet.,for(unsigned i=0;icount,*(pset+(count)+)=elem;,这样可以使系统直接映射问题域,保持问题域中事物及其相互关系的本来面貌。,int Isin(int elem,int*pset,unsigned count),for(unsigned i=0;icount,return icount;,void Add(int elem,int*pset,unsigned&count),if(countMAXLENGTH),if(!Isin(elem,pset,count),*(pset+(count)+)=elem;,void Remove(int elem,int*pset,unsigned&count),for(unsigned i=0;icount,if(icount),*(pset+i)=*(pset+(count-)-1);,else,cout,待删除元素,elem,不在集合中。,endl;,针对上面程序的实现,讨论如下两个问题:,(,1,)需求变化,程序改动是否容易?,例如,若要将集合的数据表示改为用链表存储:,不要,count,,集合的三个函数的实现及它们的使用都得改动。也就是整个程序都得改动,修改不是局部化的。,问题根源:,数据结构贯穿于整个算法过程。,(,2,)集合和代码能否重用?,只能重用函数,其它的难以重用。,问题根源:,具体的,整数集合实现,(数据结构)和集合的使用(数据管理),混在一起。,实际上,通常需要被重用的是集合,故应该把集合,的实现,与,集合的使,用分开,,达,做到修改局部化和可重用。,改进方案:,7.1.2,将集合的实现与使用分开,整数集合的实现可以很容易地被重用,而且是模块级的重用。,7.1.3,将集合用链表实现,当将整数集合的实现从一维数组改写成链表时,应用程序,AppSet.cpp,可以保持不变。,面向过程程序设计讨论,不管如何改进,程序或多或少存在着一些问题:,主要问题,1,:,是只能做到信息隐藏,而不能做到信息保护。,例,1,、,2,、,3,,集合的使用者还是能够访问集合实现的数据表示,于是会有如下两种危险:,(,1,)集合的使用者有意或无意地改写数据内容,比如在应用程序,AppSet.cpp,直接改写,s.count,的值,从而导致集合内容的破坏。,(,2,)集合的使用者写出的代码 依赖集合实现的数据表示,这样一旦集合的实现方式改变,应用程序就会出问题。如例,2,应用程序中有,s.datai=5;,,例,3,集合改用链表实现,应用程序就会出错。,这个问题在面向过程的程序设计语言中不能解决,需要在语言中增加新的信息保护机制。面向对象用类成员的存取权限限制来解决这样的问题。,主要问题,2,:,上述整数集合的实现中,整数集合的数据表示和操作函数是分开的(非统一体)。整数集合类型中并不包括集合上的操作,操作是全局函数。这在概念上和实际使用中都有缺陷:,(,1,)概念上,数据类型的数据和其上操作是密不可分的整体。离开数据,操作无从谈起。例如,有整数加法,实数加法等,光谈加法没有意义,因为不同类型的加法其实现是完全不同的。,(,2,)实际使用上,因为数据表示和操作函数独立,故时常发生这样的错误:用正确的数据调用了错误的函数,或用错误的数据调用了正确的函数。,解决办法:应该将数据类型的数据和操作封装在一起作为一个统一体。,-,这在面向过程的程序设计语言中是不能完全做到的。,圆满的解决要用面向对象的类提供的封装机制。,4),面向过程开发模式的优缺点,优点:,算法描述准确,对每一子过程模块(函数)容易进行程序正确性证明,缺点:,编程复杂:主要设计算法,对于复杂应用,算法设计非常复杂,程序功能隐含在程序代码中,理解面向过程的程序相当困难,程序是静态结构的体系结构,系统维护困难,程序代码可重用性差,面向过程程序设计与计算机的工作流程一致。模拟计算机思维来解题(输入,-,运算,-,输出),程序设计工作主要围绕解题过程的设计,不符合人类解决问题的习惯的思维方式。,饭店订餐,客人向服务员提出菜单,服务员接待客人,并把菜单送给厨师,厨师只管烹炒客人要的美食,采购员只管按客人需求采购原料,服务员、厨师、采购员各负其责共同协作为客人提供美食,顾客,服务员,厨师,采购员,饭店,人类解决问题的习惯的思维方式,“顾客,-,服务员,”,的工作模式:,顾客发请求给服务员,服务员根据顾客请求去完成顾客要求的服务,特点:“,顾客,-,服务员,”,的工作模式不关心事件的处理流,而是关心,“,交流的对象,及对象间如何交流,”,人类解决问题的习惯的思维方式,“顾客,-,服务员”的工作模式,【Borland Delphi】,return icount;,分析、设计、实现的方法和与人类习惯的思维方法比较一致;,设有如下的要求:向整数集合的某一子集添加若干元素,从该集合中删除某些元素,判断指定元素是否在该集合中。,若元素elem不在集合pset中,elem加到pset尾部,集合的元素个数count加1;,圆满的解决要用面向对象的类提供的封装机制。,数据结构设计:根据处理流的要求开发,if(!Isin(elem,pset,count),系统的状态是一组全局变量。,执行算法所耗费的存储空间(空间复杂度)好。,圆满的解决要用面向对象的类提供的封装机制。,coutelement;,cout 操作选择:endl;,面向对象程序设计方法模拟人类习惯的解题方法,用,对象分解,取代功能分解,(,将一个较复杂的程序系统设计任务分解成许多易于控制和处理的函数,),对象分解就是:,(,1,)把程序分解成许多对象,(,2,)不同对象之间通过发消息向对方提出服务要求,接受消息的对象主动完成指定功能(顾客所要求的服务)。程序中的所有对象分工协作,共同完成整个程序的功能。,可以认为:面向对象的程序是由对象和对象间的相互作用构成的。面向对象的程序是对象的有机结合。,1.1.2,面向对象程序设计,1.,基本思想:,面向对象程序设计的出发点和追求的基本目标,是使人们,认识系统的方法,与,设计、实现这个系统的方法,尽可能接近,也就是使描述问题的问题空间和解决问题的方法空间在结构上尽可能一致。,OO,从现实世界中客观存在的事物出发来建立软件系统。,强调直接以问题域(现实世界)中的事物为中心来思考问题、认识问题,并根据这些事物的本质特征,把它们抽象地表示为系统中的对象,作为系统的基本构成单位。,这样可以使系统直接映射问题域,保持问题域中事物及其相互关系的本来面貌。,OO,充分运用人类日常的思维方法。,强调运用人类在日常的逻辑思维中经常采用的思想方法与原则,例如抽象、分类、继承、聚合、封装、关联等等。,这使得软件开发者能更有效地思考问题,并以其他人也能看得懂的方式把自己的认识表达出来。,基本思想分析,:,2.Coad&Yourdon,给,OO,的定义:,面向对象的方法学可以用下列方程来概括:,OO=Objects+Classes+Inheritance+,Communication With messages,分析,:,面向对象:,只有同时使用对象、类、继承和消息,才是真正的面向对象。如:,C+,、,Java,、,C#,、,VB.NET,基于对象:,仅使用对象和消息,没有继承、多态。现在的很多流行技术都是基于对象的,它们使用一些封装好的对象,调用对象的方法,设置对象的属性。但是它们无法让程序员派生新对象类型。他们只能使用现有对象的方法和属性。如:,VB6.0,(,1,),OO,认为客观世界是由各种对象组成的,任何事物都是对象,复杂的对象可以由比较简单的对象以某种方式组合而成。面向对象的软件系统是由对象组成的,软件中的任何元素都是对象,复杂的软件对象由比较简单的对象组合而成。,(,2,),OO,把所有对象都划分成各种对象类,每个对象类都定义了一组数据和一组方法。,类中定义的数据用于表示实例化对象的静态属性,用于描述特定实例化对象的状态信息。,类中定义的方法,是允许施加于该类的实例化对象上的操作,是该类所有对象共享的,并不需要为每个对象都复制操作的代码。,面向对象方法具有下述四个要点,:,(,3,)按照子类(或称为派生类)与父类(或称为基类)的关系,可以把若干个对象类组成一个层次结构的系统(也称为类等级)。在这种层次结构中,通常下层的派生类具有和上层的基类相同的特性(包括数据和方法),这种现象称为继承(,Inheritance,inheritns,)。,(,4,)对象彼此之间仅能通过传递消息互相联系。,面向对象的程序就是一组对象,对象之间仅通过消息交互,通知对方要做些什么。,向某个对象提出请求可以发一条消息给这个对象。具体讲,可以将消息看作是请求调用对象的某个函数。,OO,方法用类和对象作为系统的基本构成单位。对象对应问题域中的事物,其属性与服务刻画了事物的静态特征和动态特征。对象,(,类,),之间的继承关系、聚合关系、消息和关联如实地表达了问题域中事物之间实际存在的各种关系。,3.,面向对象方法的主要优点,分析、设计、实现的方法和与人类习惯的思维方法比较一致;,系统稳定性好;,系统可重用性好;,系统可维护性好。,(1),与人类习惯的思维方法比较一致,传统的程序设计技术是面向过程的设计方法,这种方法以算法为核心,把数据和过程作为相互独立的部分,数据代表问题空间中的实体,程序代码则用于处理这些数据。忽略了数据和操作之间的内在联系,用这种方法所设计出来的软件系统其解空间与问题空间并不一致(因为是彼此独立的),令人感到难于理解。,面向对象的软件技术以对象(,Object,)为核心,用这种技术开发出的软件系统由对象组成。对象是对现实世界实体的正确抽象。对象之间通过传递消息互相联系,以模拟现实世界中不同事物彼此之间的联系。,(2),系统稳定性好,传统的软件开发方法:软件系统的结构紧密依赖于系统所要完成的功能,当功能需求发生变化时将引起软件结构的整体修改。,面向对象方法:当对系统的功能需求变化时并不会引起软件结构的整体变化,往往仅需要作一些局部性的修改。,(3),可重用性好,传统的软件重用技术是利用标准函数库。,面向对象有更好的方法重用:,一种方法是可以创建该类的多个实例,从而直接使用它。,另一种方法是从它派生出一个满足当前需要的新类。继承性机制使得子类不仅可以,重用其父类的数据结构和程序代码,而且可以在父类代码的基础上方便地修改和扩充,这种修改并不影响对原有类的使用。,(4),可维护性好(,包括对软件功能的:增加、修改、删除等,),用传统的面向过程语言开发出来的软件很难维护,是软件危机的突出表现。,用面向对象方法所开发的软件可维护性较好,:,(1),面向对象软件稳定性比较好。,(2),面向对象的软件比较容易修改。,(3),面向对象的软件比较容易理解。,(4),易于测试和调试。,3,)面向对象方法的由来和发展,OO,方法是从面向对象的程序设计语言发展演变而来的,面向对象的程序设计语言发展,最早的,OOPL,:,1960s,,,Simula67,,最早引入了类和继承的概念,被认为是面向对象语言的先驱。,最纯粹的,OOPL,:,1970s,,,Smalltalk,,继,Smalltalk72,之后,经过不断改进,,1981,年推出了商用的,Smalltalk80,。它已经具备了面向对象语言的特征:对象、类、继承、多态性、元类等,这标志着面向对象程序设计语言已经发展成熟。至今,,Smalltalk,仍被认为是面向对象理念最纯粹的实现,推动,OOPL,发展的基于对象的语言:,其他许多基于对象的语言对面向对象程序设计语言的形成和发展也起到了积极的作用,如,Lisp,、,Object Pascal,、,CLU,、,Modula-2,和,Ada83,等等。,加入,OO,概念形成的混合型语言:,在已有过程程序设计语言的基础上加入,OO,概念形成的语言,如,Objective-C,和,C+,。混合型语言是在传统的过程式语言基础上增加,OO,语言成分,在实用性方面具有更大的优势。,目前流行,OOPL,及开发平台:,C+,:,C+,对面向对象技术的发展起了很重要的作用,它的流行促进了面向对象技术的普及,使之被广为接受。,Java.Java,是印度尼西亚爪哇岛的英文名称,因盛产咖啡而闻名。实现跨平台、动态的,Web,、,Internet,计算。,【Borland J Builder,Eclipse】,C#.,C#,根植于,C,和,C+,语言之上。,C#,的目的就是综合,Visual Basic,(简称,VB,)的高生产率和,C+,的行动力。,【Visual Studio.NET】,Visual Basic.NET:【Visual Studio.NET】,Delphi,:,Delphi,其实是一个,Object Pascal,编译器。,【Borland Delphi】,OO,不单纯是一种技术,更是一种理念,一种方法学,.,OO,首先出现在编程领域,目前,OO,思想已经广泛应用于计算机的各个领域:,Software Technology,:,OOA&D&P&T,OODB,:,eg.oracle,OS,设计:,eg.windows NT,面向对象方法的出现和应用,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服