用一个形象的例子说明面向对象编程和面向方法编程的区别

前言

之前看到不少书籍里面说到过这两种方法,看起来感觉很高深,其实原理很简单,就是两个字“模块”,往深一点说,也就是“抽象”。

所谓“大道至简”,简单往往是复杂的思想的基础,所以想要了解这两种思想的区别,还是要好好想想这两个词。

 

面向过程编程和面向对象编程的具体实例

两个人小明和小李同时制造汽车,两个人同时开工。

小明决定用面向过程方法来制造,小李决定用面向对象方法来制造。

第一阶段要求,建造一辆汽车的发动机即可。

小明的制作方法:

1.首先列出来,发动机需要的零件

2.然后根据零件来加工,小明分别加工每一个零件。

3.最后组装所有零件。

小明需要懂得所有的过程,保证每一个零件都可靠,同一时间,只能生成一个零件。

小李的制作方法:

1.首先列出来,发动机需要的零件,规定组装接口

2.分先后顺序分别制作零件。

3.最后组装所有零件。

小李需要了解各个发动机零件如何组装,同一时间只能开发一个零件,然后最后再组装零件。

/*

这一阶段对应了小型程序的开发过程,这个时候,因为程序规模小,同时,可以封装的模块太少,两种方法没有太大的差异。

*/

第二阶段,发动机很好,需要开始大量销售汽车。

小明的制作方法:

1.让工人分别批量生成好之前的每一个小零件。

2.最后组装所有零件。

每一个零件都已经提前制作好了,随时可以拼装,零件和零件之间关联很强,依赖性大,是为这辆车量身定制,耗时时间长,消耗时间精力大。

小李的制作方法:

1.每一个零件,由不同的部门负责,同时根据需要,采购部分零件。

2.最后组装所有零件。

小李只关注核心零件,其他零件只关注采购质量,耗时时间短,消耗时间精力小。

 /*

这一阶段里面,项目要求跟之前是一样的,只是数量上多起来,跟第一阶段的还是一样的项目。

这个时候,两种方法的差异也并不是特别明显,因为两种方式都可以同时开发,而且因为要求是之前实现的一样的功能,所以二次开发成本很小。

*/

第三阶段,汽车推出市场后很好,但是有不少客户提出了不同要求,因为需要开发不同车型。

小明的制作方法:

1.根据不同车型,拆分出来不同的零件,设计新零件。

2.然后根据零件来加工,小明分别加工每一个零件。

3.最后组装所有零件。

小明需要重新开发所有零件,调试不同零件,重用的零件少,耗时时间长。

小李的制作方法:

1.首先找到新车型和之前旧车型的共同点,然后根据设计图纸,针对性地修改之前的零件设计,重新加工。

2.开发核心零件及定制零件,然后购买其他通用零件。

3.最后组装所有零件。

小李将核心零件改进一下,用于新车型,因为零件之间关联性少,所以可以同时开发,开发快,耗时时间短。

 /*

这个时候,因为涉及到根据之前的项目,重新更改修改为新项目,二者的差异就显现出来了。

面向过程方法,需要重新设计所有的零件,虽然有些零件可以重用,但是也还是联合其他模块要经过大量调试,同一时间只能开发一种模块。

面向对象方法,只需要看一下有哪些跟之前开发的项目相同的,因为已经封装好了,可以继承之后直接拿来用。不同的地方,因为不同的模块具有独立性,所以开发起来也很快,多个模块可以同时开发。

*/

紧急修改,临时得到通知,某一款零件存在重大质量问题,需要更换。

小明的应对方法:

因为之前所有的零件都是彼此关联的,所以需要对车型进行重新设计。

小李的应对方法:

因为各个零件之间关联少,只需要更换之前的零件供应商,然后拼装新零件。

 /*

针对项目改动需求,这个时候模块的独立性优点就显现出来了。

不同的功能模块彼此独立,所以需要修改的时候,可以只单独修改这一个模块,开发成本低。

但是如果是面向过程方法,不同的功能实际上都是紧密联系在一起,改动一处代码,就需要实现全局调试。这里改一下,调试一下,哪里改一下,调试一下,花的时间就多了,而且也容易出现bug。

*/

第四阶段,不同的车型日益增多,如何管理不同的车型,同时开发新车型。

小明的管理方式:

针对不同的车型,针对性地编写文档说明,但是因为车型太多,而且每一款都是定制开发,消耗的时间、精力太多。

因为不同的零件之间关联性强,所以需要先把一部分关键零件开发之后,再开发剩下的零件,依次类推,同一时间只能开发一款零件。

小明生病之后,因为没有人了解整个制作过程,所以车辆制造停滞不前。

小李的应对方法:

针对车型的不同零件,分别编写文档说明,同时规范了各个零件的连接。

针对核心零件,集中精力开发,其他零件,量力开发,几条生产线同时开发,彼此互不影响,同一时间,同时开发不同的零件。

小李生病之后,因为之间的零件之间关联程度低,而且有详细地说明文档,车辆零件制作互不影响,依旧正常进行。

