提了这么多年的面向对象,你真的懂它的含义吗?
作者:互联网
面向对象
乔布斯采访
1994 年 Rolling Stone 对乔布斯的采访,乔布斯解释了什么是面向对象编程。
Jeff Goodell:请你用尽量简练的语言解释一下,究竟什么是面向对象的软件?
**乔布斯:**对象就像人一样,也是活生生的生命。他们有知识,知道怎么完成任务;他们有记忆,可以把发生的事情记下来。而你和他们的互动并不是低层次的,你是与他们在一个高度抽象的层面上互动,就像我们现在的对话一样。
我举个例子来说明。如果我是一个“洗衣”对象,你可以把脏衣服给我,然后告诉我说:“请帮我把这些衣服洗了吧!”而我恰好知道旧金山最好的洗衣房在哪,并且我会说英语,兜里也有美元。于是我出门打了一辆出租车,告诉司机带我去位于旧金山的洗衣房。我到了那里洗好衣服之后,又坐车回到这里。我把洗好的衣服交还给你,说:“你的衣服已经洗好了。”
你并不知道我是怎么做到的。你不知道哪里有洗衣店,也可能只会说法语,或者是兜里没钱,连车都打不了。但是我知道怎么完成这项任务,而你不需要知道任何细节。所有的这些复杂流程都隐藏在我的内部,而我们之间可以高度抽象地互动。这就是对象。他们把复杂过程封装在内部,而对外呈现的接口是高层次的,抽象的。
什么是面向过程?
那到底什么是面向对象?首先我们得了解面向过程。
面向过程的编程方法,注重解决问题的每一个步骤,并实现对应功能。
比如,我们要完成一天的任务清单,今天的任务包括理发、打扫卫生、搬家。于是我们开始按照顺序,对每个步骤进行实现。
首先要理发,于是我需要:
1.准备理发工具
2.学习理发技能
3.进行理发
搞定之后,再进行打扫卫生,于是继续实现其功能:
1.准备清洁工具
2.制定打扫计划
3.进行打扫
最后要搬家,我们继续拆解,完成这项任务:
1.物品打包
2.准备车辆
3.搬运物品
4.开车
5.卸货
6.搬运物品
7.拆包整理
好了,今天的任务清单实现了。那么,我们的功能也就打包上线了。
这样编写好的代码,都线性的堆在一起,那下次如果再想理发、打扫卫生、搬家,那之前的代码怎么复用呢?
我们这时,想到了函数的封装。于是分别将理发、打扫卫生、搬家这三个功能进行封装,便于我们再次复用,减少开发的成本。
1. tony(){ 准备理发工具、学习理发技能、进行理发 }
2. clean(){ 准备清洁工具、制定打扫计划、进行打扫 }
3. move(){ 物品打包、准备车辆、搬运物品、开车、卸货、搬运物品、拆包整理 }
但是,为什么不一开始就封装呢?因为我们使用的是面向过程的编程思路,出发点是注重怎么样一步一步的解决这个问题。
于是问题解决完成,功能实现,大量的线性代码已经写完后,再去想怎么封装优化。
此时就花费的时间较久,而且也注定了封装和复用性不够好。
什么是面向对象?
其实面向过程是一种低层次的交互。为什么这么说?想想我们在现实生活中,理发、打扫卫生、搬家,真的会这么麻烦吗?
理发,我们会去找理发师(托尼);然后打扫卫生,可以亲力亲为,但也可以直接找清洁公司;搬家,就直接找搬家公司。
于是,我们一天的任务执行,变成了:
1. 理发师,找到理发师张三,进行理发
2. 清洁工,找到清洁工李四,进行卫生打扫
3. 搬家公司,找到搬家公司X,进行搬家工作
理发师不仅可以帮你理发,他精通各种理发技能,可以修剪各种发型。于是,之后所有项目中的理发任务,都可以交给他来完成。而清洁公司、搬家公司也是一样的。于是我们的代码,就可以非常好的进行复用。
这就是面向对象的编程方式,它是现实世界的数字化抽象,更符合认知习惯。
所以我们要完成一项功能,先使用"类-Class"对功能进行封装。
比如我们的理发师,可以写成这样:
// 类是对现实世界抽象概念的数字化,包含数据和对数据的操作
class Tony {name, years, experience, tools; wash(), haircut(), blew(), show();}
但,理发师其实是一个高层次的抽象,它是一个职业,包含了一些基本的数据,如姓名、从业年限、经验、理发使用的工具集,还有对这些数据的一些操作,我们称为功能。
比如使用理发工具集可以进行洗wash()、剪haircut()、吹blew(),理发师可以使用自己的从业年限、经验为自己进行宣传show()。
使用类,定义了理发师这个职业的一些符合我们公认的规范。但我们在寻求理发师的帮助时,不会直接向这个"职业"直接发起请求,因为它本身就是一个抽象,理发师那么多?你找的是哪一个?
我们要找的是某一个从业者,比如理发师张三。而张三就是类“理发师”的一个对象,也称为一个实例。张三成为理发师后,拥有自己的数据,姓名=“张三”,从业7年,经验丰富,使用高级理发工具,同时拥有理发师都应该拥有的技能:洗、剪、吹、宣传。
所以,我们找到张三这个对象,为我们进行服务。
// 对象是类这个抽象概念的实例,拥有独自的数据
zhangsan = new Tony(name=“zhangsan”, years=7, experience=“great”, tools=“high level”)
// 张三使用剪发方法,为我们进行理发
zhangsan.haircut()
于是,打扫卫生、搬家,同样可以定义打扫卫生类、搬家类。然后使用它们的具体对象:清洁员小李、搬家员小王,来为我们完成服务。
这种编程方式,很明显很接近现实世界的交互方式,所以福布斯说,它是一种更高层次的交互。而使用面向对象实现的代码,更容易复用,因为我们在写代码时,目的就是更好的封装,高内聚低耦合。
当然,这两种编程方式没有优劣之分。如果是嵌入式、专项、小型程序的开发,使用面向过程无疑是最为方便的,因为考虑面向对象的封装可能会浪费大量时间。而在大型项目中,可能会进行大量的复用,这时使用面向对象开发,会为之后节省更多的成本。
结束语
如果有帮助的,记得点赞、关注。在公众号《数舟》中,可以免费获取专栏《数据仓库》配套的视频课程、大数据集群自动安装脚本,并获取进群交流的途径。
我所有的大数据技术内容也会优先发布到公众号中。如果对某些大数据技术有兴趣,但没有充足的时间,在群里提出,我为大家安排分享。
公众号自取:
标签:理发,理发师,封装,含义,搬家,面向对象,提了,我们 来源: https://blog.csdn.net/qq_33876553/article/details/112260029