前言
什么是对象?什么又是面向对象?等我想想……,好像知道是个啥,他们到底是个啥,怎么大脑一片空白。大多数人都有过这样的经历,对面向对象这一概念既熟悉又陌生。怎么才能让对象不陌生呢?答案是唯有走近对象、了解对象。
一、面向过程编程
1.1 面向过程编程定义
面向过程编程是开发时将注意力集中在解决问题的具体步骤上,而忽视了对问题本身的抽象和建模。这样一来虽然能够在一些小项目上发挥出比较大的优势,但是在大型项目上往往会出现代码难以维护、扩展与复用的问题。这样的文字看的头疼,那我们来先看一张图:
这是一张制作回锅肉的制作步骤图,现在我们有一个问题,要怎么才能制作出图中的回锅肉?
相信你和我一样第一步要准备食材,第二步切片,第三步放入锅中……,通过一系列的具体步骤,最后做出了菜品。
面向过程编程就和我们刚刚做菜的思考方式一样,第一步声明变量(准备食材),第二步对变量进行操作(定义函数)第三步按顺序执行函数。
1.2 面向过程的特点
面向过程编程的特点为线性流程、集中管理、数据共享。我们通过上述做菜例子来联系一下:
- 线性流程:按顺序执行一系列的步骤,就像我们做菜时要先准备食材,然后切片等,顺序不能颠倒,否则就做不出想要的菜品。
- 集中管理:通常会使用一个主函数来调用辅助函数来解决问题。就像你在掌勺一样,你来管理制作。
- 数据共享:多个函数可能会操作全局变量。就像制作回锅肉的肉一样,多个步骤中都会使用到。
二、面向对象编程
2.1 对象的定义
既然是面向对象,那对象是个啥呢?
答案: 万物皆对象。
解析: 我们的客观世界是由许多的事物、事件、规则和概念组成的,在面向对象中这些都可以被看作是对象。可以这样理解,客观世界是由对象组成的。
2.2 面向对象编程定义
面向对象编程是相对于面向过程来说的,是一种编程范式,它引入了“对象”的概念,提供了一种更加符合现实世界的方式建模问题域。通过建模解决问题,不仅能够有效理解与解决问题,还能有效解决面向过程中的对大项目的代码难以维护、扩展、复用的问题。有些晦涩难懂,我们举个例子说明一下:
还是上述问题,要怎么才能制作出图中的回锅肉呢?
注意,我们这里讲的是面向对象,我们得换个思考方式去做(即使用面向对象的方式思考)。我们一起试着来思考一下:
做菜需要人、肉、葱、锅等,既然万物皆对象,那他们就是对象。他们有他们各自的属性(名字、年龄等)和行为(炒、切等),那这些该如何实现炒菜中的相互配合(先放啥后放啥)呢?对象给我们提供了一个消息传递的方式来进行,消息传递是指对象之间通过方法调用实现交互。
2.3 面向对象编程的特点
面向对象的特点有模块化、封装、继承与多态。
- 模块化: 每个对象负责特定的任务,可以独立的进行开发和测试。就好比上述例子中的锅负责存放食材,人只负责炒、切,食材负责发生化学反应。
- 封装: 对象内部数据和逻辑对外部进行隐藏,只暴露必要的接口。类似于例子中的食材内部发生了化学变化,只暴露了生或熟的接口,人只需对其进行调用就知道其熟没熟透。
- 继承与多态: 新的类型可以从老的类型中派生出来,并根据需要进行调整。就像刚学做菜的在老师傅的经验上进行学习。
三、面向对象的优势
-
模块化:每个类负责特定的任务,独立的进行开发和测试,这么做会使得代码更加清晰易懂。
-
维护性:良好的封装和模块化设计会使得代码容易维护与更新。
-
扩展性:新增功能时,只需添加新类或修改现有类,而不必改动整个系统。
-
复用性:通过继承和组合,可以在不重复编写代码的情况下创建新的功能。
-
抽象性:面向对象编程更容易模拟真实世界的实体及其相互关系,简化复杂系统的建模,具有更强的抽象能力。
四、总结
面向过程强调解决问题的具体步骤,通过按顺序执行一系列的步骤(每个步骤用函数实现)来解决问题。 面向对象是基于面向过程来说的,引入了对象的概念,强调的是对问题中事物的抽象,其中对象拥有事物的属性和行为,解决实际问题时通过对象间的交互来解决。