/*

当项目变的更大,大到千万级行代码的时候,量变就会产生质变。

面向过程方法,同时维护不同的项目,同时开发新的项目,因为重用性低,需要联合整体项目进行调试,花费的成本太大。

同时之前设计的很好的功能,在重复利用起来,因为是针对不同的车型设计,不同的架构设计彼此之间关联程度太大,所以重复利用起来,也要花费不少代价。

但是面向对象方法,可以将相同的模块通过继承功能(从而实现公用的功能)和覆盖功能(实现自定义的功能)联系起来,相同的模块之间存在有序联系。而不同模块之间,因为关联程度低,所以也可以保持灵活更新和开发的目的。比如发动机技术更新了,那么就可以在新车型上面采用新的发动机,电路系统升级了,就可以在新车型上面运用到新的电路系统。不会跟面向过程方法一样,因为电路系统一定要匹配什么车型整体设计而用不了最新的技术。

*/

--------------------------------------------------------------------------------------------------------------------------------------------------------------

什么是面向过程编程?

其实可以说面向过程编程就是针对项目内部逻辑,一步一步来实现程序的功能。比如要写一个轮播图的功能,第一步确定功能,上一张下一张点击按钮,图片自动轮播,动态显示圆点,然后根据功能来编写程序,第一步写一个间隔执行程序,第二步实现上下移动按钮,最后动态显示原点。步骤清晰,针对于小型程序,方便快捷。

上面的小明就是面向过程编程,每一次制造车都是将所有的零件,都制作一遍,最后才做拼装,不同的零件之间存在先后安装的关联,而且一个零件的好坏会影响到整个车辆的好坏。

 

什么是面向对象编程?

面向对象编程,实际上可以说是面向于模块编程,是对于面向过程编程的抽象,同样实现一个程序有很多步骤,那么面向对象编程就是将不同的功能封装起来(对象的封装),比如上面说的不同的零件就是一个封装,不同的零件提供了不同的作用和状态(对应着对象的方法和属性),对于其他零件来说,封装好的零件提供一个程序接口(与其他对象的关联程度低,保证独立),别的零件不知道这个封装零件是如何实现功能的,只需要保证这个零件能够起作用就可以了。

上面的小李制造车辆的时候,将车辆划分成不同的零件,也就是对象,然后去实现每一个对象的功能。最后通过每一个零件的接口,来实现整体功能的拼装。不同零件提供不同的功能和状态,与其他的零件关联程度低,所以可以同时开发,而且一个零件坏了不会破坏其他零件,只需要更换对应零件即可。

 

什么时候用面向过程编程,什么时候用面向对象编程?

当一个程序的结构不是很复杂,代码量不是很多的时候,那么面向过程编程实际上还是很有优势的,因为不用做封装,直接写好过程就可以了。

但是当一个程序达到上万行代码,涉及到不同的功能的时候,就像上面的车型超过上百种的时候,不可能还是单独为每一辆车单独设计所有的零件,这个时候为了提高开发速度,同时也是为了保证开发质量,将程序的功能划分成不同的模块(对象的封装),比如车的发动机模块,驱动系统模块,电路系统模块,每一个模块都是一个对象,具有封装性,外界与它只有唯一的接口。而且当不同的车型需要同样的功能,或者相似的功能的时候,通过改进之前的零件模块,可以马上做出新的零件模块出来(对象的继承和覆盖特性)。

所以说,与其叫面向对象编程,不如叫面向模块编程。

本质上来说,面向对象编程是对面向过程编程的抽象,将面向过程编程中的一些功能模块封装起来,同时提供继承和覆盖功能,从而达到模块化的编程,大大提高编程的灵活性和协作性。特别是对于项目需求改动频繁的项目来说,如果采用模块化的设计,封装不同的对象,可以大大提高开发效率。

而面向过程编程在多人协作,不端扩展的时候,就会出现因为内部各部分关联程度太高,而出现各种各样的问题。

 

最后,总结一下!

面向过程编程的问题在于,模块与模块之间的耦合程度比较高,改动一个功能,往往会牵涉到一条线的功能改变。因为不同的功能实际上是联系在一起的,一条逻辑线上的。

面向对象编程的好处是,利用继承和模块封装,每一个测试好的模块是独立的,其他的子类可以继承,也可以在继承的基础上再次改进方法和属性,总之不会影响到父类和其他类的运行。

调用其它的功能实际上是在调用不同的模块的功能,如果有一个功能需要定制,那么可以新建一个实例,针对性地修改,不会影响到调用这个模块的其他部分。

低耦合,高内聚,独立模块,提供继承和接口,这个是面向对象独特的优势。

这是两种编程方式,不存在好坏的问题,只是在不同的环境下适用性的问题。在程序小,代码量少,功能模块少的时候,面向过程编程是很适合的,这个时候,面向过程编程反而有点多余。而在大项目中,面向过程编程就有些不足了!

从另外一个角度来说,面向对象编程是对面向过程编程的抽象和改进,本质上的思想(按照开发项目的内在逻辑来实现代码)是一样的。

文章原创:转载可以,但是请尊重劳动成果,注明出处。

原文地址:https://www.cnblogs.com/doctor-chen/p/6082483.html