以前看到很多书籍里面说到过这两种方法,看起来感受很高深,其实原理很简单,就是两个字“模块”,往深一点说,也就是“抽象”。编程
所谓“大道至简”,简单每每是复杂的思想的基础,因此想要了解这两种思想的区别,仍是要好好想一想这两个词。架构
两我的小明和小李同时制造汽车,两我的同时开工。模块化
小明决定用面向过程方法来制造,小李决定用面向对象方法来制造。测试
1.首先列出来,发动机须要的零件spa
2.而后根据零件来加工,小明分别加工每个零件。架构设计
3.最后组装全部零件。设计
小明须要懂得全部的过程,保证每个零件均可靠,同一时间,只能生成一个零件。调试
1.首先列出来,发动机须要的零件,规定组装接口code
2.分前后顺序分别制做零件。对象
3.最后组装全部零件。
小李须要了解各个发动机零件如何组装,同一时间只能开发一个零件,而后最后再组装零件。
/* 这一阶段对应了小型程序的开发过程,这个时候,由于程序规模小,同时,能够封装的模块太少,两种方法没有太大的差别。 */
1.让工人分别批量生成好以前的每个小零件。
2.最后组装全部零件。
每个零件都已经提早制做好了,随时能够拼装,零件和零件之间关联很强,依赖性大,是为这辆车量身定制,耗时时间长,消耗时间精力大。
1.每个零件,由不一样的部门负责,同时根据须要,采购部分零件。
2.最后组装全部零件。
小李只关注核心零件,其余零件只关注采购质量,耗时时间短,消耗时间精力小。
/* 这一阶段里面,项目要求跟以前是同样的,只是数量上多起来,跟第一阶段的仍是同样的项目。 这个时候,两种方法的差别也并非特别明显,由于两种方式均可以同时开发,并且由于要求是以前实现的同样的功能,因此二次开发成本很小。 */
1.根据不一样车型,拆分出来不一样的零件,设计新零件。
2.而后根据零件来加工,小明分别加工每个零件。
3.最后组装全部零件。
小明须要从新开发全部零件,调试不一样零件,重用的零件少,耗时时间长。
1.首先找到新车型和以前旧车型的共同点,而后根据设计图纸,针对性地修改以前的零件设计,从新加工。
2.开发核心零件及定制零件,而后购买其余通用零件。
3.最后组装全部零件。
小李将核心零件改进一下,用于新车型,由于零件之间关联性少,因此能够同时开发,开发快,耗时时间短。
/* 这个时候,由于涉及到根据以前的项目,从新更改修改成新项目,两者的差别就显现出来了。 面向过程方法,须要从新设计全部的零件,虽然有些零件能够重用,可是也仍是联合其余模块要通过大量调试,同一时间只能开发一种模块。 面向对象方法,只须要看一下有哪些跟以前开发的项目相同的,由于已经封装好了,能够继承以后直接拿来用。不一样的地方,由于不一样的模块具备独立性,因此开发起来也很快,多个模块能够同时开发。 */
由于以前全部的零件都是彼此关联的,因此须要对车型进行从新设计。
由于各个零件之间关联少,只须要更换以前的零件供应商,而后拼装新零件。
/* 针对项目改动需求,这个时候模块的独立性优势就显现出来了。 不一样的功能模块彼此独立,因此须要修改的时候,能够只单独修改这一个模块,开发成本低。 可是若是是面向过程方法,不一样的功能实际上都是紧密联系在一块儿,改动一处代码,就须要实现全局调试。这里改一下,调试一下,哪里改一下,调试一下,花的时间就多了,并且也容易出现bug。 */
针对不一样的车型,针对性地编写文档说明,可是由于车型太多,并且每一款都是定制开发,消耗的时间、精力太多。
由于不一样的零件之间关联性强,因此须要先把一部分关键零件开发以后,再开发剩下的零件,依次类推,同一时间只能开发一款零件。
小明生病以后,由于没有人了解整个制做过程,因此车辆制造停滞不前。
针对车型的不一样零件,分别编写文档说明,同时规范了各个零件的链接。
针对核心零件,集中精力开发,其余零件,量力开发,几条生产线同时开发,彼此互不影响,同一时间,同时开发不一样的零件。
小李生病以后,由于之间的零件之间关联程度低,并且有详细地说明文档,车辆零件制做互不影响,依旧正常进行。
/* 当项目变的更大,大到千万级行代码的时候,量变就会产生质变。 面向过程方法,同时维护不一样的项目,同时开发新的项目,由于重用性低,须要联合总体项目进行调试,花费的成本太大。 同时以前设计的很好的功能,在重复利用起来,由于是针对不一样的车型设计,不一样的架构设计彼此之间关联程度太大,因此重复利用起来,也要花费很多代价。 可是面向对象方法,能够将相同的模块经过继承功能(从而实现公用的功能)和覆盖功能(实现自定义的功能)联系起来,相同的模块之间存在有序联系。而不一样模块之间,由于关联程度低,因此也能够保持灵活更新和开发的目的。好比发动机技术更新了,那么就能够在新车型上面采用新的发动机,电路系统升级了,就能够在新车型上面运用到新的电路系统。不会跟面向过程方法同样,由于电路系统必定要匹配什么车型总体设计而用不了最新的技术。 */
--------------------------------------------------------------------------------------------------------------------------------------------------------------
其实能够说面向过程编程就是针对项目内部逻辑,一步一步来实现程序的功能。好比要写一个轮播图的功能,第一步肯定功能,上一张下一张点击按钮,图片自动轮播,动态显示圆点,而后根据功能来编写程序,第一步写一个间隔执行程序,第二步实现上下移动按钮,最后动态显示原点。步骤清晰,针对于小型程序,方便快捷。
上面的小明就是面向过程编程,每一次制造车都是将全部的零件,都制做一遍,最后才作拼装,不一样的零件之间存在前后安装的关联,并且一个零件的好坏会影响到整个车辆的好坏。
面向对象编程,实际上能够说是面向于模块编程,是对于面向过程编程的抽象,一样实现一个程序有不少步骤,那么面向对象编程就是将不一样的功能封装起来(对象的封装),好比上面说的不一样的零件就是一个封装,不一样的零件提供了不一样的做用和状态(对应着对象的方法和属性),对于其余零件来讲,封装好的零件提供一个程序接口(与其余对象的关联程度低,保证独立),别的零件不知道这个封装零件是如何实现功能的,只须要保证这个零件可以起做用就能够了。
上面的小李制造车辆的时候,将车辆划分红不一样的零件,也就是对象,而后去实现每个对象的功能。最后经过每个零件的接口,来实现总体功能的拼装。不一样零件提供不一样的功能和状态,与其余的零件关联程度低,因此能够同时开发,并且一个零件坏了不会破坏其余零件,只须要更换对应零件便可。
当一个程序的结构不是很复杂,代码量不是不少的时候,那么面向过程编程实际上仍是颇有优点的,由于不用作封装,直接写好过程就能够了。
可是当一个程序达到上万行代码,涉及到不一样的功能的时候,就像上面的车型超过上百种的时候,不可能仍是单独为每一辆车单独设计全部的零件,这个时候为了提升开发速度,同时也是为了保证开发质量,将程序的功能划分红不一样的模块(对象的封装),好比车的发动机模块,驱动系统模块,电路系统模块,每个模块都是一个对象,具备封装性,外界与它只有惟一的接口。并且当不一样的车型须要一样的功能,或者类似的功能的时候,经过改进以前的零件模块,能够立刻作出新的零件模块出来(对象的继承和覆盖特性)。
因此说,与其叫面向对象编程,不如叫面向模块编程。
本质上来讲,面向对象编程是对面向过程编程的抽象,将面向过程编程中的一些功能模块封装起来,同时提供继承和覆盖功能,从而达到模块化的编程,大大提升编程的灵活性和协做性。特别是对于项目需求改动频繁的项目来讲,若是采用模块化的设计,封装不一样的对象,能够大大提升开发效率。
而面向过程编程在多人协做,不端扩展的时候,就会出现由于内部各部分关联程度过高,而出现各类各样的问题。
面向过程编程的问题在于,模块与模块之间的耦合程度比较高,改动一个功能,每每会牵涉到一条线的功能改变。由于不一样的功能其实是联系在一块儿的,一条逻辑线上的。
面向对象编程的好处是,利用继承和模块封装,每个测试好的模块是独立的,其余的子类能够继承,也能够在继承的基础上再次改进方法和属性,总之不会影响到父类和其余类的运行。
调用其它的功能其实是在调用不一样的模块的功能,若是有一个功能须要定制,那么能够新建一个实例,针对性地修改,不会影响到调用这个模块的其余部分。
低耦合,高内聚,独立模块,提供继承和接口,这个是面向对象独特的优点。
这是两种编程方式,不存在好坏的问题,只是在不一样的环境下适用性的问题。在程序小,代码量少,功能模块少的时候,面向过程编程是很适合的,这个时候,面向过程编程反而有点多余。而在大项目中,面向过程编程就有些不足了!
从另一个角度来讲,面向对象编程是对面向过程编程的抽象和改进,本质上的思想(按照开发项目的内在逻辑来实现代码)是同样的。