浅析面向过程与面向对象
在面试时经常会被问到面向过程和面向对象有什么区别,虽然都是编程的一种思想,但是他们的侧重点不同,我们从以下几个方面进行简单总结。
历史
面向过程的编程语言有汇编语言、C语言。C语言,是1972年贝尔实验室的 D.M.Ritchie 在B语言的基础上设计出的一种新的语言。他们的特点就是太底层了,当你在使用面向过程的编程语言编写代码的时候,你就需要把思维转换成机器的思维,时刻要考虑开辟多大的内存,存储多大的数据,数据在使用完毕的后什么时间释放,这样写代码学习成本太高,开发效率低,不适合编程的推广与应用。
所以渐渐的就发展出来了更友好地面向对象编程语言,面向对象编程思想是很早就提出来早在1967年的时候,在挪威计算中心的Kisten Nygaard和Ole Johan Dahl开发了Simula67语言,它提供了比子程序更高一级的抽象和封装,引入了数据抽象和类的概念,这种语言被认为是第一个面向对象语言。在20世纪80年代初期美国AT&T贝尔实验室的本贾尼.斯特劳斯特卢普(Bjarne Stroustrup)博士发明并实现了C++(最初这种语言被称作“C with Classes”)。一开始C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。目前主流的面向对象编程语言有:Java、C++、Object-C、 JavaScript、Python、Go等,降低了学习成本,易于推广,极大的激发了大家的学习热情, 可以让人们更加专注于如何使用编程语言实现想要的功能。
面向对象(Object Oriented,OO)是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物,是一种高级的编程思想。
对应于软件开发的过程,面向对象OO衍生出3个概念:OOA、OOD和OOP。采用面向对象进行分析的方式称为OOA,采用面向对象进行设计的方式称为OOD,采用面向对象进行编码的方式称为OOP。面向过程(OP)和面向对象(OO)本质的区别在于分析方式的不同,最终导致了编码方式的不同。
编程思想
案例:有一辆车,时速100km/h,行驶在长1000km的跨海大桥上,求多久能跑完?
面向过程编程思想:只关心数学逻辑。
var hours = 1000 / 100; alert(hours);//10
面向对象编程思想:将生活逻辑映射到我们的程序里。
- 找出题目实体,抽象成对象的概念。
- 分析实体属性和功能,给对象赋一些属性和方法。
- 让实体相互作用得出结果,让每个对象去执行自己的方法。
var car = { speed: 100, run:function(road){ return road.length / this.speed; } } var kuahaidaqiao = { length:1000 } var hours = car.run(kuahaidaqiao); alert(hours);//10
面向过程(Procedure Oriented):看名字它是注重过程的。当解决一个问题的时候,面向过程会把事情拆分成: 一个个函数和数据(用于方法的参数)。然后按照一定的顺序,执行完这些方法(每个方法看作一个个过程),等方法执行完了,事情就搞定了。
面向对象(Object Oriented):看名字它是注重对象的。当解决一个问题的时候,面向对象会把事物抽象成对象的概念,就是说这个问题里面有哪些对象,然后给对象赋一些属性和方法,然后让每个对象去执行自己的方法,问题得到解决。
语法
JavaScript是一种基于对象的语言,但是它又不是一种真正的面向对象编程语言,因为它没有类(class)。类是具有一类相同特征事物的抽象概念。 在JS中一切皆对象,对象是具体的某一个实例,唯一的个体。在ECMA6语法中中新增了类这个概念。
对象的概念
在面向对象的编程思想中就是以属性和行为的方式去分析同一类事物,将其共有特性和行为的抽象出来,并封闭起来对待,而且我们封闭的同一类事物的属性和行为是互相关联的,有着内在的联系。
【注】对象既能存储属性又能存储函数。
【注】我们声明的变量和函数对比对象的属性和方法,使用方式相同,唯一的区别就是使用对象的属性和方法时前面需要加对象名称,变量是自由的,属性是属于对象的。
声明对象的三种方式
var obj = new Object(); //通过new对象 var obj = Object(); //声明new var obj = {}; //直接通过对象常量声明
给对象添加属性
obj.name = "钢铁侠"; obj["age"] = 40; //使用中括号方式与通过.的方式添加属性等价 obj.sex = "男";
给对象添加方法
obj.showName = function(){ alert(this.name); //钢铁侠 }
使用对象的属性和方法
alert(obj.age); //40 obj.showName(); //40
删除其中一个属性或者函数
delete obj.age; delete obj.showName; alert(obj.age); //undefined obj.showName(); //报错
数据结构
基本数据类型:存储单个值
数组:处理批量的数据
对象:既能存储数据,又能存储函数
面向过程是围绕功能进行的,为每一个功能写一个函数,需要考虑其中的每一个细节,以步骤划分,可以这么比喻
面向过程的程序=算法+数据结构
而面向对象则像是组装,先确定一个系统是由哪些对象组成,再分别去设计这些对象,将它们像零件一样组装起来形成有完整功能的系统,以功能划分,相当于
对象=算法+数据结构 面向对象的程序=N个对象+控制信息
总结
面向过程
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
缺点:没有面向对象易维护、易复用、易扩展
面向对象
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护
缺点:性能比面向过程低