简述“面向对象”

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

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

一、什么是对象?

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

可以说“一切皆对象”。 

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

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

二、什么是面向过程?

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

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

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

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

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

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

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

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

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

三、什么是面向对象?

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

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

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

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

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

四、怎样实现面向对象?

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

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

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

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

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

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

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

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

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

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

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

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

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

五、面向对象的三大步骤

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

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

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

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

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

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

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

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

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

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

七、感谢

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

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

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

小结:

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

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

共勉!

转载于:https://my.oschina.net/niepanLs/blog/875384

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值