谈谈“面向对象”与“面向过程”

我认为“面向对象”是类的层次上进行的分析和设计,而“面向过程”是在系统的流程上的分析和设计?我这样说有没有错。

拿“注册系统”举例来说,一拿到这个模块,用“面向对象”的方法,我们应该先分析其中类和的层次,比如其中有“表单类”,“权限类”,“数据库类”,“检查类”等,“面向对象”是从这些的的交互上来设计系统,而“面向过程”则把注册流程分解为多个步骤:1、填写注册单;2、检查注册内容;3、判断用户权限;4、处理注册请求。“面向过程”是从系统流程上进行分析和设计,把他们进行模块化?

请大家发表自己的看法,谢谢。
[该贴被admin于2010-08-09 16:35修改过]

谈谈俺的体会:

a.) 面向过程的方式,其思维方式和方法布局注重深度, 其调用链形成一棵链条很长的树(纵向联系),上级节点和下级节点互为上下文,上级节点单独抽出去无法完成任何工作,越核心的功能依赖层次越低的下层实现。联系太紧密,所以很难重用,从而导致修改时的链条也很长。

b.) 面向对象的方式,其方法布局是尽量把调用的级次链拉平,将方法原子化,然后分离到独立的功能包:类里面.更注重广度。并强调类完成功能时越孤立越好。与其它类的关系越不紧密越好(斩断上下文),如果需要与其它类通信,也是通过相对固定的接口来联系(横向联系)。面向对象的过程也就是把方法布局拉平,并封装到平级对象中的过程。

一个是“松耦合”,一个是“紧聚合”?


打个比喻:

面向过程象那种直接到位的性格,象李逵、张飞之类爽快性格。

面向对象则是吴用、诸葛亮之类善用智谋者,做一件事情不只想到将其功能完成,还考虑如何留有回旋的余地。

面向过程是横向的话,面向对象则是纵向的。

如果面向过程是注重流程,是就事论事的流程,那么面向对象则是注重流程中的抽象模型,如注册表单模型对象的抽象。

面向对象不是和面向过程对等的,而是在面向过程基础上封装的,在面向对象系统中,不是没有过程process或operations,而是将Process/Operation也看成一个处理对象,遵循操作封闭等原则。正因为包含过程因素,才使得一些只有面向过程思维的人去放大过分利用这些过程因素,编制出面向过程的系统出来。

所以,面向对象的思想很重要,企业应用中以PoEAA为宗旨,Evans DDD为可操作建模方法,结合分析模式、原型模型和设计模式来实现面向对象的分析设计过程。

我也举个例子吧。

比如我们现实生活当中的招聘,如何通知每位应聘者以规定的时间到达指定的目的地是件非常棘手的事情。

利用面向过程的方法需要在程序查询出所有应聘的人,然后逐一通知他们应该在什么时间去什么地点做什么事情。这时,老总来了电话说,所有面试的人员改到别的地方进行考试,该如何处理?我们只好修改程序,将以前的流程改为查询所有应聘的人员,根据笔试或面试将其分类,并逐一通知他们考试的地点。

同样一件事情,如果用面向对象的方法来做,我们所要做的就是发布考试的时间地点就可以了,不需要关心应聘者是来面试还是笔试的。即做一个信息类,向外界暴露一个取信息的方法就可以了,其它的事情就是应聘者关心的事情了。即所有应聘者应该为自己的前途负责,所以他们都应该不时的关注信息以确保自己能够得到应聘的机会。这样一来,即使老总再打电话来,我们只需要改信息类所提供的信息就可以了。

这里有个责任转移的过程。

这个帖子顶一下,我似乎以前编程就面向过程了。前段日子去支付宝面试,提到设计模式,回来后马上买了两本设计模式的书看,刚开始看不懂,觉得搞了几个类,相互调来调去的玩高深。书上主要拿J2SE的界面型的例子,做J2EE的看着不爽。。后来还是网上的文章好,google上一搜索,就查到JDON上的文章了,写的比较容易懂。。花了一个礼拜时间,把设计模式了解了一下,知道哪个模式是什么意思,大概在什么样的需求和情况下使用,大概如何使用,把小例子看了一下,心里有个大概印象了,就好象把武功口诀给记下来了,今后要在项目实践中尽量运用上去。。设计模式的路漫长着。。。。
看到楼主的帖子,感觉以前自己编程思考的时候就好象是按照系统流程思考的,以前对面向对象理解不够深刻,虽然刚参加新东方培训的时候,就提到java是一门面向对象的语言,不过当时只停留在字面上,后来使用hibernate,把数据库表映射成一个个的类,字段影射成类的属性,把对数据库的操作转化为对属性的操作,感觉hibernate那个好呀,有点面象对象的感觉了。
可是平时编程的时候,似乎都是面向实现,而没面向接口,公司里也没几个高手,大家只把功能实现就OK了,这段日子反复看设计模式方面的资料,一回想,哎,觉得之前那个项目存在太多的不好的地方了。比如没人做代码审查,一人一种编程风格,代码写的乱,看不懂别人的代码,也不乐意看。。。
继续关注论坛好帖中。。。。

