关于面向过程和面向对象的一些思考
我学的第一门语言是VB,然后是C语言、C++和Python
在不断学习的过程中,一直在思考什么是面向对象,什么是面向过程
网上的回答大多只可意会不可言传,今天在敲代码时终有所悟,故此记录
以下均以 ‘想要在车上开空调’ 和 ‘找出数列中的最小值’ 做类比
面相过程,最典型的是C语言
- 首先要创建一辆车(变量),然后要创建空调这个功能(函数)
此时,车和空调没有必然的联系
- 把空调放到车上(将空调文件include进来)
此时,车上就有空调了,调用空调功能就可以打开,但空调是通用的,不止在车上可以用,在家里还是可以用
- 使用搬到车上的空调
include "stdint.h"
uint16_t list[5] = {4, 2, 9, 7, 0}; //创建一辆车
//创建空调这个功能,因为是同文件,省略了把空调搬上车的过程,相当于车停在家里,空调不用搬也能用
uint16_t searchMin(uint16_t* tar)
{
uint8_t i=0;
uint16_t temp=0;
temp=*tar;
for(i=1;i<5;i++)
{
if(temp > *(tar+i))
temp = *(tar+i);
}
return temp;
}
int main()
{
uint16_t t=0;
t = searchMin(list);
printf("%d", t);
}
面相对象,以C++为例
- 首先创办比亚迪这个品牌(类),它是一家车企(属性),然后让这个品牌的车都拥有空调(方法)
- 把这个品牌的车都生产出来(创建这个类的对象)
此时,每辆车都自带空调,也可以通过一些手段拆下来在家里用(公有public允许拆,但是私有private不允许)
- 使用车里自带的空调
#include <iostream>
class BYD
{
public:
BYD(uint16_t* tar);
uint16_t searchMin(void);
void printList(void);
private:
uint16_t list[5];
};
BYD::BYD(uint16_t* tar)
{
std::cout << "构造 " << std::endl;
for (uint8_t i = 0; i < 5; i++)
{
list[i] = *(tar + i);
}
}
uint16_t BYD::searchMin(void)
{
uint8_t i = 0;
uint16_t temp = list[0];
for (i = 1; i < 5; i++)
{
if (temp > list[i])
temp = list[i];
}
return temp;
}
void BYD::printList(void)
{
std::cout << list[0] << " " << list[4] << std::endl;
}
int main(void)
{
uint16_t t = 0;
uint16_t car[5] = { 4, 2, 9, 7, 0 };
BYD car_t(car);
t = car_t.searchMin();
std::cout << "the min num is " << t << std::endl;
car_t.printList();
}
总结
- 面相过程
- 把想要完成的目标拆解成若干个过程(函数)
- 比如夏天我要舒服地从杭州开车到北京
- 需要将这个目标大致拆解为:提前购买物资、规划路线、开车、开空调
- 就是创建四个过程、一个对象(车),为到北京这个目标服务
- 但这四个过程和车显然没有必然联系;
- 更一般的,比如同时找出数组中的最大值、最小值,并且将数组从大到小输出
- 通常的做法是创建三个功能不同的函数,分别完成整个任务的一部分,最后再整合输出
- 通常的做法是创建三个功能不同的函数,分别完成整个任务的一部分,最后再整合输出
- 面相对象
- 即完成这个目标需要哪些工具
- 还是以“夏天我要舒服地从杭州开车到北京”为例
- 不同于面向于对象,我们现在签约了一位执事——塞巴斯蒂安,TA会负责好一切后勤工作,你只需要有一辆车,然后坐进去(构建)
- 你饿了说一声就行(调用该对象的一个方法),你热了说一声就行(调用该对象的另一个方法),甚至你需要车和想要销毁车这件事本身,塞巴斯蒂安都可以帮你完成(构造函数和析构函数)
- 此时,目标本身成了次要的事,因为你的执事(对象)足够强大,你只需要掌握如何指挥TA即可(了解这个类里面有哪些方法,它们又是如何依赖的)
- 听起来面向对象非常好用,是吗?但它也存在很多掣肘
- 面相对象中的
对象
,非常依赖其他开发者的贡献,为什么我们可以签约赛巴斯?是因为有人创造了赛巴斯,如果没有人创造呢?或者别人创造了但是不允许你签约呢? - 赛巴斯非常强大,但是他太强大了,以至于我们有时候不知道他是如何实现这些目标的,这会使我们失去对项目的掌控力(出了BUG很难改正),因为他的本质是恶魔啊
- 赛巴斯强大到我们甚至不知道他有哪些能力,因此,我们在签约他之前,需要阅读冗长的说明书,否则有可能他一个响指就能完成的目标,我们却让他绕了世界一圈才完成。
- 面相对象中的