从面向过程到面向对象的变革
- 格式:doc
- 大小:10.45 KB
- 文档页数:4
面向对象与面向过程程序设计方法的比较摘要:区别于一般讲述面向对象技术的文章,本文系统地比较了面向对象技术和面向过程技术的异同,并着重介绍面向对象技术以及它的封装、继承和多态三个特点,让读者对面向对象有一个形象的理解。
然后通过比较和举例,文章分析了OO技术在软件工程中的三大优势。
Abstract:Being different from general articles about object-oriented technology ,this paper systematically compared the object-oriented technology and the process-oriented technology, and mainly introduces the object-oriented technology and its three characteristics :packaging, inheritance and polymorphism, to make the reader have an image of understanding of object-oriented. Then through the comparison and some examples, this paper analyzes the OO based software engineering in three points.关键字:面向对象面向过程软件工程Key words:Object-Oriented Process-Oriented Software-Engineering一引言20世纪60年代中期开始爆发的软件危机,使人们认识到大中型软件系统与小型软件系统的本质区别,软件工程以及面向对象编程(Object-Oriented Programming)技术得以应运而生。
面向对象发展历程面向对象编程(Object-Oriented Programming,简称OOP)是一种软件开发方法,它以对象作为程序的基本单位,将数据和操作封装在一起,实现了数据的抽象、封装、继承和多态等特性。
面向对象的发展历程可以追溯到20世纪70年代,以下是面向对象发展的一些重要里程碑:1. Simula语言(1967年):Simula是第一个支持面向对象编程的语言,它是由挪威计算机科学家Ole-Johan Dahl和Kristen Nygaard开发的。
Simula引入了类和对象的概念,并提供了一些面向对象的关键特性,如继承和多态。
2. Smalltalk语言(1972年):Smalltalk是第一门完全面向对象的编程语言,它由Xerox PARC实验室的Alan Kay等人开发。
Smalltalk引入了封装、消息传递和动态绑定等概念,对后续的面向对象语言设计产生了重要影响。
3. C++语言(1983年):C++是一种面向对象的扩展C语言,由Bjarne Stroustrup开发。
C++在C语言的基础上引入了类、对象、继承、多态等特性,成为当今广泛应用的高级编程语言之一。
4. Objective-C语言(1984年):Objective-C是一种面向对象的扩展C语言,由Brad Cox和Tom Love开发。
Objective-C与C++类似,支持类、对象、继承等特性,但它更加动态灵活,被广泛用于苹果公司的iOS和macOS开发。
5. Java语言(1995年):Java是一种面向对象的编程语言,由Sun Microsystems的James Gosling等人开发。
Java继承了C++的面向对象特性,但去除了一些复杂和容易出错的特性,比如操作符重载和多重继承,提供了更安全、可靠的软件开发环境。
6. C#语言(2000年):C#是一种面向对象的编程语言,由Microsoft公司开发。
C#在语法上类似于Java,但引入了许多新的特性,如委托、属性和事件等,提供了更强大和灵活的开发工具。
面向对象的概念是什么?和面向过程有什么区别?面向对象是尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程。
面向过程,也就是结构化程序设计是一种自顶向下逐步求精的设计方法,和单入口单出口的程序结构。
面向对象的概念,特点是什么?1.编程模型所有计算机均由两种元素组成:代码和数据.精确的说,有些程序是围绕着"什么正在发生"而编写,有些则是围绕"谁正在受影响"而编写的.第一种编程方式叫做"面向过程的模型",按这种模型编写的程序以一系列的线性步骤(代码)为特征,可被理解为作用于数据的代码.如C 等过程化语言.第二种编程方式叫做"面向对象的模型",按这种模型编写的程序围绕着程序的数据(对象)和针对该对象而严格定义的接口来组织程序,它的特点是数据控制代码的访问.通过把控制权转移到数据上,面向对象的模型在组织方式上有:抽象,封装,继承和多态的好处.2.抽象面向对象程序设计的基本要素是抽象,程序员通过抽象来管理复杂性.管理抽象的有效方法是使用层次式的分类特性,这种方法允许用户根据物理含义分解一个复杂的系统,把它划分成更容易管理的块.例如,一个计算机系统是一个独立的对象.而在计算机系统内部由几个子系统组成:显示器,键盘,硬盘驱动器,DVD-ROM,软盘,音响等,这些子系统每个又由专门的部件组成.关键是需要使用层次抽象来管理计算机系统(或其他任何复杂系统)的复杂性.面向对象程序设计的本质:这些抽象的对象可以被看作具体的实体,这些实体对用来告诉我们作什么的消息进行响应./* (我的理解)*计算机是一个实体,我要输入字符,显示器显示出来,那么*计算机(对象).输入(键盘属性).显示(显示方法)*使用分层来引用,操作.而不用管计算机内部如何处理.*只要有计算机对象,它就能响应我的操作,而我敲键盘,*计算机对象就把这个消息传给屏幕,屏幕显示.*/计算机对象包含了它所有的属性,以及操作,这就是面向对象程序设计的三大原则之一:封装.3.封装封装是一种把代码和代码所操作的数据捆绑在一起,使这两者不受外界干扰和误用的机制.封装可被理解为一种用做保护的包装器,以防止代码和数据被包装器外部所定义的其他代码任意访问.对包装器内部代码与数据的访问通过一个明确定义的接口来控制.封装代码的好处是每个人都知道怎样访问代码,进而无需考虑实现细节就能直接使用它,同时不用担心不可预料的副作用.在JAVA中,最基本的封装单元是类,一个类定义着将由一组对象所共享的行为(数据和代码).一个类的每个对象均包含它所定义的结构与行为,这些对象就好象是一个模子铸造出来的.所以对象也叫做类的实例.在定义一个类时,需要指定构成该类的代码与数据.特别是,类所定义的对象叫做成员变量或实例变量.操作数据的代码叫做成员方法.方法定义怎样使用成员变量,这意味着类的行为和接口要由操作实例数据的方法来定义.由于类的用途是封装复杂性,所以类的内部有隐藏实现复杂性的机制.所以JA VA中提供了私有和公有的访问模式,类的公有接口代表外部的用户应该知道或可以知道的每件东西.私有的方法数据只能通过该类的成员代码来访问.这就可以确保不会发生不希望的事情.4.继承继承是指一个对象从另一个对象中获得属性的过程.是面向对象程序设计的三大原则之二,它支持按层次分类的概念.例如,波斯猫是猫的一种,猫又是哺乳动物的一种,哺乳动物又是动物的一种.如果不使用层次的概念,每个对象需要明确定义各自的全部特征.通过层次分类方式,一个对象只需要在它的类中定义是它成为唯一的各个属性,然后从父类中继承它的通用属性.因此,正是由于继承机制,才使得一个对象可以成为一个通用类的一个特定实例.一个深度继承的子类将继承它在类层次中的每个祖先的所有属性.继承与封装可以互相作用.如果一个给定的类封装了某些属性,它的任何子类将会含有同样得属性,另加各个子类所有得属性.这是面向对象程序在复杂性上呈线性而非几何增长的一个重要概念.新的子类继承其所有祖先的所有属性.子类和系统中的其他代码不会产生无法预料的交互作用.5.多态多态是指一个方法只能有一个名称,但可以有许多形态,也就是程序中可以定义多个同名的方法,用"一个接口,多个方法"来描述.可以通过方法的参数和类型引用.6.封装,继承,多态的组合使用在由封装,继承,多态所组成的环境中,程序员可以编写出比面向过程模型更健壮,更具扩展性的程序.经过仔细设计的类层次结构是重用代码的基础.封装能让程序员不必修改公有接口的代码即可实现程序的移植.多态能使程序员开发出简洁,易懂,易修改的代码.例如:汽车从继承的角度看,驾驶员都依靠继承性来驾驶不同类型(子类)的汽车,无论这辆车是轿车还是卡车,是奔驰牌还是菲亚特牌,驾驶员都能找到方向盘,手刹,换档器.经过一段时间驾驶后,都能知道手动档与自动档之间的差别,因为他们实际上都知道这两者的共同超类:传动装置.从封装的角度看,驾驶员总是看到封装好的特性.刹车隐藏了许多复杂性,其外观如此简单,用脚就能操作它.发动机,手刹,轮胎大小的实现对与刹车类的定义没有影响.从多态的角度看,刹车系统有正锁反锁之分,驾驶员只用脚踩刹车停车,同样的接口可以用来控制若干种不同的实现(正锁或反锁).这样各个独立的构件才被转换为汽车这个对象的.同样,通过使用面向对象的设计原则,程序员可以把一个复杂程序的各个构件组合在一起,形成一个一致,健壮,可维护的程序类是对象的抽象,实例是类的实现C++中对象和类有何联系和区别:它的区别就像int a = 0;中的int 和a 的区别一样。
面向过程、面向对象、面向组件、面向服务软件架构的分析与比较摘要:软件开发从汇编语言、过程式语言、面向对象、面向组件发展到面向服务,每一步都表达了不断抽象、更加贴近业务实际的发展趋势。
当前软件发展正处于从面向组件思想向面向服务思想的跨越阶段。
本文深入分析了面向过程、面向对象、面向组件、面向服务架构,得出相关的优缺点。
关键字:面向过程,面向对象,面向组件,面向服务1 背景当前,信息系统的发展越来越明显地呈现出以下特征:软件系统越来越庞大,但是软件系统内部组成模块的规模却越来越小;软件系统的功能越来越复杂,但是系统的开放性却越来越好。
信息系统软件正向着不依赖于特定的硬件和操作系统以及具有高度可重用性的方向发展。
在这种情况下,人们对这种大型复杂软件产品的质量和开发速度都有了更严格的要求,传统的开发方法已经难以满足这种需求。
首先,我们来分析一下几种传统的系统开发方法。
1〕自底向上法自底向上法出现于早期的电脑管理应用系统,即在进行系统分析和设计时自下而上,先从底层模块做起,然后逐步完成整个系统。
自底向上法使得系统的开发易于适应组织机构真正的需要;有助于发现系统的增长需要,所获得的经验有助于下一阶段的开发,易于控制和管理。
但由于方法的演变性质,自底向上法使系统难以实现其整体性;同时由于系统未进行全局规划,数据一致性和完整性难以保证;而且为了保证系统性能的需求,往往要重新调整,甚至重新设计系统。
2〕自顶向下法随着信息系统规划的扩大和对开发经验的总结与归纳,自顶向下的系统分析方法论逐步得到了发展和完善。
自顶向下法要求开发者首先制定系统的总体规划,然后逐步别离出高度结构化的子系统,从上至下实现整个系统。
运用这类方法可以为企业或机构MIS的中期或长期发展规划奠定基础,同时支持信息系统的整体性,为系统的总体规划、子系统的协调和通信提供保证。
但它同样也存在缺点:对系统分析、设计人员要求较高,在大系统中,对下层系统的实施往往缺乏约束力,开发的周期长,系统复杂,成本较高。
Python之⾯向过程和⾯向对象的区别⼀、⾯向过程 1、⾯向过程:核⼼是过程⼆字,过程指的是解决问题的步骤,好⽐如设计⼀条流⽔线,是⼀种机械式的思维⽅式。
就是程序从上到下⼀步步执⾏,⼀步步从上到下,从头到尾的解决问题。
基本设计思路就是程序⼀开始是要着⼿解决⼀个⼤的问题,然后把⼀个⼤问题分解成很多个⼩问题或⼦过程,这些⼦过程再执⾏的过程再继续分解直到⼩问题⾜够简单到可以在⼀个⼩步骤范围内解决。
2、优缺点: 优点:将复杂的问题流程化,进⽽简单化。
缺点:扩展性差 3、实例:⾯向过程式的登录注册程序 import json,redef login():'''⽤户输⼊:return:'''usename = input('⽤户名:').strip()pwd = input('密码:').strip()tel = input('电话:').strip()mail = input('邮箱:').strip()return {'usename':usename,'pwd':pwd,'tel':tel,'mail':mail}def authentication(use_info):'''判断⽤户名和密码等信息是否合法:return:'''is_valid = True # 默认合法if len(use_info['usename'])==0:print('⽤户名不能为空!')is_valid = Falseif len(use_info['pwd'])< 6:print('密码长度不得⼩于6位!')is_valid = Falseif len(re.findall('1[0-9]{10}',use_info['tel']))==0:print('电话格式不对!')is_valid = Falseif not re.search(r'@.*?.com$',use_info['mail']).group(): # 使⽤Python的r前缀,就不⽤考虑转义的问题,'*'加个?就可以让'.'采⽤⾮贪婪匹配print('邮箱格式不对')is_valid = Falsereturn {'valid':is_valid,'info':use_info}def register(auth):'''若输⼊信息合法则注册,写⼊⽂件或数据库:param auth::return:'''if auth['valid']==True:with open('data.json','w',encoding='utf-8') as f:json.dump(auth['info'],f)def main():'''主逻辑程序:return:'''use_info = login()auth = authentication(use_info)register(auth)if__name__=='__main__': # 直接调⽤时执⾏下列程序,被调⽤时不执⾏main()View Code 注意:⼀般认为,如果你只是写⼀些简单的脚本,去做⼀些⼀次性任务,⽤⾯向过程的⽅式是极好的,但如果你要处理的任务是复杂的,且需要不断迭代和维护的,那还是⽤⾯向对象最⽅便。
面向过程与面对对象的设计范式
面向过程和面向对象是两种不同的设计范式,它们分别适用于不同的应用场景和实现目标。
面向过程是一种以过程为中心的设计范式,它关注的是系统中数据的流动和处理过程,强调过程的线性执行和循序渐进。
在面向过程的设计中,程序被看作是一系列相互独立的函数或者过程,这些函数或过程通过输入输出接口传递数据,通过过程调用的方式实现数据的处理和逻辑的控制。
面向过程的设计范式适用于一些简单或者复杂但数据流程相对固定的场景,例如算法设计、数值计算、数据处理等。
面向对象是一种以对象为中心的设计范式,它关注的是系统中对象之间的交互和依赖关系,强调对象的封装、继承和多态。
在面向对象的设计中,程序被看作是一系列相互依赖的对象,这些对象通过消息传递的方式实现数据的交互和逻辑的控制。
面向对象的设计范式适用于一些需要模拟真实世界对象行为或者实现人机交互的场景,例如图形界面设计、Web应用程序开发、多媒体应用程序设计等。
面向过程和面向对象各有优缺点,在实际的软件设计过程中需要根据实际需求灵活选择,或者采用两者相结合的方式。
面向过程的优点是简单、直观,控制流程清晰;缺点是难以维护、扩展,对程序的修改影响范围大。
面向对象的优点是封装性好、可维护性高,重用性强;缺点是复杂性高,设计和开发难度大。
对于大型软件项目,一般采用面向对象的设计范式,结合良好的架构
设计和工程实践,可以实现高效、可靠的软件系统。
而对于一些小型、简单的应用程序,采用面向过程的设计范式可以更好地满足设计需求。
总之,面向过程和面向对象是两种不同的设计范式,各有其应用场景
和实现目标,需要根据实际需求进行灵活选择和结合使用。
面向对象程序设计的历史及发展姓名:郭一恒班级:0901学号:2009302540014自从计算机发展以来,程序设计的方法为了适应越来越复杂的程序设计的需要而发生了急剧的变化。
计算机刚问世时.程序设计是通过计算机的控制板用二进制机器指令打孔完成的。
随着程序设计的发展,产生了汇编语言,程序员用助记符号代替机器指令,能够处理更大更复杂的程序。
随着计算机处理事物的越来越多,产生了高级程序设计语言,它们给程序员提供更多的处理复杂事务的工具。
但它们不是支持结构清晰、易于读懂的程序设计语言。
60年代诞生了结构化的程序语言,这就是者如c语言和Pascal语言支持的方法。
结构化程序设计语言的应用使得有可能较容易地编写复杂程度适中的程序。
一旦达到一定的复杂程度度,使用结构比的程序语言也会无法控制,其复杂程度已远远超过了程序员的管理所及。
如今,许多程序没汁语言已经或达到了结构化程序设汁方法的极限。
应运而生的面向对象的程序设汁方法就是为了解决这类问题的。
面向对象的程序设汁方法汲取了结构化程序设计方法的先进的思想,并把它同支持用户用新方法进行程序设计的概念结合起来。
所有的面向对象的程序设计语言一般都包含三个最基本的概念:对象、继承性和多态性。
一、面向对象程序设计的历史面向对象程序设计方法作为90年代程序设计的新思想、新方法,已经和正在给计算机界带来一场深刻的革命。
实际上,对面向对象程序设计方法的研究由来已久。
早在本世纪40年代,在对数字模拟的分析研究中就引入了“对象”的概念,随后在对模拟系统的分析中,大量的模拟仿真语言,如Simscript、GPSS、CSL和SimulaⅡ,为此应运而生。
在Simula Ⅱ中的“活动(Activity)、过程(Process)”概念正是如今OOPL中“类”和“对象”概念的雏型。
60年代中期,随着SimulaI中不断引入子类、模块、封装等新概念,导致了Simula67,Modula—2等具有OOP特点的一些模拟仿真语言的出现,它们被称为OOPL的祖先或前身。
第22卷第5期2006年10月赤峰学院学报Journal o f Ch ifeng C olleg eV ol.22N o.5Oct.2006面向过程的编程与面向对象的编程张丽霞(乌海职业技术学院 机电工程系,内蒙古 乌海 016000) 摘 要:从面向过程与面向对象编程的区别入手,指明了面向过程的编程是围绕“什么正在发生”编写,程序以线性步骤为特征,被理解为作用于数据的代码;面向对象编程是围绕“谁正在受影响”编写,程序围绕着程序的数据(对象)和针对该对象而严格定义的接口来组织程序,它的特点是数据控制代码的访问.接着,以具体的例子说明二者编程的不同特点.最后对面向对象的编程模型的特点进行了详细的介绍.关键词:面向过程;面向对象;面向对象编程的特点中图分类号:T P311.11文献标识码:A文章编号:1673-260X(2006)05-0041-02 经常有人问到什么是面向过程的编程,什么是面向对象的编程,编程时应使用“面向对象”的风格编程还是使用“面向过程”的风格编程?对于这个问题人们各持己见.我们知道所有程序均由两种元素组成:数据和代码.面向过程的编程是围绕着“什么正在发生”而编写,按这种模型编写的程序以一系列的线性步骤(代码)为特征,可被理解为作用于数据的代码.而面向对象编程则是围绕“谁正在受影响”而编写的,按这种模型编写的程序围绕着程序的数据(对象)和针对该对象而严格定义的接口来组织程序,它的特点是数据控制代码的访问.可见“面向对象”的编程与“面向过程”的编程迥然不同,它摆脱了面向过程编程的传统的从首到尾单纯编写代码的枯燥的程序开发方式,把创建对象和程序设计结合起来,大大地简化了程序开发的过程.例如:创建如下图所示文本显示器,要求: 在文本显示器中,单击“用鼠标单击这里”按钮,在文本框中就会出现“进入V B世界”字样,如果单击“清除文字”按钮,文本框中的文字将不会显示.单击“退出”按钮,退出文本显示器.那么用面向过程的设计与面向对象的设计有什么区别呢?在面向过程的程序设计中,一个程序通常按照具体的功能要求分解为多个过程或函数,通过过程的独立和细化来简化整个调试,通过函数层次的逐步降低来最终把握问题的细节.例如:用标准C语言来实现构造文本显示器的程序,需要把问题分解为界面绘制过程,根据鼠标键盘的输入信息确定操作意图的过程,根据操作意图进行响应处理的过程和根据响应处理单调界面重新绘制过程.当用户用鼠标单击“清除文字”按钮时,程序将根据鼠标的位置来确认用户的意图,然后通过重新绘制“清除文字”按钮使用户感觉到按钮的下陷效果,最后在文字处进行重新绘制,使文字处变成空白,通过以上一系列过程,程序实现了“清除文字”功能,而这些过程是由许多段子程序的不断调用完成.在面向对象程序设计(O OP)方法中,采用了不同的思想.OOP首先引入了对象的概念.在自然界中,对象是指人、动物、山水、建筑等;在O O中,对象则是指O O中现实的事物,如V B中的窗体、控件等采用面向:/PP.14对象方法来完成文本显示器程序时,整个界面不再是一个象素间没有区别的图形,而是几个不同的对象:如V B中窗体、文本框控件、标签控件和按钮控件,这些都是一个个对象.因此,面向对象的编程方法与面向过程的编程方法相比存在本质上的差异.那样在面向对象程序设计方法中,如何实现上述示例?首先创建对象,如文本框、标签、按钮和窗体,然后描述对象的属性,最后根据对象对应的事件处理过程来进行简单的编程,把程序的功能细化为对象的功能和对象之间的联系.与面向过程编程相比,不必再需要逐条线来绘制按钮、文本框等图形了,因为它们是作为对象插入到窗体中,只要改变它们的属性就可以对它们的大小、位置进行调节;不必再需要根据鼠标的位置确定用户的意图,不必再需要通过编程重新绘制“清除文字”按钮来制造按钮下陷的效果,本身因为鼠标对按钮对象的激活和下陷效果是按钮对象具有的功能;我们需要做的仅仅是对事件(如鼠标单击)发生后进行事件处理程序的编制,把对象之间的关系进行程序描述而已,所以程序员的编程量大大地减少了,程序的可读性也得到了增强.可见,过程化编程模式:参数输入------|代码|------结果输出为实现某个功能,参数被传入某个处理过程,最后传回结果.面向对象编程模式:设计界面------对象(包括数据和操作)在OOP中,功能是通过与对象的通讯获得的.对象可以被定义为一个封装了状态和行为的实体;或者说是数据结构(或属性)和操作.状态实际上是为执行行为而必须存于对象之中的数据、信息.对象的界面,是一组对象能够响应的消息的集合.消息是对象通讯的方式,因而也是获得功能的方式.对象受到发给他的消息后,或者执行一个内部操作(有时成为方法或过程),或者再去调用其他对象的操作.所有对象都是类的实例.类是具有相同特点的对象的集合,或者也可以说,类是可用于产生对象的一个模版.对象响应一个消息而调用的方法,由接受该消息的对象自己决定.类可以以一种层次结构来安排.在这个层次结构中,子类可以从比他高的类中继承得到状态和方法.当对象接收到一个消息后,寻找相应的方法的过程将在从该对象的类开始,并在该类所处的层次结构中展开,最后,直到找着该方法,或者什么也没找到(将会报错).可见,面向对象的模型在组织方式上有抽象,封装,继承和多态的好处.抽象面向对象程序设计的基本要素是抽象,程序员通过抽象来管理复杂性.管理抽象的有效方法是使用层次式的分类特性,这种方法允许用户根据物理含义分解一个复杂的系统,把它划分成更容易管理的块.例如,一个矩阵对象是一个独立的对象,它包括了矩阵行和列的数据,另外还包括了矩阵复制、矩阵乘法、加法等方法,我们把这个抽象的对象用层次抽象来管理(数据和方法),用户使用它时可以通过矩阵类提供的方法和它打交道,而不用了解具体的实现方法.面向对象程序设计的本质:这些抽象的对象可以被看作具体的实体,这些实体对用来告诉我们作什么的消息进行响应.封装封装是它将对象的数据和方法包装在一起,而形成的一些实体或者说是一种数据结构,它使这些实体变得独立,当外界必须和对象发生关系时,便可以通过预先设定好的渠道进行交流,这些渠道就是所谓的方法,通过对象的方法可以和对象发生交谈,而不用了解具体的实现方法.可见,一个对象内表示了它们以此程序语言应完成的任务,对外,则提供给用户它所能完成任务的工作和方法,一个对象包含了该对象的数据及其存取方法,用户能通过其提供的方法存取其中的数据,以及控制该对象的部分行为.例如在V B中用户可以把确定列表框选项的属性和选择某选项时所执行的代码封装在一个控件里,然后把控件加到窗体中.在JA VA中,最基本的封装单元是类,一个类定义着将由一组对象所共享的行为(数据和代码).一个类的每个对象均包含它所定义的结构与行为,这些对象就好象是一个模子铸造出来的,所以对象也叫做类的实例.在定义一个类时,需要指定构成该类的代码与数据.特别是,类所定义的对象叫做成员变量或实例变量,操作数据的代码叫做成员方法.方法定义怎样使用成员变量,这意味着类的行为和接口要由操作实例数据的方法来定义.由于类的用途是封装复杂性,所以类的内部有隐藏实现复杂性的机制.所以JA VA中提供了私有和公有的访问模式,类的公有接口代表外部的用户应该知道或可以知道的每件东西.私有的方法数据只能通过该类的成员代码来访问.这就可以确保不会发生不希望的事情.继承继承是指一个对象从另一个对象中获得属性的过程,它支持按层次分类的概念.如果不使用层次的概念,每个对象需要明确定义各自的全部特征.通过层次分类方式,一个对象只需要在它的类中定义是它成为唯一的各个属性,然后从父类中继承它的通用属性.因此,正是由于继承机制,才使得一个对象可以成为一个通用类的一个特定实例.一个深度继承的子类将继承它在类层次中的每个祖先的所有属性.可见继承性说明了:子类延用父类特征的能力.如果父类特征发生改变,则子类将继承这些新特征;它描述了类之间的共同属性,减少了相似类之间的重复说明;它体现了一般化及特殊化的原则;它提供了一种明确表达共性的方法,使程序员对共同的操作及属性只需说明一次,并且可以具体地扩展和细化这些属性及操作.例如,现有一个表示基本灯的类,用户可以定义其子类,该子类可拥有这个基类灯类的全部功能,用户还可添加上(下转第6页)42 4机的研究,其目的是为了解决计算机中的能耗问题.若计算机中的每一步操作都可以改造为可逆操作,那么在量子力学中,它就可以用一个么正变换来表示.早期量子计算机,实际上是用量子力学语言描述的经典计算机,并没有用到量子力学的本质特性,如量子态的叠加性和相干性.半个多世纪以来电子计算机的基本原理并没有任何改变,是建立在对二进制“比特”的操作上.机器性能的提高主要靠缩小元器件的尺寸.预计再过20年左右,将要降到几个原子的大小,而当电路线宽小于10纳米时,电子波动性必须考虑,这时会出现种种新的物理现象,称为量子效应.利用量子效应工作的电子元件称为量子元件,量子处理器和量子计算机的出现将是必然.而实现量子计算,需要大量纳米科技的基础研究成果.所谓纳米是一个长度概念,一纳米为十亿分之一米.纳米技术是以纳米材料为基础的.纳米材料被定义为在尺度上小于一百纳米材料体系,在此体积下,物质将表现出不同于常态的特殊性,在晶粒尺寸、表面面积与体内原子数比和晶粒形状等方面与一般材料有很大的不同.纳米材料作为新一代革命性材料的最基本建构单元,使得我们可以进入自然尺度之外的空间来做观察,纳米科技的研究已发掘出一些新的制造和操纵材料,可用于处理器、内存等芯片的制造过程,将给传统IT技术带来新的突破和商机.总体上讲,“双核(多核)心”技术、新型材料技术、量子计算和纳米技术将是P4之后通用CPU的发展方向.不过,在实际生活中,影响CPU技术的还不止这些技术上的因素,还有其它一些不确定的因素,包括商业因素等.我们只有全面衡量各种因素,才能正确地把握CP U 的发展方向.(责任编辑 白海龙)(上接第33页)量居全世界第一,得天独厚的药材资源,为赤峰医药产业提供有力支持,赤峰制药集团可以利用这种天然优势,力求打造北方最大的原料药生产基地.赤峰制药集团2000吨土霉素扩产是自治区重点工程,力争“十一五”期末土霉素产量6000吨,居全国第二,盐酸土霉素达800吨,居全国第三,灰黄土霉素达300吨,居全国第一.把赤峰建成特色药、中成药的生产基地,将生物产业集群做大.3.3 食品工业集群赤峰食品工业具有一定的比较优势,随着人民生活水平的提高,食品工业有着广阔的发展空间和巨大的市场需求.赤峰地区具有天然资源优势,可以充分带动赤峰农业产业化,也能够吸引大量的剩余劳动力,草原兴发和塞飞亚两个规模较大的龙头企业可以带动食品工业快速发展,形成集体优势.赤峰伊利乳业有限责任公司日产120吨液态奶项目开工,此项目可带动周边10个旗县区发展奶牛业.塞飞亚集团2000万只肉鸭项目建成投产,此项目可安置7000人就业,酒类产业有宁城老窖公司和燕京啤酒赤峰有限公司.这些龙头企业可以促使集群的形成与发展.参考文献:[1]李小建.经济地理学.高等教育出版社,2005.[2]高洪森.区域经济学.中国人民大学出版社,2003.(责任编辑 白海龙)(上接第42页)自己须要的其他功能.多态多态是指一个方法只能有一个名称,但可以有许多形态,也就是程序中可以定义多个同名的方法,用“一个接口,多个方法”来描述.可以通过方法的参数和类型引用.总之,在面向对象的编程中,封装能让程序员不必修改公有接口的代码即可实现程序的移植;继承能使重用代码成为可能;多态能使程序员开发出简洁,易懂,易修改的代码.同时,使用面向对象的思维方法,非常符合人类的思维习惯,它把一个把业务逻辑从具体的编程技术当中抽象出来,这个抽象的过程是自上而下的,也就是先不考虑问题解决的细节,把问题的最主要的方面抽象成为一个简单的框架,集中精力思考如何解决主要矛盾,然后在解决问题的过程中,再把问题的细节分割成一个一个小问题,再专门去解决细节问题.当然,不能断言,面向对象编程要比面向过程编程好,每种编程方式都有其优势的一面,如面向过程的编程开发快,发布快;面向对象的编程易于维护,可扩展和代码重用.到底哪个编程模型好,看用户的实际需要与便利,以便在更具体的细节上进行深究探索,来开发出更实用的好项目.参考文献:[1]杨敏.V isual F oxPro6.0实用教程[M].成都:电子科技大学出版社,2001.[2]丁爱萍.V isual BASIC程序设计(第2版)[M].北京:电子工业出版社,2003.[3]张效祥.Jav a就业培训教程[M].北京:清华大学出版社,2006. 2.(责任编辑 白秀云)6 4。
举例说明面向对象和面向过程的区别两种方法都是编程中的比较常用的方法,从理论上来说,都能达到用计算机程序来解决实际问题的LI的,只不过是其中所体现出来的思想不一样而已。
面向过程:面向过程的思想是把一个项口、一件事情按照一定的顺疗;,从头到尾一步一步地做下去,先做什么,后做什么,一直到结束。
这种思想比较好理解,其实这也是一个人做事的方法。
而向对象:面向对象的思想是把一个项H、一件事情分成更小的项或者说分成一个个更小的部分,每一部分负责什么方面的功能,最后再由这些部分组合而成为一个整体。
这种思想比较适合多人的分工合作,就像一个大的机关,分成各个部门,每个部门分别负责某样职能,各个部门可以充分发挥自己的特色,只要符合一定前提就行了。
举例说明1:比如刚才说的一个大的机关,要做某一个项LI,从面向过程的思想来说,应该是这样分析的,先怎么样,再怎么样,最后怎么样。
第一样应该如何完成,第二样应该如何完成等等。
等到每一步骤都完成,项U也就完成了。
而面向对象的思想则应该是这样想的,这个项口是山儿个部分组成的,我们就做好分工,成立一个部门来做一个部分的功能,另一个部门来做另一个部分。
各个部门可以不用理解其他部门的事,只要完成自己那一部分的事情就OKTo举例说明2:乂比如我们有一台演出,为简单起见,假设有如下流程:主持人开场一一演员一表演一一演员二表演一一主持人总结。
用面向过程的思想来分析,就是先完成主持人开场,再完成演员一的表演,再完成演员二的表演,最后完成主持人的总结。
而如果用面向对象的思想来分析,就应该是这样的。
这个演出由两大部分组成:主持人、演员。
与主持人相关的:开场、总结。
与演员相关的:演员编号、所演的节目。
然后这台演出就可以这样策划:需要一个主持人a,需要两个演员b、Co演出的事情可以表示为:3的开场一一> b、C的编号和节tl ——> a的总结。
面向对象和面向过程的区别示例之下棋面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
摘要:面向过程方法的弊端引发了20世纪60年代的“软件危机”,面向对象方法的出现为软件开发开辟了新的出路。
从分析“软件危机”的起因着手,阐述了面向过程方法的弊端,介绍了面向对象方法的特点,并总结了面向对象方法优越性和局限性。
关键词:软件开发;面向过程;面向对象中图分类号:tp311文献标识码:a文章编号:1009-3044(2012)09-2136-03the revolution from structural method to object-oriented methodye xuan(school of educational technolegy, beijing normal university, beijing 100875, china)从软件工程的诞生开始,软件开发的方法就处于不断进步的进程中,其中从面向过程方法进化到面向对象方法是一次伟大的飞跃,是什么导致了这次转变?面向对象方法又给软件工程带来了什么变化?这些得从“软件危机”谈起。
1“软件危机”与面向过程方法20世纪60年代中期,随着计算机技术的逐步成熟,计算机应用范围的逐渐扩大,软件开发领域急剧膨胀,这时,软件开发人员开始面临一个十分严峻的问题――“软件危机”。
“软件危机”主要表现为三点:第一,开发出来的软件的功能和用户的需求往往“牛头不对马嘴”;第二,软件系统的规模和复杂度的扩大让开发人员力不从心,开发过程中的一些错误已经达到开发人员无法掌控的地步;第三,开发出的软件可维护性很差,要复用已有成果或者对其进行扩展都很困难,软件的进化也很难跟上硬件发展的速度。
追究“软件危机”产生的原因,固然有一部分是因为开发者缺乏对大规模软件的管理经验,缺乏正确的方法学指导或者是开发工具的支持(杨健,张晓玲,周少,2006,135-136),但是最关键的问题在于――当时大多数软件开发工作的全过程,包括分析,设计以及编程实现等,都采用面向过程方法。
具体来说,在分析阶段,开发人员根据面临的情况,如用户的需求,软件要求的功能等,做出一个物理模型,其次转换成逻辑模型,再通过数据流分析,把这个模型转化数据流图,记录数据字典。
在设计阶段,开发人员根据数据流图划分数据类型,并映射到不同的程序模块类型,通过这样完成分析模型到设计模型的转变,并设计出数据结构图。
然后,开发人员在此基础上详细的设计每个程序模块内部的结构和算法。
常常是把大模块又分成很多小模块,多次分解,最后再设计完成每个小模块的内容。
在实现阶段,利用面向过程的编程语言(如c语言等)进行编程,具体实现整个软件系统。
之所以说这一套方法是导致“软件危机”的关键,是因为它不论是在分析和设计上,还是在编程实现上都存在很大的弊端。
第一,面向过程方法的分析手段是不够妥当的。
整个分析和设计阶段可以概括为“需求-数据流-程序模块”的模式,所以对于需要解决的问题,在分析阶段并不能直观的显示出各种事物及其关系,而是映射到数据流中进行分析。
因此,当系统比较复杂的时候,很难判断基于数据的分析是否有偏差,是否相对于原本的实际问题有出入,或是否存在理解上的错误。
也正是因为所有的分析工作是基于数据流的,开发人员在分析阶段就面临和用户沟通上的困难,他们很难和用户解释数据流图中的内容代表了什么,很难通过沟通发现分析结果和用户需求的差距在哪。
并且,如果用户在开发工作的中途想改变一些需求或是外界条件发生了变化,开发人员也不能直接改动分析结果,必须重新映射到数据上再做调整。
第二,从分析阶段到设计阶段的转化是有很大的隐患的。
所谓的“数据―程序模块”的转型就是依照一些对应原则,把数据流图转化成程序模块,这两种不同的体系之间的转换是否正确,是否合理是没有保障的。
这种“需求-数据流-程序模块”的模式就像多人传话一样,第一个人传话给第二个人,第二个人根据自己的理解把话传给第三个人,第三个人再加上自己的理解,得到的结果和原话已经不是一个意思。
原本的内容经每个步骤都被不同的体系“转义”了一遍,这样很可能导致设计出的结果和软件需求的本来面貌相差甚远。
第三,由于面向过程的程序语言本身存在很多不足,导致软件开发的实现阶段出现了很多问题。
首先,程序的安全性缺乏保障。
很多关键的数据既可以被作用于它们的操作访问,也可以被其他的操作访问。
并且,面向过程的程序操作都属于“白盒操作”,所有细节都被暴露在外。
一个疏忽的数据修改或者程序调用都可能导致整个系统崩溃。
其次,程序员的工作非常繁杂。
由于数据和函数是分开来处理的,程序员在编程的时候要考虑的因素就很多,每次编写一个函数都必须把详细的注释添加到数据字典中,对于不同类的数据进行一种操作或者同一类数据进行不同操作都必须写不同的代码。
这种编程对程序员的水平要求非常高,仅仅让数据和函数一直保持兼容就已经是程序员沉重的负担。
在团体合作中,一个程序员要接手另一个程序员的工作往往需要阅读数十页的数据字典,不同的程序员编写的程序可能还存在着名称重复,风格迥异等冲突,这些问题在复杂的系统中将凭空地加大程序员的工作量。
再次,软件的可维护性很差。
由于数据和函数代码的分离,每当数据发生改动,所有相关的函数都要重写,想对整个程序进行扩充,升级,或者移植到别的背景下重用都面临着大量的代码修改。
2面向对象方法我们可以看到,面向过程方法确实给软件开发工作带来了很多困扰,而面向对象方法正是在这种情况下诞生的。
面向对象总的来说有三大特点的:封装性,继承性和多态性。
封装性是面向对象最基本的特点,因为它体现了面向对象最基本的思想:客观世界是由各种对象组成的,复杂的对象可以由比较简单的对象以某种方式组合而成(符于江,2008,451-456)。
所有的对象都具有静态属性和动态行为,把相似对象的属性和行为抽象出来,用这些共同的属性(数据)和行为(方法)构成类,作为创建具体对象的模板。
封装性就是指把关于一个类的所有数据和方法一起封装在类的内部,只通过一些方法作为对外沟通的接口,外界只能通过这些接口和对象进行联系,而对象内部的很多数据和具体操作是对外不可见的。
继承性是指对于一些具有一般意义的类,可以创建它们的子类,子类可以继承一般类的所有属性和方法,同时可以根据自己的特性,修改继承得来的属性和方法或者添加自己独有的属性和方法。
比如对于一般类“亚洲人”,我们可以创建子类“中国人”,“韩国人”等。
多态性有两种形式。
第一种是一个类中同名字的方法可以接受不同类型的参数,对于不同类型的参数的处理是不同的。
比如在一个类中定义“add”方法实现数的相加,它既可以处理整形的参数,也可以处理浮点型的参数,还可以处理一些自定义类的参数,但是针对每个类型都有各自的处理操作。
第二种多态和继承性有关。
由于某个父类可以有多个子类,每个子类都可以根据自己的特征修改父类中的属性和方法,当把这些子类当成父类来用的时候(如java中的上转型对象或是接口回调),相同的父类方法就会有不同的实现方式。
例如一个java 程序中,对于父类“动物”中的方法“叫”,用子类“狗”的上转型对象实现该方法则输出“汪汪”,用子类“猫”的上转型对象实现该方法则输出“喵喵”。
基于以上三大特点,面向对象方法导致了对整个软件开发过程的彻底变革。
在软件开发的分析,设计和实现阶段都和面向过程方法截然不同。
开发人员首先按照需求分析出软件的每个必备功能。
然后归纳属性,确定对象及对象之间的关系。
再进一步把功能分配给每个对象,构建对象的行为。
接下来对每个对象的方法和对象之间的交互作进一步的细化。
再接着确定可重用的类和部件,用结构图画出各个类,部件的结构和相互依赖关系。
最后再对软硬件的相互依赖关系进行描述。
在以上分析和设计工作完成之后,开发人员利用面向对象程序语言进行编程来达到软件功能的实现。
3面向对象方法的优越性面向对象方法之所以能把软件开发带入了一片新天地,是因为它在以下三个方面都有卓越之处。
3.1整体开发思维抛开具体操作流程不说,面向对象方法首先对解决问题的整体思维进行了人性化的革新。
其人性化主要体现在以下四点:首先,人们生活的现实世界是个体,群体及各种关系组成的,面向对象的系统也是如此。
对象代表个体,类代表群体,对象之间,类之间,类与对象之间通过方法调用建立各种关系。
其次,从大众个体中总结出一类共同的属性和行为,从而形成类的手段正是人类抽象思维的应用。
抽象思维是人类最基本,最习惯的思维之一。
再次,面向对象允许开发人员一开始只拟定系统的大致框架,即确定主要的类及其关系,之后再逐步对其进行细化和拓展。
这和人类逐步深入的思考习惯是相一致的。
最后,面向对象方法大大简化了开发人员思考问题的复杂度。
比如对于一个子类,开发人员可以理所当然的认定它已经拥有父类的所有一般特征,只要把精力放在思考子类的特性上就可以了。
面向过程要求程序员必须从数据流动的角度思考待解决的问题,而面向对象的这些人性化因素让开发人员摆脱了这种被迫的“机器化”思考的尴尬境地,用自然贴切的思维考虑问题。
3.2分析和设计面向对象方法是分析和设计阶段的合理性有了很好的改善。
面向对象的分析和设计采用的是“需求-对象-类”的模式,用对象和类直观地描述系统中的事物及其关系,这样就解决了面向过程方法所导致的一系列问题。
在分析过程中,这种直观性原本的保留了所有事物及其关系的原貌,因此在构建对象和抽象出类的时候,很容易被发现在理解上的偏差。
同时,开发人员也很容易向用户解释各个类和对象的含义,可以及时得到用户的反馈。
处理需求的改变或是外部条件的改变时,也可以直接修改相应的类和对象。
除此之外,对于问题的描述和对于问题的解决都应用同一套类和对象系统,因此软件开发的分析工作和设计工作是连续的,甚至是部分重叠的,不存在面向过程中从数据流到程序模块的转化,不用担心因为一个系统到另一个系统的映射不当导致结果和目标的偏离。
3.3编程实现面向对象编程语言的应用使得软件工程的实现过程有了很大的改进。
首先,程序的安全性有了明显的提高。
由于类的封装,对象中只有少数的成员和方法可以被外接直接调用,对象内部的实现细节也是被隐藏的。
这样有效降低了程序各部分间的依赖性,整个系统一般不会因为某处变动而引发整体混乱。
其次,面向对象把开发人员的编程工作变得比较轻松和方便。
每个对象的数据和操作都被封装在一起,因此开发人员很容易保持数据和方法的兼容性,并且编程时只需要对每个类进行说明,不需把对于每个数据,每个方法的描述都写进数据字典。
对于被封装的方法,只要依据访问规则就可以使用,不必了解实现细节。
类中描述了一类个体的共有特征,在创建对象的时候这些描述不需要一遍又一遍的重复。
类和对象的设置还易于分类,管理和查找。
这些改变都在很大程度上降低了开发工作对程序员编程水平的要求。
再次,面向对象让团体合作的编程更加顺畅。