关于面向对象和面向过程的程序设计思想的思考和理解

作者博客地址:http://bihe0832.sinaapp.com/


本来是要写一片关于近期工作、学习和自己个人思想方面的文章,但是由于思路还未成形,写起来比较棘手,就先把今天自己结合在C++课上老师关于编程思想的讲解简单的加入自己的一些理解、体会后大概的说说自己对他们一些新的认识,故而命名之为《涅槃之<关于面向对象和面向过程的程序设计思想的思考和理解>》。

                                                                                                                        ----题记

今天收获颇丰,就不闲扯了,先把今天关于编程思想发面的一点的收获写下来,免得脑子不好给忘了,呵呵…………

 

先说说几种编程的思想吧,今天忽然听说了三种:面向过程,面向对象,通用编程。

 

前两个一直以来都或多或少在接触(但其实一直以来还是比较模糊),至于最后的通用编程今天是第一次正式的接触这个概念,回来以后百度百科一下,大惊,尽然相关的内容不多???看来还是比较前沿的好东西,不管是不是有这个概念,本人先要消化一段时间然后再做评论。现就简单的说说前面的两种编程思想吧,我就想到哪说到哪了,也就不从百度百科借鉴了,呵呵……

 

面向过程的代表当然当仁不让的就是C,面向对象则是Java。先分别说说吧,混个脸熟:

 

面向过程主要强调的是把一个工程或者说是事件的实现分为好多步骤,然后按照步骤来逐步完成,程序走到最后,事情自然也就完成了。就如老师举得例子,某一年春晚有一郭达的小品,里面涉及到如何把一头大象放进冰箱里。当时分为了三步:

第一步:打开冰箱。

第二步:把大象放进去。

第三步:关上冰箱。

第三步一完成大象指定会是在冰箱里了,不是么?

 

至于第二步么,老师觉得可以是把大象头割下来先放进去,然后把身体一块一块割了放进去(似乎残忍了点,不过我觉得那个倒不是最重要,关键是大象的头好割不?不过还好,要是犀牛那有怎么办啊?另外真的要是宰的时候记得把象牙留给我,做个筷子,呵呵……不过要是违反了动物保护法有人找来可是不要来找我的啊,别忘了刘洋当年可是没有找替死鬼的哟……),当然最好的就是把它给化成灰呗,那样放进去肯定见简单,只是可惜了那么多肉了……哈哈,不扯了……回到我们的话题,不管你怎么把大象放进去,那是你的事情,不过我的算法就是这样的啦,你只要照做了就一定可以达到你的目的的。

 

这个就是典型的面向过程(以后老板在让你做什么事情,比如让你把大象放进冰箱里不要再说是自己不会,就说自己只会做两步,有一步不会,哈哈……【老师这么说的,不妨以后在他手下干活的时候试试?】)面向过程在乎的更多的是事件本身,看重的是你的事件的实现。

 

而面向对象则是不一样,面向对象更多强调的是数据,它的侧重于设计与问题的本质特性相对应得数据格式。它的设计模式是自下而上的,例如在咖啡馆(哦,似乎这个有人不太明白,这个是当时SSD2中的例子,就是设计一个咖啡馆的管理系统),首先coffee,然后定义一个Coffee类,忽然又发现了个coffee brewercoffee accessory,再定义一个CcoffeeBrewer类和CoffeeAccessory类,这个时候发现其实三者之间有的属性是一样的,然后就再产生一个凌驾于他们之上的Product类,让他们去继承。从而达到代码的复用和管理,实现面向对象最大的特性之一(多态和继承),另外还可以通过这样的方法实现信息的封装,达到保护部分信息的目的。

 

举个例子:说的是一个笑话,曾经有个土财主,自己本来其实很抠门,什么也舍不得,但是又放不下面子,于是想出一个好办法,在门口放了一条很油腻的毛巾,每天出门之前用毛巾抹一把嘴,然后出门以后有人问就说是吃的油条或者是油糕(小时候记得和玩伴们唱的很过的一个儿歌就是:《炸油糕》,那段日子是那么无忧无虑,天是蓝的,云是白的,风使轻的,可是……无论在怎么回头自己都已经回不到过去了,以前奶奶在世的时候还能吃到,现在已经有日子没吃到了……)。有一天财主的儿子上玩厕所没带纸,正好看到了毛巾,就用毛巾擦了屁股,财主不知道,依旧一如既往的出去了,路人自然问的还是那个问题,财主抹抹嘴,很疑惑但是很机灵的回答:哦,今天早上吃的油糕,另外吃了几个鸡蛋,你看蛋黄还在嘴上呢。故事虽然不是很高雅,但是却很好的说明了封装的优点:即数据得到了有效地保护,类之间交流只是通过接口来实现,而在这个例子里面,财主的嘴或者说财主自己就是那个接口,没有人真正知道他吃的什么(当然他的家人要除外啦),只有他的那张油嘴可以说明一切,你或许怀疑,但是思没有办法进去的,你只能在他或者他的嘴这里接收到信息。这样对于财主本人就很好的保护好了自己的隐私,这就是封装的优点。

 

