文档章节

简述“面向对象”

涅槃Ls
 涅槃Ls
发布于 2017/04/08 18:13
字数 2069
阅读 81
收藏 0

先简单的说一下什么是“程序”:

  • 面向过程时:程序 = 算法 + 数据结构;
  • 面向对象时:程序 = 基于对象操作的算法 + 以对象为最小单位的数据结构。

一、什么是对象?

对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞船等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划、概念或事件。

可以说“一切皆对象”。 

人们还发现,一切对象都可以用「数据」和「能力」来描述。比如:

  • 描述一个人「数据」就是年龄、身高体重,「能力」就是他能做什么工作,承担什么样的责任。
  • 描述一台电视,「数据」就是它的屏幕尺寸、亮度,「能力」就是播放电影电视剧等。

二、什么是面向过程?

面向过程很好理解,可以简单理解成软件开发工程师接到需求后,会把它拆成一个一个的命令,然后串起来交给计算机去执行。

举个例子,产品经理说要把大象装进冰箱里。程序员列了几个步骤:

  • 把冰箱门儿打开。
  • 把大象装进去。
  • 把冰箱门儿关上。

上面每一个步骤,程序员都会用一个「函数」来实现。所有函数定义好了之后,依次调用就可以了:

  • openTheDoor();
  • pushElephant();
  • closeTheDoor();

需求完成,顺利交工,但产品经理说才刚刚开始 XD。

  • 「我要把大象装微波炉里」
  • 「我要把狮子也装冰箱里」
  • 「我要把大象装冰箱,但是门别关,敞着就行」......

如果还是用面向过程的方法来应付,每次需求的变更,程序员就要把整个系统通读一遍,找出可用的函数(如果没有就再定义一个),最后依次调用它们。

虽然功能都能实现,对于计算机无论程序多么的复杂,计算机总是能轻松应付,但是对于越来越杂乱无章难以阅读 难以维护管理的系统,软件开发工程师会不堪重负,纷纷操起刀走上了犯罪的道路。

三、什么是面向对象?

于是人们就想,能不能让计算机直接模拟现实的环境,用人类解决问题的思路、习惯、步骤来设计相应的应用程序?

这样的程序,人们在读它的时候,会更容易理解,也不需要再把现实世界和程序世界之间来回做转换。

首先看一下面向对象的三大特性:

  • 封装:找到变化并且把它封装起来,你就可以在不影响其它部分的情况下修改或扩展被封装的变化部分,这是所有设计模式的基础,就是封装变化,因此封装的作用,就解决了程序的可扩展性。 
  • 继承:子类继承父类,可以继承父类的方法及属性,实现了多态以及代码的重用,因此也解决了系统的重用性和扩展性,但是继承破坏了封装,因为他是对子类开放的,修改父类会导致所有子类的改变,因此继承一定程度上又破坏了系统的可扩展性,所以继承需要慎用。 
  • 多态:接口的多种不同的实现方式即为多态。接口是对行为的抽象,刚才在封装提到,找到变化部分并封装起来,但是封装起来后,怎么适应接下来的变化?这正是接口的作用,接口的主要目的是为不相关的类提供通用的处理服务,我们可以想象一下。比如鸟会飞,但是超人也会飞,通过飞这个接口,我们可以让鸟和超人,都实现这个接口,这就实现了系统的可维护性,可扩展性。 

面向对象是为了解决系统的可维护性,可扩展性,可重用性而应运而生的。

四、怎样实现面向对象?

前面说过 对象可以用「数据」和「行为」来描述,相当于对象成了一个黑匣子,那我们怎么知道对象具有什么样的能力呢? 

这个问题的关键就是接口。

对象把它的能力通过接口的方式公布出来,自己则成为接口的实现者。

这样调用者就不用关心接口背后的对象是什么东西,如何实现的了。

我们还以上面“大象”的需求为例,产品经理现在说要把大象放洗衣机里,通过我们的分析,洗衣机也需要有「开门」、「关门」的能力。

那么我们就可以抽象出一个接口来,它就是「开门」和「关门」的能力集合,假设我们称之为「大象の家」接口。

我们的对象冰箱、微波炉、洗衣机都实现「大象の家」的接口,尽管实现方式不一样,但是在外界看来,它们都是一样的,都是可以盛放大象的容器。

这样我们编程的时候就可以这样写:

  • 向大象の家下达「开门」的命令。
  • 向大象下达「进冰箱」的命令。
  • 向大象の家下达「关门」的命令。

至于 大象の家 到底是个什么东西,我们可以不关心。

即使哪天变成了马桶,「开门」和「关门」的具体实现交给负责马桶对象的同事,我们只管调用就可以了。

专业点讲,面向对象是一种思想:

  • 他让我们在分析和解决问题时,把思维和重点转向现实中的 客体 中来;
  • 然后通过UML工具理清这些客体之间的联系;
  • 最后用面向对象的语言实现这种 客体 以及 客体之间 的联系。

五、面向对象的三大步骤

