3.5 详解面向对象的编程(OOP)
3.5.1 什么是面向对象
刚接触编程的时候,多数人本能的反映多是面向过程(OP)的,而不是面向对象(OO)的。这种现象实际上是很正常的,改变思惟方式是须要一个过程的,我大致概括了一下其造成的缘由:
一、直接缘由
你尚未养成面向对象分析问题和解决问题的习惯。创建面向对象的思惟方式须要必定时间的训练和揣摩才能造成,因此你能够在学习或具体项目中刻意地强化这种意识。通常状况下,通过一段时间以后,你会以为这是天然而然的事情,只有心中OO,眼中天然OO了。
二、历史缘由
咱们从小接受的培训都是采用面向过程(OP)的方式分析问题和解决问题,尤为是数学,多数是强调循序渐进的解决问题,计算机软件的发展一直就与数学是颇有渊源,因此,瓜熟蒂落的,把面向过程(OP)的方式带入到软件开发也是很天然的事情。
什么是面向对象,或者谈谈你对面向对象的理解,这恐怕是软件开发人员,尤为是程序员和设计师应聘的时候,面试官常最挂在嘴边的问题吧。面向对象对应的英文是Object-Oriented,把Object-Oriented翻译成“面向对象”,我一直以为这个译法不太确切,由于多数人第一次看到“面向对象”这四个字,都很难从字面上理解它究竟是什么意思。后来,我又查阅了一些有关的资料,发现港澳台的计算机书籍中是把它翻译成了“物件导向”,这个译法,我感受不错,于我心很有些戚戚焉。“物件导向”比较准确地反映了面向对象认识和解决问题都是要围绕对象展开的。
因此,面向对象的思惟方式认为:软件系统是一组交互的对象的集合。一组相关的对象组合为一个子系统,一组子系统继续组合为更复杂的子系统,直至组合成整个系统。
面向对象方式的出发点是尽量模拟人类习惯的思惟方式,将“问题域”中涉及的内容抽象为“对象”,使软件开发的方法与过程尽量接近人类认识世界解决问题的方法与过程。
面向过程就是分析出解决问题所须要的步骤,而后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就能够了。面向对象是把构成问题事务分解成各个对象,创建对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
面向过程认识和解决问题的思惟,能够称为“流程论”,重点放在处理过程的步骤,流程是整个系统的核心。
面向对象认识和解决问题的思惟,能够称为“组装论”,重心放在对象的抽象和提取上,而后将对象组装为总体。
因此OO和OP从思惟方式来说,出发点仍是彻底不一样的。
3.5.2 OP PK OO
我们用象棋对战的例子,来比较OP和OO的不一样:
红方:功夫熊猫 黑方:悍娇虎 裁判:龟仙人
采用面向过程(OPP)的设计思路,首先分拆整个对战过程,分析双方对战的步骤,获得以下流程:
把上面每一个步骤分别用函数进行实现,问题就解决了。
咱们再来看看面向对象是如何来解决问题,整个象棋游戏能够抽象出3种对象:
一、棋手,负责行棋,这二者行为一致。
二、棋盘,负责绘制棋盘画面。
三、裁判,负责断定诸如吃子、犯规和输赢。
三者之间的关系以下:
第一类对象棋手负责行棋,并告知第二类对象棋盘中棋子布局的变化,棋盘接收到了棋子布局的变化后,负责在绘制屏幕,同时利用第三类对象裁判来对棋局进行断定。
从以上两种的实现方式能够看出几点:
一、可维护性
面向对象是以数据和功能来划分问题,而不是依据流程和步骤。一样是绘制棋盘的行为,在面向过程的设计中分散在了不少的步骤中,极可能出如今不一样的绘制版本中,只是否是很像一份“蛋炒饭”中的鸡蛋?在面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一,这就是把鸡蛋从“蛋炒饭”中分离出来的效果。
二、可扩展性
假如我要加入悔棋的功能,若是要改动面向过程的设计,那么从行棋到显示再到断定这一连串的步骤都要改动,甚至步骤之间的循序都要进行大规模调整。若是是面向对象的话,只用改动棋盘对象就好了,棋盘对象保存了双方的棋谱,简单回溯,减一就能够了,而显示和断定不涉及,同时总体对各个对象功能的调用顺序都没有变化,改动只限定在了局部。
3.5.3 OO的深层思考
OO认为:软件系统是一组交互的对象的集合。
由于人类对现实世界是很是熟悉的,因此OO就是经过抽象的方式,把问题域映射到现实世界,尽可能模拟现实世界的万事万物。经过这种方式,就能够运用现实世界中解决问题的方法与过程,来解决软件领域内的问题。
有人说:OO眼里一切皆对象,这句话仍是颇有道理的。
OO到底给软件开发带来了什么样的好处?OO的抽象的尺度是如何把握的呢?这都是问题。
(未完待续) --------------------------------------------------------------------------- 后记:今天累了,写到这儿吧。晚上回家的时候碰到两个blond beauty,they are from USA。They want to go to 2nd foreign language colledge,but did not know how to get there. I told them the correct route in English. 我学了这么多年的英语,终于帮了国际友人一个小忙。