概述
面向对象编程(Object-Oriented Programming )简称 OOP 和面向过程编程(Procedural Programming)是两种不同的编程范式或编程思想,它们在处理问题的方式、组织代码的结构以及程序设计哲学上有显著的不同点。
概念
面向过程编程:
面向过程着重于解决问题的步骤和顺序,将整个程序划分为一系列可执行的函数或者过程,这些函数通常是相互独立的,并且通过函数调用来协同工作。
在代码中的具体表现为:程序被组织为一个个函数,函数之间通过参数传递数据,函数内部实现具体的计算或操作。
面向对象编程:
面向对象则聚焦于"对象",即现实世界中的实体和概念的抽象。它将数据(属性)和操作数据的行为(方法)绑定在一起,形成"类",通过创建类的实例(对象)来解决问题。对象之间通过消息传递进行通信和协作。
在代码中的具体表现为:程序由类组成,类定义了对象的状态和行为,通过实例化类得到对象,通过对象间的交互来完成功能。
案例
为了能更直观地理解面向对象与面向过程,这里以现实中围棋比赛为例看看在代码中的实现:
swift
**面向过程**
func funcname (Parameters) -> returntype
{
猜先
黑子先手
棋盘绘制
规则判定
白子后手
棋盘绘制
规则判定
...
黑子先手
棋盘绘制
规则判定
白子后手
棋盘绘制
规则判定
结束比赛
}
可以看到面向过程编程关注的是解决问题的步骤,将问题分解为一系列详细的步骤,并通过函数或子程序来逐个实现这些步骤。这些函数或子程序会按照预定的顺序进行调用,从而完成整个任务。
swift
如果用面向对象思想去实现下围棋功能,首先将整个围棋游戏分为三个对象:
1. 黑白双方,这两方的行为是一样的。
2. 棋盘系统,负责绘制画面。
3. 规则系统,负责判定犯规、输赢等。
然后赋予每个对象一些属性和行为:
黑白双方负责接受用户输入,并告知第二类对象(棋盘系统)棋子布局的变化。
棋盘系统接收到了棋子的变化,并负责在屏幕上面显示出这种变化。
第三类对象(规则系统)来对棋局进行判定。
可以看出,面向对象是以功能来划分问题,而不是以步骤解决。比如绘制画面这个行为,在面向过程中是分散在了多个步骤中的,可能会出现不同的绘制版本,所以要考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘系统这个对象中出现,从而保证了绘图的统一。
优缺点
面向过程编程:
- 优点:结构清晰,执行效率相对较高,对于小型、简单的项目或者对性能要求较高的场合比较适用。
- 缺点:当程序规模增大、需求变化频繁时,面向过程编程难以做到良好的模块化和抽象,复用性和扩展性相对较差,代码维护成本可能较高。
面向对象编程:
- 优点:提供更好的模块化和封装,有助于减少代码冗余,增强了复用性和扩展性。通过继承和多态机制能够很好地应对复杂系统的构建和维护。
- 缺点:相比于面向过程,面向对象编程可能引入更多的间接层(如类的实例化),因此在某些特定场景下可能会导致运行效率略低于纯面向过程编程。但其带来的可维护性和灵活性的优势通常被认为远胜于性能上的微小损失。