面向对象VS面向过程
什么是面向对象呢?
对于接触或者熟悉一些编程知识的同学来讲,“面向对象”这个词儿一点儿也不陌生。经常听说XX语言是完全面向对象的编程语言,比如C#、Java这些便是完全面向对象的编程语言,又比如C++既是面向过程的编程语言,也是面向对象的编程语言。那么到底二者有什么区别呢,哪个会更好呢?接下来,我结合一个简单的例子来试着阐释我个人的理解。
首先,面向过程与面向对象的概念是解决问题的两种不同思路,一般来讲,面向过程的解决问题思路,比较容易理解,它的理念便是,遇到了一个问题,那么我们要去解决它,我首先做什么,再做什么,接着做什么,最后做什么,所有都完成,那么这个问题就解决了。而面向对象的思路则相对抽象得多,它的理念便是万事万物,都是一个个的对象(也可以说是示例),同样,当我们遇到了一个问题,那么我们采用面向对象的思路来解决问题的话,我们就会抽象和归纳出解决这个问题需要的哪几种事-物;这里的事就是物的动作,特点,数据等描述它和它的行为的抽象。再编程领域,这个事-物的结合体便是类的概念。
下面我用2中不同的思路来解决“把大象放进冰箱的问题”。
(一)面向过程:
便是把要解决的这个问题按照逻辑顺序一步步的完成即可,如下图:
(二)面向对象:
提到面向对象,它的重要标志便是,类的概念。
那么,看到这里,不少同学问题来了,一个件简单的问题,明显面向对象的解决问题思路复杂太多,那么为什么还要用这样的思路来解决问题呢?
我来尝试着回答这个问题:
- 1、从面向对象的概念诞生时间也在面向过程之后,也可能看出来,面向对象是通过面向过程进化和抽象提炼出来的。
- 2、从上第二图可以看出,在面向对象的解题思路中,最后仍然用的面向过程,一步步处理。所以某种意义上说,面向过程是面向对象的祖先,面向过程是面向对象的基础;
- 3、我们所在的世界以及宇宙是非常复杂的,你所碰到的问题也是无限的,而且很多类似,很多重复的部分;那么我们能不能把一份重复的事-物归纳在一起,给他画一个蓝图,以后遇到一样的问题,需要出来,我照着不同的蓝图来拼凑解决问题呢?这便是面向对象的一大重要特征——封装;
- 4、我们进一步还会发现,不同的蓝图之间,不是完全没有关系的,而是相互包含和支撑的;比如,岩土、水和空气的蓝图组成了地球,而地球,月球、太阳和8大行星便组成了太阳系,而太阳不过是银河系无数恒星中的其中一颗;那么地球上的岩土、水和空气的特征是不是便是地球的特其中一部分;太阳是不是与银河系内其他的恒星具有类似的特点,同时,恒星的特征是不是银河系的特征其中一部分;这些个概念便是面向对象的第二大特征——继承;
- 5、上面的把大象放进冰箱的问题,你看哈,冰箱具有“把东西放进去的”这样一个特质,那么今天能放大象进去,明天我能不能放头牛进去,后天我放一只鸡进去,对吧,至于放什么进去冰箱并不关心,可以说,万物都能放哈。 这便是面向对象的第三大特征——多态;
综上,是不是突然发现,用面向对象的思路来理解这个世界,是不是更贴切。我们是人类,你我只是这个人类中的一个个体,这个个体是按照人类这个蓝图(模板)来创造的。这边是对我们真实世界的最接近的描述。
所以,其实我们认识世界一开始便是面向对象的,我们通过人脑不断地自然的抽象各种模版出来,从而认识了这个纷繁复杂的世界。这让我想起了小学二年级的一遍课文——《小蝌蚪找妈妈》,几十年了,依然在小学的课本上。小蝌蚪是怎么认识世界的,一开始遇到的鲤鱼妈妈告诉它,四条腿的宽嘴巴的便是你的妈妈。 好了,小蝌蚪便在内心归纳总结,谁有四条腿和一个宽嘴巴便是青蛙妈妈。接下来,它依据这个特征错误地误认为乌龟是青蛙妈妈。乌龟高速它,头顶2个大眼睛,绿色的皮肤便是你的妈妈。最后小蝌蚪加上这两个特征,总共4个特征就找到了青蛙妈妈。 这不就是一个面相对象中一个类的定义过程吗?而类便是面向对象的承载和具体体现。
所以说面向对象和面向过程二者缺一不可,而人类在解决探索世界的时候总是需要不断地抽象、归纳、总结,这个也就是“建模”,某种意义上讲,面相对象似乎更能很好地描述咱们这个复杂的世界。
为了更好的理解我们的时间,为了更好的解决复杂的问题,为了真正的学会一门编程语言,我们一定要要好好地,深入的理解面向对象的思想。