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

7 评论 106704 浏览 267 收藏 8 分钟

昨天讲了MVC,有同学表示还想了解一些软件开发架构方面的姿势。我琢磨了半天,列了不少技术名词,本来想挑一个出来讲一讲,写了一半发现有很多前置知识之前没涉及,于是决定把坑填一填,先从基础的「面向对象」讲起。

话说起来,面向对象的产生还有各位产品经理的功劳。为什么这样说呢?因为一开始的时候,并没有面向对象,只有面向过程的概念。面向过程很好理解,指的是程序员接到需求,会把它拆成一个一个的命令,然后串起来交给计算机去执行。举个例子,产品经理说要把大象装进冰箱里。程序员列了几个步骤:

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

上面每一个步骤,程序员都会用一个「函数」来实现。「函数」是一些代码的集合体,每个函数可以实现一个功能。比如我要定义一个打开冰箱门的函数:

所有函数定义好了之后,依次调用就可以了:

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

需求完成,顺利交工。但是你以为这样就结束了?Naive。产品经理说才刚刚开始呢。

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

如果还是用面向过程的方法来应付,每次需求的变更,程序员就要把整个系统通读一遍,找出可用的函数(如果没有就再定义一个),最后依次调用它们。最后系统越来越杂乱无章难以管理,程序员不堪重负,纷纷操起刀走上了犯罪的道路。

面向对象从另一个角度来解决这个问题。它抛弃了函数,把「对象」作为程序的基本单元。那么对象到底是个什么东西呢?对象就是对事物的一种抽象描述。人们发现,现实世界中的事物,都可以用「数据」和「能力」来描述。比如我要描述一个人,「数据」就是他的年龄、性别、身高体重,「能力」就是他能做什么工作,承担什么样的责任。描述一台电视,「数据」就是它的屏幕尺寸、亮度,「能力」就是播放《葫芦娃》。

面向对象的世界里,到处都是对象。对象不光有「数据」和「能力」,还可以接受命令。例如你可以让「狗」这个对象「吃狗粮」,就可以把「吃狗粮」的命令发给「狗」让其执行,然后我们就实现了「狗吃狗粮」的需求。

现在对象有了,如何进行面向对象的编程呢?很简单,依次向不同的对象发送命令就可以了。回到上面的例子,用面向对象来实现,我们会先定义一个「冰箱」对象,它的「数据」就是当前的冷冻温度,或者该冰箱已经有了多少头大象,「能力」就是开门、关门。还有一个「大象」对象,它的「数据」可以是大象的智商、体积,「能力」就是「自己跑到冰箱里去」。然后我们依次:

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

面向对象有很多特性,你可能听说过继承、封装、多态的概念,但我不准备在这里讲这些(可能后面的文章会介绍),我就说下我理解的面向对象,最重要的两个特性。

自己的事情自己做。

我们创建的对象,应该是刚刚好能做完它能做的事情,不多做,不少做。多做了容易耦合,各种功能杂糅在一个对象里。比如我有一个对象叫「汽车」,可以「行驶」,可以「载人」,现在的需求是要实现「载人飞行」,就不能重用这个对象,必须新定义一个对象「飞机」来做。如果你给「汽车」插上了翅膀,赋予了它「飞行」的能力,那么新来的同学面对你的代码就会莫名其妙,无从下手。

面向接口编程。

现在我们把「数据」和「行为」都封装到了对象里,相当于对象成了一个黑匣子,那我们怎么知道对象具有什么样的能力呢?这个问题的关键就是接口。关于接口,之前的文章《5分钟理解什么是接口》有过介绍。对象把它的能力通过接口的方式公布出来,自己则成为接口的实现者。这样调用者就不用关心接口背后的对象是什么东西,如何实现的了。还是上面的例子,产品经理现在说要把大象放洗衣机里,通过我们的分析,洗衣机也需要有「开门」、「关门」的能力。那么我们就可以抽象出一个接口来,它就是「开门」和「关门」的能力集合,假设我们称之为「大象之家」接口。我们的对象冰箱、微波炉、洗衣机都实现「大象之家」的接口,尽管实现方式不一样,但是在外界看来,它们都是一样的,都是可以盛放大象的容器。这样我们编程的时候就可以这样写:

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

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

面向对象就先讲这些吧,封装、继承和多态暂且当做一个坑,以后来填。年纪大了好忘事儿,你们如果想了解的话,记得提醒我哈。

#专栏作家#

给产品经理讲技术,微信公众号(pm_teacher),人人都是产品经理专栏作家。资深程序猿,专注客户端开发若干年,对前端、后台技术略懂,热衷于对新的科技领域的探索。

本文原创发布于人人都是产品经理,未经许可,不得转载。

更多精彩内容,请关注人人都是产品经理微信公众号或下载App
评论
评论请登录
  1. 是否程序的世界里,所有的方案都要基于面向对象来做?面向过程就彻底被废弃了吗,是否在某些场景下还是有用武之地。

    回复
  2. 世间万物皆为对象;然而你如何去解释一个对象到底是啥…

    来自湖南 回复
  3. 不错,通俗易懂。希望接着讲对象的特性

    回复
  4. 不错,通俗易懂。希望接着讲对象的特性

    回复
  5. 通俗的讲法很好,但是我觉得您得绕回来,实战过程中,谁是大象,谁是门,门哪来,用一个最常见的例子说明可以吗?比如作为程序员,面向对象的开发,第一步是xxx,相当于“找大象”,第二步,从哪调接口xxxxx,相当于“找门”。对应的讲我觉得比较好,感谢!

    来自北京 回复
  6. 越解释越乱……

    来自广东 回复