面向对象,有时候做起来挺难的!因为自己做着做着就面向过程去了!

>面向对象,有时候做起来挺难的!因为自己做着做着就面向过程去了!
这是非常现实和普遍,要不说70%程序都在用OO语言做面向过程的事情。

原因出在哪里?源头!开始出发方向错误,后面全盘皆错。

源头是什么?就是对需求的分析方法!

如果采取首先建立数据表的分析方法,必然导致面向过程,这是一对恶魔。因为SQL执行必须按照过程先后顺序来执行。而OO编程则是可能打乱这些顺序,通过动态组件AOP概念,我们可以在运行现场配置先后运行顺序,这些都是面向过程做不到的,面向过程导致铁板一块,毫无维护性和拓展力,健壮性和稳定性更别谈了!

面向过程是对问题以过程式的方案解决
面向对象是对问题以对象的方案解决,即以人的自然生活习惯和想法来解决.
所以人们也常说面向对象思维方式更向是人想事物的思维方式,更易于理解,但很多人在经历了类似C这样过程语言后,常陷入在过程的思维方式中,要建立面向对象的思维方式那您平时就以对象的方式想问题吧.正所谓万物皆对象嘛

我理解的“面向过程”是以数据为导向,根据不同的数据和处理数据的业务而设计软件。
“面向对象”就是把能做成对象的都对象化,将各种数据业务都对象化。

re:谈谈“面向对象”与“面向过程” 发表: 2007年02月01日 16:52 回复

我理解的“面向过程”是以数据为导向,根据不同的数据和处理数据的业务而设计软件。
“面向对象”就是把能做成对象的都对象化,将各种数据业务都对象化。

支持

面向过程,面向对象,结合着用了,业务的抽象是面向对象,但是这个面向对象如果跟数据库,跟遗留系统来用,估计很难了,sql的灵活性在应用里面很多地方都需要的,起码性能上。如果说支持“纯”面向对象。那是以后的事情了,起码现阶段的企业与那么多人都很难做到。纯面向对象最危险的是,如果团队里面有人没有面向对象的思维,将来修改成纯面向对象是很难的,就算改了,结构都有了变化,从现在的国情来说,真的很难,真正的程序员太少了,都是为了生活。

在家玩了很长时间了。

面向过程或者面向对象也许都不是最重要的,幽雅的解决问题,或者说,适合的才是最好的。

比如IBM笔记本贵为机皇,那确实是好,T系列,X系列更是其拳头产品。可是贵得狠,象我们这样的普通老百姓要是资金不够,也就不用买其低端的R系列了,相同的价格用用HP还能有更好的享受。

也许“面向对象”,“面向过程”都只是一种解决问题的思维方法而已,我认为今天的“面向对象”还有其不够成熟的地方,很多时候是“面向对象”与“面向过程并存”,甚至有些语言根本就不是真正的“面向对象”,所以啊,适合就好

对象是名词包含动词,过程是动词里包含名词。书上是这么说的。。。。。。。。。。。。。。。。。。。。。

感觉我在学了C和VB之后,再学习java的时候也出现这样疑问...不知道楼主是否也是这个时期出现的问题...
其实我感觉会出现这样的疑问,还是因为自己的概念不清晰...只要做过一些例子,并且亲身实践过以后,自己就会想在技术有一个提高,比如说从"面向过程"到"面向对象"的提高.
"面向对象"将现实世界的物体在电脑中进行了抽象建模,这更加的符合人们的习惯.这样我们就可以轻易的将现实中的问题直接拿到电脑上处理,只是它们被抽象了.

"面向过程"却一味受到电脑处理机制的制约,要解决一个问题,先要把这个问题变成电脑的思考方式.这不符合人们的习惯,也不方便管理.随之而来的就是不好建模,不好复用,不好管理的一些问题...

也许有时候会想,"归根到底电脑还是按照过程在走",但是在现在变成语言已经发展了好几代,语言越来越符合人们的生活习惯,也许最后学习编程会变得和学习一门外语一样了...呵呵...

最后,我认为,楼主应该在对问题的分析和解决上下下功夫,不要被这些概念绊住...