1、面向对象的 分析(OOA)

    首先是分析需求,先不要思考怎么用程序实现它,先分析需求中稳定不变的客体都是些什么,这些客体之间的关系是什么。

2、面向对象的 设计(OOD)

    把第一步分析出来的需求,通过进一步扩充模型,变成可实现的、符合成本的、模块化的、低耦合高内聚的模型。

3、面向对象的 编程实现(OOP)

    使用面向对象的思想来实现模型 。

六、面向过程到面向对象思维如何转变? 

通常情况下软件开发工程师在拿到一个需求的时候,第一个反应就是如何实现这个需求,这是典型的面向过程的思维过程,而且很快就可能实现了它。

而面向对象,面对的却是客体,第一步不是考虑如何实现需求,而是进行需求分析,就是根据需求找到其中的客体,再找到这些客体之间的联系。

因此面向过程和面向对象的思维转变的关键点,就是在第一步设计,拿到需求后,一定先不要考虑如何实现它,而是通过UML建模,然后按照UML模型去实现它。

七、感谢

多谢以下两位博主的资料:

什么是对象,为什么要面向对象,怎么才能面向对象?

五分钟理解什么是面向对象

小结:

从面向过程 到 面向对象 是一个日积月累过程。

这就印证了当初入Java坑,讲师在讲解“面向对象”时说【初学者可以先不要深层次的理解什么是”面向对象”,一两年后自己就会悟出来并且用的得心应手】。

共勉!

© 著作权归作者所有

共有 人打赏支持
涅槃Ls

涅槃Ls

粉丝 8
博文 24
码字总数 81532
作品 0
深圳
QA/测试工程师
私信 提问
你想要的Python面试都在这里了【315+道题】

写在前面 近日恰逢学生临近毕业,课程后期大家“期待+苦逼”的时刻莫过于每天早上内容回顾和面试题问答部分【临近毕业每天课前用40-60分钟对之前内容回顾、提问和补充,专挑班里不爱说话就的...

p柯西
2018/06/12
0
0
Python基础面试题80问 Python自动化开发

为什么学习Python? 2. 通过什么途径学习的Python? 3. Python和Java、PHP、C、C#、C++等其他语言的对比? 4. 简述解释型和编译型编程语言? 5. Python解释器种类以及特点? 6. 位和字节的关...

zhouzhou2018
2018/05/24
0
0
【深圳】c/cpp

最近跳槽,近年底的时候跳槽,从一个城市来到另一个城市。最主要是为了寻梦。 今天深圳第一面,是一家做游戏的公司。面试题极其变态。四道题目,大多数都很恶心,可能是戳中了我的弱点故而觉...

songtzu
2014/11/10
890
7
JAVA 高级面试题

烧一根不均匀的绳要用一个小时,如何用它来判断半个小时? 两头同时烧 2. 4,4,10,10,加减乘除,怎么出24点? (10*10-4)/4 3. 如果你有无穷多的水,一个容积为3L的和5L的提桶,你如何准确...

HashTable
2016/07/25
147
0
如此理解面向对象编程

从Rob Pike 的 Google+上的一个推看到了一篇叫《Understanding Object Oriented Programming》的文章,我先把这篇文章简述一下,然后再说说老牌黑客Rob Pike的评论。 先看这篇教程是怎么来讲...

阿酷
2012/12/17
6.2K
29

没有更多内容

加载失败,请刷新页面

加载更多

求推广,德邦快递坑人!!!!

完全没想好怎么来吐槽自己这次苦逼的德邦物流过程了,只好来记一个流水账。 从寄快递开始: 2019年1月15日从 德邦物流 微信小app上下单,截图如下: 可笑的是什么,我预约的是17号上门收件,...

o0无忧亦无怖
33分钟前
1
0
Mac Vim配置

1.升级 vim   我自己 MacBook Pro 的系统还是 10.11 ,其自带的 vim 版本为 7.3 ,我们将其升至最新版: 使用 homebrew : brew install vim --with-lua --with-override-system-vim 这将下...

Pasenger
45分钟前
0
0
vmware安装Ubuntu上不了网?上网了安装不了net-tools,无法执行ifconfig?

1.重新设置网络适配器还是不行,如下指定nat 2.还需要指定共享网络,我是在无线环境下 3.无法执行ifconfig https://packages.ubuntu.com/bionic/net-tools到这个网站下载net-tools的deb文件...

noob_chr
今天
1
0
解决SVN:E210007无法协商认证机制

svn:E210007 svn: Cannot negotiate authentication mechanism 执行下面代码即可 sudo yum install cyrus-sasl cyrus-sasl-plain cyrus-sasl-ldap...

临江仙卜算子
今天
1
0
java8的时间和`Date`的对比

java8的时间和Date的对比 java8提供了新的时间接口。相对Date,Calendar,个人感觉最大的好处是对时间操作的学习成本很低,比Calendar低。 1. LocalDate,LocalTime,LocalDateTime LocalDate 代...

北风刮的不认真了
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部