ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

提了这么多年的面向对象,你真的懂它的含义吗?

2021-01-06 11:02:14  阅读:205  来源: 互联网

标签:理发 理发师 封装 含义 搬家 面向对象 提了 我们


面向对象

乔布斯采访

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有