何为面向对象?
概述:所谓对象,是一个名词,任何一个事物都可以称为对象,其有对应的属性(事物的特性)和行为(事物能干什么)。面向对象思想,就是面向事物的编程思想。
面向过程
谈及面向对象,不得不谈的就是面向过程。面向对象是针对名词而言,面向过程则是针对行为动作的处理。
面向过程是一种以过程为中心的编程思想。所谓过程,就是步骤。当要解决问题或实现目标时,就要进行分析,得到解决所需要的步骤,然后利用函数将这些步骤一步步实现。在处理时,依次调用这些函数即可。
当开发程序规模较小且功能固定时,面向过程的方法有其优势,因为其实现步骤清晰,按照分析的思路可以很好的组织程序。
面向对象
何为对象
对象是人们要进行研究的任何事物,从最简单的证书到复杂的飞机等均可看做对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件(摘自《c++ primer》)。
对象具有状态和行为。状态即属性,一个对象可用数据值等来描述其状态;行为即操作,用于改变对象的状态值。
将属性和操作封装起来就组成了对象。对象是对客观事物的抽象,将具有一致的属性和行为封装在一起就形成了类,即具有相同属性和行为的对象的抽象就是类。
类与对象的关系,总的来讲,类是对象的抽象,对象是类的实例。
(1)每一个对象都是某一个类的实例;
(2)每一个类在某一个时刻都有零或更多的实例;
(3)类是静态的,它们的内容在程序执行前已经定义好,而对象是动态的,它们在程序执行时可以被创建和删除;
(4)类是生成对象的模板。
面向对象概念
针对面向对象的概念,目前没有统一的说法。狭义上讲,面向对象(OO)是软件开发方法。但面向对象的概念和应用已经远远超出了程序设计和软件开发的范畴,扩展到了数据库系统、应用平台、人工智能等等各个领域。面向对象是一种对现实世界的理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。
面向对象是面向一个名词(事物)的处理,该事物有属性和行为。定义好事物的属性和行为后,针对事物进行操作,进而完成功能。
面向对象与面向过程的区别
面向过程是分析出解决问题所需要的步骤,然后利用函数将这些步骤一一实现,使用时在依次调用函数;面向对象是把构成问题事物分解成各个对象,建立对象的目的不是为完成某一个步骤,而是为描述某个事物在整个解决问题的步骤中的行为。因此,可以说面向过程是基于动作的处理,而面向对象是基于名词事物的处理,
以下例子作解释,要把大象装进冰箱里,有几个步骤:
(A)把冰箱门儿打开。
(B)把大象装进去。
(C)把冰箱门儿关上。
上面每一个步骤,程序员都会用一个「函数」来实现。「函数」是一些代码的集合体,每个函数可以实现一个功能。比如我要定义一个打开冰箱门的函数: openTheDoor()。
所有函数定义好了之后,依次调用就可以了:
openTheDoor();
pushElephant();
closeTheDoor();
需求完成,顺利交工,这是面向过程的处理。但是你以为这样就结束了?如若还需要如下的功能需求呢。
「我要把大象装微波炉里」
「我要把狮子也装冰箱里」
「我要把大象装冰箱,但是门别关,敞着就行」
。。。
如果还是用面向过程的方法来应付,每次需求的变更,程序员就要把整个系统通读一遍,找出可用的函数(如果没有就再定义一个),最后依次调用它们。最后系统越来越杂乱无章难以管理,程序员不堪重负,纷纷操起刀走上了犯罪的道路。
面向对象从另一个角度来解决这个问题。它抛弃了函数,把「对象」作为程序的基本单元。那么对象到底是个什么东西呢?对象就是对事物的一种抽象描述。人们发现,现实世界中的事物,都可以用「数据」和「能力」来描述。比如我要描述一个人,「数据」就是他的年龄、性别、身高体重,「能力」就是他能做什么工作,承担什么样的责任。描述一台电视,「数据」就是它的屏幕尺寸、亮度,「能力」就是播放《葫芦娃》。
面向对象的世界里,到处都是对象。对象不光有「数据」和「能力」,还可以接受命令。例如你可以让「狗」这个对象「吃狗粮」,就可以把「吃狗粮」的命令发给「狗」让其执行,然后我们就实现了「狗吃狗粮」的需求。
现在对象有了,如何进行面向对象的编程呢?很简单,依次向不同的对象发送命令就可以了。回到上面的例子,用面向对象来实现,我们会先定义一个「冰箱」对象,它的「数据」就是当前的冷冻温度,或者该冰箱已经有了多少头大象,「能力」就是开门、关门。还有一个「大象」对象,它的「数据」可以是大象的智商、体积,「能力」就是「自己跑到冰箱里去」。然后我们依次:
(A)向冰箱下达「开门」的命令。
(B)向大象下达「进冰箱」的命令。
(C)向冰箱下达「关门」的命令。
但请注意:面向对象也是有一个个过程组合起来的,其具有封装性,需要很大的空间。这个很好理解,再面向事物的处理,最终都是要归结到具体步骤上去。不论是“打开冰箱门”,还是“向冰箱下达开门的命令”,最终都需要开冰箱门,只是解决问题的角度不同。
面向过程与面向对象的优缺点:
(1)面向过程
优点:流程化使得编程任务明确,在开发之前基本考虑了实现方式和最终结果;效率高,
面向过程强调代码的胆小精悍,善于结合数据结构来开发高效率的程序。流程明确,具体步骤清楚,便于节点分析。
缺点:需要深入的思考,耗费精力,代码重用性低,扩展能力差,维护起来难度比较高,对复杂业务来说,面向对象的模块化难度较高,耦合度也比较高。
(2)面向对象
优点:结构清晰,程序的模块化,结构化,抽象化,更加符合人类的思维方式;封装
性,将事务高度抽象,从而便于流程中的行为分析,也便于操作和自省;容易扩展,代码重用率高,可继承,可覆盖;利用接口将数据与代码实现隔离,实现了一定的保密性;实现简单,可有效地减少程序的维护工作量,软件开发效率高。
缺点:效率低,面向对象在面向过程的基础上高度抽象,从而和代码底层的直接交互非
常少机会,不适合底层开发和游戏甚至多媒体开发;复杂性,对于事务开发而言,事务本身是面向过程的,过度的封装导致事务本身的复杂性提高。