分享

面向对象和面向过程的区别

 SkySeraph 2010-07-30
                                                  面向对象和面向过程的区别
  ★面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
  ★面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
  例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用分别的函数来实现,问题就解决了。
  而面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为 1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的i变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。
  可以明显地看出,★面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了总多步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。
  ★功能上的统一保证了面向对象设计的可扩展性。比如我要加入悔棋的功能,如果要改动面向过程的设计,那么从输入到判断到显示这一连串的步骤都要改动,甚至步骤之间的循序都要进行大规模调整。如果是面向对象的话,只用改动棋盘对象就行了,棋盘系统保存了黑白双方的棋谱,简单回溯就可以了,而显示和规则判断则不用顾及,同时整个对对象功能的调用顺序都没有变化,改动只是局部的。
  再比如我要把这个五子棋游戏改为围棋游戏,如果你是面向过程设计,那么五子棋的规则就分布在了你的程序的每一个角落,要改动还不如重写。但是如果你当初就是面向对象的设计,那么你只用改动规则对象就可以了,五子棋和围棋的区别不就是规则吗?(当然棋盘大小好像也不一样,但是你会觉得这是一个难题吗?直接在棋盘对象中进行一番小改动就可以了。)而下棋的大致步骤从面向对象的角度来看没有任何变化。
  当然,要达到改动只是局部的需要设计的人有足够的经验,使用对象不能保证你的程序就是面向对象,初学者或者很蹩脚的程序员很可能以面向对象之虚而行面向过程之实,这样设计出来的所谓面向对象的程序很难有良好的可移植性和可扩展性。
还有一说法~面向过程就像两条生产不同类型汽车的流水线
而面向对象则是生产出玻璃,底盘。。。。等等后再分给不同的汽车

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/guolei0451/archive/2006/11/02/1362135.aspx

                                                       面向过程、基于对象、面向对象,到底有什么区别?
我们可理解“纯粹”的面向对象程序设计方法是什么样的:  
  (1)   所有东西都是对象。可将对象想象成一种新型变量;它保存着数据,但可要求它对自身进行操作。理论上讲,可从要解决的问题身上提出所有概念性的组件,然后在程序中将其表达为一个对象。  
  (2)   程序是一大堆对象的组合;通过消息传递,各对象知道自己该做些什么。为了向对象发出请求,需向那个对象“发送一条消息”。更具体地讲,可将消息想象为一个调用请求,它调用的是从属于目标对象的一个子例程或函数。  
  (3)   每个对象都有自己的存储空间,可容纳其他对象。或者说,通过封装现有对象,可制作出新型对象。所以,尽管对象的概念非常简单,但在程序中却可达到任意高的复杂程度。  
  (4)   每个对象都有一种类型。根据语法,每个对象都是某个“类”的一个“实例”。其中,“类”(Class)是“类型”(Type)的同义词。一个类最重要的特征就是“能将什么消息发给它?”。  
  (5)   同一类所有对象都能接收相同的消息。这实际是别有含义的一种说法,大家不久便能理解。由于类型为“圆”(Circle)的一个对象也属于类型为“形状”(Shape)的一个对象,所以一个圆完全能接收形状消息。这意味着可让程序代码统一指挥“形状”,令其自动控制所有符合“形状”描述的对象,其中自然包括“圆”。这一特性称为对象的“可替换性”,是OOP最重要的概念之一。  
  一些语言设计者认为面向对象的程序设计本身并不足以方便解决所有形式的程序问题,提倡将不同的方法组合成“多形程序设计语言”
面向对象其实是现实世界模型的自然延伸。现实世界中任何实体都可以看作是对象。
对象之间通过消息相互作用。另外,现实世界中任何实体都可归属于某类事物,
任何对象都是某一类事物的实例。如果说传统的过程式编程语言是以过程为中心以算法为驱动的话,
面向对象的编程语言则是以对象为中心以消息为驱动。用公式表示,过程式编程语言为:程序=算法+数据;
面向对象编程语言为:程序=对象+消息。
面向对象要完全支持封装、继承和多态,如C++和Java;而基于对象只要支持封装就可以了,如VB6.0。
in object theory, OO is seperated to object-based and class-based world.
Java, C++, C# are class-based. You have class to describe your object.
object-based language does not have class. What you have is simply objects.And you may use prototype to clone objects.(modern object-based languages utilize prototype and traits,which make them more and more like class-based language)
I feel python is kind of an object-based language.面向对象,将软件程序的元素构造成对象,指定对象类型,表示对象属性,和描述对象方法,
定义对象后即可用于创建这种
类型的对象的具体实例并构造其他更复杂的对象类型。
基于对象的编程语言,并不支持所有面向对象的功能,往往基于对象只提供一部分面向对象的功能,
有时加入自己的新功能。
例:java是面向对象的程序设计语言,JAVASCRIPT是基于对象的程序设计语言(脚本语言)
,javascript并不支持所有
java面向对象的功能,致使支持其中一部分!
按照传统的思想,面向对象和基于对象之间的界限可以说是既清楚又模糊。说它清楚,
是因为面向对象语言必须从语法上直
接支持继承和动态绑定,也就是虚函数机制。说它模糊,是因为基于对象的语言可以
在没有语法直接支持的情况下,达成与
面向对象语言相同的效果。举个例子,在很多用C语言写成的操作系统里,“File”这个概念,
既可以代表磁盘文件,也可
以代表串行口,还可以代表各种各样的设备,这不是多态性是什么?
有一个概念大家必须改变,就大部分当前项目而言,C语言已经是一种基于对象甚至面向对象的语言,
而不是单纯的“面向过程”
语言,例如在Win32 API编程中,实际上我们就是在按照面向对象的模式撰写程序。
另外,最经典的基于对象语言是Ada83。
按照我现在的体会,面向对象这个概念,更多的是说一种环境和一种设计思维方式。要谈这个问题,实在需要不少篇幅,
这里就不多说了。
Object-oriented支持Polymorphism,而Object-based不支持Polymorphism.主要的区别就在于此。
支持多态的代价是额外的间接性--
不论是在“内存的获得”或是在“类型的决断”上。
C++通过class的pointers和references来支持多态,这种程序设计风格就叫面向对象。
C++也支持具体的ADT程序风格,被称为基于对象,它只支持封装,不支持类型的扩充。
一个Object-based设计可能比一个对等的Object-oriented设计速度更快而且空间更紧凑。
速度快是因为所有的函数引发操作都在编译时期解析完成,不需要设置virtual机制;
空间紧凑则是因为每一个class object不需要负担传统上为了支持virtual机制而需要的额外负担。
不过,Object-based设计比较没有弹性。
这是引用《深度探索C++对象模型》上第一章最后几段的话。上面有更详细的讨论!
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zwj0231075/archive/2006/05/21/747414.aspx

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多