作为一个在电商行业混迹多年的产品经理,很多时候以为自己知道什么是面向对象,真正要跟别人解释的时候,又觉得理解上很模糊,网上其他介绍的例子感觉不是很贴切,比如蛋炒饭和盖浇饭,或者五子棋等例子,经过这几天的整理思考,把对面向对象与面向过程的思考给大家分享下:
首先,我们要认识什么是面向对象,先要了解面向对象怎么来的,编程技术一开始是没有面向对象的概念的,最早都是面向过程,后来经过一定时间段的发展,逐渐抽象出面向对象的概念,这里用人类社会本身的发展举一个例子:
最早在农耕时代甚至更早之前,人类都是自给自足,自己种粮食,自己制衣,自己建房子,自己养牛羊猪,经过人类的漫长发展,发现这种方式效率太低,要求每个人什么都会,一旦有什么新的需求,都要自己去学去做,成本太大,另外一方面一单涉及到一些复杂的事情,面向过程就很难解决(比如造皇宫,长城)。所以慢慢的就出现了社会分工,到工业社会以致现代社会以后,逐渐分离出农牧民,建筑工,纺织工,水电工,厨师,工程师,律师,程序猿等工种。这个时候人类有什么需要就可以比较方便快速的满足,比如计算机技术的出行,只需要一小批人会,就可以满足很多人的需求,其他人不需要懂计算机怎么工作的,只需要知道计算机有什么功能,提供什么服务就可以了,再比如大家不想吃米饭,想吃汉堡,只需要厨师学会做汉堡就可以做给大家吃了。
上面人类自给自足,日出而作日入而息就可以理解为面向过程,后来随着社会的发展,衍生出各类工种,可以理解为面向对象,每个人在社会中承担的角色工种不一样,一方面作为服务的提供方,一方面这位需求的满足方,各种角色没有必然的关系,正常情况下是老死不相往来的,除非有需求触发的时候。面向对象的好处是 高内聚、低耦合、可扩展、可复用,能够用来解决更复杂的问题(比如造汽车)
【高内聚、低耦合】:每个人或者每个角色只需要知道自己提供什么服务就可以,每个人或者角色之间没有太大关系,除了有需求时产生的服务和被服务的关系
【可复用】:每个角色可以服务其它所有人或者角色,比如厨师开餐馆,就能满足其让人吃饭的需求
【可扩展】:如果需求发生变化,还是上面的例子,大家不想吃米饭,想吃汉堡,只需要厨师学会做汉堡就可以做给大家吃了,不用大家都去学
【解决复杂问题】:把复杂问题进行分解分工,每个角色各司其职,最终解决问题或者做出一个复杂的产品,比如汽车和飞机,都是全球各个国家和工厂上下游联合一起制造生产的
当然不能绝对的说面向过程好还是面向对象好,单个对象的解决问题的方式其实还是面向过程的。面向过程也有其优势,如果自己就会修电脑,电脑坏了不用拿去修理店,自己直接高地,这样的好处是效率高(效率高的前提是自己会修电脑),速度快,坏了就能修好马上用,所以面向过程编程的好处是性能好,执行速度快,在某些领域追求速度性能或者是相对稳定不怎么扩展的领域用的都是面向过程,比如单片机、嵌入式开发、 Linux/Unix等
这样理解下来,我们就来接到面向过程和面向对象的区别了,也会发现面向对象(社会工种)的一些特点,比如封装、继承、多态:
【封装】:外部只需要对象提供什么服务即可,对象本身决定自己对外暴露或者提供什么,外部不需要了解对象内部结构和处理方式,保护对象内的安全,
【继承】:师傅带徒弟,徒弟继承了师傅的技能
【多态】:比如老师讲课,语文老师讲的是文章,数学老师讲的是公式,同时是厨师作废,可以做面条,也可以做米饭等等。
总结一下:宏观上,用面向对象来把握事物间复杂的关系,分析系统。微观上,仍然使用面向过程。面向过程的思维方式是分析综合,面向对象的思维方式是构造。面向对象是面向过程发展后的产物,包括人类社会也是这么发展的。希望通过这个案例能让大家理解面向对象和面向过程的区别,谢谢~