面向过程和面向对象——两种不同的编程思想

关于面向过程和面向对象的一些思考

我学的第一门语言是VB,然后是C语言、C++和Python
在不断学习的过程中,一直在思考什么是面向对象,什么是面向过程
网上的回答大多只可意会不可言传,今天在敲代码时终有所悟,故此记录

以下均以 ‘想要在车上开空调’ 和 ‘找出数列中的最小值’ 做类比

面相过程,最典型的是C语言

  1. 首先要创建一辆车(变量),然后要创建空调这个功能(函数)

    此时,车和空调没有必然的联系

  2. 把空调放到车上(将空调文件include进来)

    此时,车上就有空调了,调用空调功能就可以打开,但空调是通用的,不止在车上可以用,在家里还是可以用

  3. 使用搬到车上的空调
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++为例

  1. 首先创办比亚迪这个品牌(类),它是一家车企(属性),然后让这个品牌的车都拥有空调(方法)
  2. 把这个品牌的车都生产出来(创建这个类的对象)

    此时,每辆车都自带空调,也可以通过一些手段拆下来在家里用(公有public允许拆,但是私有private不允许)

  3. 使用车里自带的空调
#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即可(了解这个类里面有哪些方法,它们又是如何依赖的)

  • 听起来面向对象非常好用,是吗?但它也存在很多掣肘
    1. 面相对象中的对象,非常依赖其他开发者的贡献,为什么我们可以签约赛巴斯?是因为有人创造了赛巴斯,如果没有人创造呢?或者别人创造了但是不允许你签约呢?
    2. 赛巴斯非常强大,但是他太强大了,以至于我们有时候不知道他是如何实现这些目标的,这会使我们失去对项目的掌控力(出了BUG很难改正),因为他的本质是恶魔啊
    3. 赛巴斯强大到我们甚至不知道他有哪些能力,因此,我们在签约他之前,需要阅读冗长的说明书,否则有可能他一个响指就能完成的目标,我们却让他绕了世界一圈才完成。
  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值