文档章节

简述“面向对象”

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

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

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

一、什么是对象?

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

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

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

二、什么是面向过程?

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

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

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

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

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

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

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

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

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

 

三、什么是面向对象?

    于是人们就想,能不能让计算机直接模拟现实的环境,用人类解决问题的思路、习惯、步骤来设计相应的应用程序?这样的程序,人们在读它的时候,会更容易理解,也不需要再把现实世界和程序世界之间来回做转换。

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

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

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

 

四、怎样实现面向对象?

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

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

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

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

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

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

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

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

至于 大象の家 到底是个什么东西,我们可以不关心。即使哪天变成了马桶,「开门」和「关门」的具体实现交给负责马桶对象的同事,我们只管调用就可以了。

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

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

五、面向对象的三大步骤

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

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

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

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

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

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

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

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

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

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

 

 

小结:

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

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

    共勉!

 

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

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

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

 

© 著作权归作者所有

共有 人打赏支持
涅槃Ls

涅槃Ls

粉丝 7
博文 17
码字总数 48001
作品 0
深圳
QA/测试工程师
你想要的Python面试都在这里了【315+道题】

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

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

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

zhouzhou2018
05/24
0
0
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
5.9K
29
媒体评选全球十所最适合应用开发者攻读学府

近日,BusinessInsider出炉了一份“全球十所最优秀的应用开发者学校”排行榜,为广大意欲寻求应用开发作为 养家手艺 人生理想的学子们提供了参考。 第十名:普林斯顿大学 简述:因工程与应用...

oschina
2013/03/06
5K
63

没有更多内容

加载失败,请刷新页面

加载更多

TypeScript基础入门之高级类型的可辨识联合(Discriminated Unions)

转发 TypeScript基础入门之高级类型的可辨识联合(Discriminated Unions) 高级类型 可辨识联合(Discriminated Unions) 你可以合并单例类型,联合类型,类型保护和类型别名来创建一个叫做 ...

durban
18分钟前
1
0
画图工具

目标是不要让我自己摆放,那样会打断我的思路。要自己会摆放,我写字就好。 纠结对齐的我在也不会因为一个像素的问题小心翼翼的移动鼠标了。因为它对不齐你也管不了。 Graphviz https://www...

郭大鹏
19分钟前
1
0
在Visual Studio中使用GitHub(使用篇)

上一篇中已经介绍了如何在windows下安装和配置Git,并且详细说明了如何和GitHub连接。 这里就详细的说明下如何在Visual Studio中使用GitHub。这里也是一个简单的Git教程。 注:非常非常简单的...

Jokeny
19分钟前
1
0
tomcat 在liunx系统中shutdown后进程仍然存在解决办法

这个在windows下没有碰到过,因为此前跑Tomcat都是以服务而不是命令脚本的形式跑的,而且已经换了一个项目,所以暂时不考察windows下是否存在该问题。 难道是Tomcat版本问题?或者用带内存泄...

乱舞
20分钟前
1
0
区块链10年了,还未落地,它失败了吗?

几乎每个人,甚至是对通证持怀疑态度的人,都对区块链的技术有积极的看法,因为它有可能改变世界。然而,区块链技术问世已经10年了,我们仍然没有真正的用上区块链技术。 有人说,比特币是建...

linux-tao
25分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部