似乎扯得有点远了,下面就主要说说自己关于面向过程和面向对象之间的区别的一些新的理解,尤其是在上完课以后的一些新的想法。

 

还是拿老师的例子来做一个说明,用两种编程的方式来实现:“我吃饭”这个事件

 

这是一个很简单事件,我简要的分析了一下:

 

从面向过程的角度:

首先有一个函数(或者说是动作),那就是吃,然后有两个数据成员:我和饭。然后再在一个函数体里面实现这个算法。

从面向对象的角度:

首先分析发现其中有两种数据,人和饭,这样就产生了两个对象,进而抽象为两个类,然后发现人有一个方法:吃。最后产生一个人类类型的变量我,然后就可以实现这个算法。

 

如果我们有一种高级语言或者也可以说是直接用伪代码来实现的话,他们各自的伪代码就可以用下面的方式来表示:

面向过程代码:

{

我,饭;// 完成吃这个函数的两个变量

{ab}// 定义一个函数来实现吃这个过程或者说是动作

{我,饭}//或者是 {饭,我};主要取决于函数内部的实现是ab,还是ba

}

 

面向对象代码:

{

吃()}// 产生一个类我,实现一个方法:吃

{  }         //  产生另一个类,饭

.吃(饭);//  类我的一个变量我调用方法吃,对饭进行操作。

 

 

我们从这里就可以很明显看出面向对象和面向过程之间的区别了,面向过程更倾向于事件,他主要是先产生一个事件的核心,中文中其实就是表示动作的动词,然后设定变量来完成这个动作。而对于面向对象,则更接近于现实,他是首先找到其中的数据成员,也就是所谓的万物,找到后万物皆对象,在对每个对象分析找到各自所包含的方法(也就是面向过程中各个对象可以实现的函数或者说是动作)。相比之下后者更容易建模和进行系统设计,尤其是在大型系统的设计中。

 

如果把这个问题引申或者进一步思考,就可以得到关于面向对象的进一步理解的或者是对其全貌的概览。

 

之前的事件改为:我吃面,牛吃草,然后还会反刍。

 

这个时候我们发现对象就有我,牛,面,草。其中我的动作(即方法,为了通俗理解,这里不再使用面向对象的术语)就有吃,牛则是有吃和反刍。我们分析还可以发现其实我和牛就在这个事件的条件下具有相同点,都是动物,都要吃,而面和草对于这个问题中也是具有相同点的,他们都是食物。但是这里为了表现更多的信息,我们不构造食物类。

 

同样我们用伪代码来实现的话,这个事件的伪代码就可以用下面的方式来表示:

 

动物  {

吃();

}                              // 构造一个动物类,可以实现一个方法:吃

extends 动物  {

吃();

反刍;

}                 // 构造一个新的类牛继承自动物类并且覆写了动物类的方法吃,而且还有一个属于自己的方法,反刍。

extends 动物  {

       吃();

}                                 // 构造一个新的类我继承自动物类并且覆写了动物类的方法吃,此

                                  时牛和我的吃的方法就实现了多态

{

}                               //这里没有将面和草构造在一个食物类里,这样是可以的,但是在这里

                                 意义不大,相反还会增加代码量

{

}

.吃(面);             //直接创建一个我的类型的变量调用吃这个方法实现对面这个类类型

                                 的一个变量的操作

.吃(草);       //直接创建一个我的类型的变量调用吃这个方法实现对面这个类类型

                                 的一个变量的操作

.反刍();       //牛类类型的变量实现了一个空的方法反刍。

 

 

上面的例子基本上就实现了面向对象编程的一个概述,其中牛和草之间只有吃与被吃的关系,他们之间的只是通过一个实例变量来实现练习,这样就把牛和草的其他信息都封装起来了。

 

以上就是在上完课以后自己通过老师的讲解结合自己对面向对象的了解做的一个思考和理解,如有问题还请多多指教。

 

另外推荐一篇个人认为不错的关于面向对象的实质的文章,个人认为很独到而且也不错。

http://blog.csdn.net/jyk/archive/2010/02/08/5300402.aspx

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值