概念

​ ”你怎么理解面向对象编程的?“,面试的时候被问到这个问题,我突然才意识到我是不懂面向对象编程,我不知道它和其他范式的区别,为什么要有它?它有什么优势?我能回答出它的三个特征,编程也能写类,但我依然不知为什么要这样做。下面是查了一些资料后的理解。

​ 先来顾名思义吧,”面向对象“,”面向“指的是侧重,更关注。核心是”对象“,对象指的是工作的主体,或者说工作组成的东西。面向对象其实就要求了编程思考的角度要从对象出发,即工作的承载体。

​ js以函数为大,正常编程可能更接近面向过程编程,面向过程指的是编程中思考的是逻辑过程,把程序拆分为多个步骤,用函数实现这些步骤,即一个函数又一个函数的调用。

​ 对比理解一下,面向对象编程,以对象为核心;面向过程编程,以过程为核心;前者关注对象,数据是对象的数据,操作是对象的方法,而后者关注过程,程序是数据和操作组成,是一系列过程(步骤)。

​ 有人认为,面向对象把程序往现实对象思考,更符合客观世界。但笔者个人认为面向对象并不比面向过程更客观,现实世界正常人的思维也是线性,一步一步来也没有脱离现实。他们之间更多只是观察的角度不同,面向对象更贴合人们理解世界的思维而已。

与面向过程比较

两者更具体的比较,下面部分参考(引用)文章

为了进一步理解面向对象和面向过程的不同,以设计一个五子棋程序为例,面向过程的设计思路是,首先分析问题的步骤:① 开始游戏;② 黑子先走;③ 绘制画面;④ 判断输赢;⑤ 轮到白子;⑥ 绘制画面;⑦ 判断输赢;⑧ 返回步骤 ②;⑨ 输出最后结果,然后将上面每个步骤用程序来实现即可。

面向对象的设计则将程序分为三类对象:① 黑白双方,这两方的行为是一模一样的;② 棋盘系统,负责绘制画面;③ 规则系统,负责判定诸如犯规、输赢等。第 ① 类对象(玩家对象)负责接受用户输入,并告知第 ② 类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第 ③ 类对象(规则系统)来对棋局进行判定。

可见,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了多个步骤中,很可能出现不同的绘制版本,而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。功能上的统一保证了面向对象设计的可扩展性。

如要加入悔棋功能,若是面向过程设计,则从输入到判断到显示的若干步骤都要改动,甚至步骤之间的先后顺序都可能需要调整。而若是面向对象设计,则只需改动第 ② 类对象(棋盘对象)即可,棋盘对象保存了黑白双方的棋谱和落子先后顺序,简单回溯操作即可实现悔棋功能,并不涉及显示和规则部分,改动是局部可控的。

面向对象 面向过程
特性 抽象、继承、封装、多态 功能模块化,代码流程化
优点 易维护、易复用、易扩展、低耦合 性能高,适合资源紧张、实时性强的场合
缺点 性能比面向过程低 没有面向对象易维护、易复用、易扩展

​ 面向对象是在软件系统逐渐膨胀后产生,目的就是使得复杂系统更加容易维护:

​ 面向过程是划分步骤,一步一步逐渐实现,以上面五子棋为例,现在只有9步,但若不断增加功能,步骤增加,100步,1000步;同时增加步骤可能要修改了某些步骤,1000步中100步要修改。。。

​ 而面向对象做到数据隔离(不同对象),需要扩展就在内部进行修改或者修改使用的接口而已。

面向对象的三个特征

封装:把数据和方法封装在一起,保护起来,只能通过特定方法去修改数据,降低耦合。联系实际,比如人类需要氧气、存储氧气,但是人不能直接增加人(自身除外)的氧气,只能生成通过本身的呼吸来改变本身氧气含量,其他人想要增加某人的氧气,让他呼吸即可(。。。);类的封装类似,私密属性只能通过方法修改,修改过程对外透明,外界不必关心实现,只需要知道用即可。

继承:子类继承父类,又抽象向更具体的变化,强调了程序设计和代码重用。父类动物类,狗类、鱼类继承了动物类,那么动物类本类本身的定义的方法属性就可以直接体现了狗类和鱼类上而不用各自重复定义一次。

多态:与继承结合,接口可以有多种实现,不同类的可以使用同一接口。动物类定义方法呼吸,如狗类和鱼类各自实现具体的逻辑,狗类是吸直接空气中的氧气,而鱼类是鳃过滤水中氧气。使用时都是同一使用方法实例.呼吸

指导编程(总结)

一路看下来,内容虽然不多但总能对面向对象多一点了解。接下来就是应该这么用这些方法论去指导我们编写代码呢?其实在第二节面向对象的比较中例子就是很好的例子了,面向编程很简单,就是注意编程前的思考和思考前方式,首先根据功能划分出类(对象),然后再逐步实现各个类的功能。最终的代码质量,取决于贯穿全程的对功能的需求理解和抽象设计(使用三大特性,各种设计模式等)。

参考

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

编程思想的理解(POP,OOP,SOA,AOP)