谈谈对面向对象的理解 什么是面向对象编程


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

谈谈对面向对象的理解 什么是面向对象编程

文章插图
话说起来 , 面向对象的产生还有各位产品经理的功劳 。为什么这样说呢?因为一开始的时候 , 并没有面向对象 , 只有面向过程的概念 。面向过程很好理解 , 指的是程序员接到需求 , 会把它拆成一个一个的命令 , 然后串起来交给计算机去执行 。举个例子 , 产品经理说要把大象装进冰箱里 。程序员列了几个步骤:
上面每一个步骤 , 程序员都会用一个「函数」来实现 。「函数」是一些代码的集合体 , 每个函数可以实现一个功能 。比如我要定义一个打开冰箱门的函数:
所有函数定义好了之后 , 依次调用就可以了:
  • openTheDoor;
  • pushElephant;
  • closeTheDoor;
需求完成 , 顺利交工 。但是你以为这样就结束了?Naive 。产品经理说才刚刚开始呢 。
  • 「我要把大象装微波炉里」
  • 「我要把狮子也装冰箱里」
  • 「我要把大象装冰箱 , 但是门别关 , 敞着就行」
  • 。。。
如果还是用面向过程的方法来应付 , 每次需求的变更 , 程序员就要把整个系统通读一遍 , 找出可用的函数(如果没有就再定义一个) , 最后依次调用它们 。最后系统越来越杂乱无章难以管理 , 程序员不堪重负 , 纷纷操起刀走上了犯罪的道路 。
面向对象从另一个角度来解决这个问题 。它抛弃了函数 , 把「对象」作为程序的基本单元 。那么对象到底是个什么东西呢?对象就是对事物的一种抽象描述 。人们发现 , 现实世界中的事物 , 都可以用「数据」和「能力」来描述 。比如我要描述一个人 , 「数据」就是他的年龄、性别、身高体重 , 「能力」就是他能做什么工作 , 承担什么样的责任 。描述一台电视 , 「数据」就是它的屏幕尺寸、亮度 , 「能力」就是播放《葫芦娃》 。
【谈谈对面向对象的理解 什么是面向对象编程】面向对象的世界里 , 到处都是对象 。对象不光有「数据」和「能力」 , 还可以接受命令 。例如你可以让「狗」这个对象「吃狗粮」 , 就可以把「吃狗粮」的命令发给「狗」让其执行 , 然后我们就实现了「狗吃狗粮」的需求 。
现在对象有了 , 如何进行面向对象的编程呢?很简单 , 依次向不同的对象发送命令就可以了 。回到上面的例子 , 用面向对象来实现 , 我们会先定义一个「冰箱」对象 , 它的「数据」就是当前的冷冻温度 , 或者该冰箱已经有了多少头大象 , 「能力」就是开门、关门 。还有一个「大象」对象 , 它的「数据」可以是大象的智商、体积 , 「能力」就是「自己跑到冰箱里去」 。然后我们依次:
  • 向冰箱下达「开门」的命令 。
  • 向大象下达「进冰箱」的命令 。
  • 向冰箱下达「关门」的命令 。
面向对象有很多特性 , 你可能听说过继承、封装、多态的概念 , 但我不准备在这里讲这些(可能后面的文章会介绍) , 我就说下我理解的面向对象 , 最重要的两个特性 。
自己的事情自己做 。我们创建的对象 , 应该是刚刚好能做完它能做的事情 , 不多做 , 不少做 。多做了容易耦合 , 各种功能杂糅在一个对象里 。比如我有一个对象叫「汽车」 , 可以「行驶」 , 可以「载人」 , 现在的需求是要实现「载人飞行」 , 就不能重用这个对象 , 必须新定义一个对象「飞机」来做 。如果你给「汽车」插上了翅膀 , 赋予了它「飞行」的能力 , 那么新来的同学面对你的代码就会莫名其妙 , 无从下手 。
面向接口编程 。现在我们把「数据」和「行为」都封装到了对象里 , 相当于对象成了一个黑匣子 , 那我们怎么知道对象具有什么样的能力呢?这个问题的关键就是接口 。关于接口 , 之前的文章《5分钟理解什么是接口》有过介绍 。对象把它的能力通过接口的方式公布出来 , 自己则成为接口的实现者 。这样调用者就不用关心接口背后的对象是什么东西 , 如何实现的了 。还是上面的例子 , 产品经理现在说要把大象放洗衣机里 , 通过我们的分析 , 洗衣机也需要有「开门」、「关门」的能力 。那么我们就可以抽象出一个接口来 , 它就是「开门」和「关门」的能力集合 , 假设我们称之为「大象之家」接口 。我们的对象冰箱、微波炉、洗衣机都实现「大象之家」的接口 , 尽管实现方式不一样 , 但是在外界看来 , 它们都是一样的 , 都是可以盛放大象的容器 。这样我们编程的时候就可以这样写:
  • 向大象之家下达「开门」的命令 。
  • 向大象下达「进冰箱」的命令 。
  • 向大象之家下达「关门」的命令 。
至于大象之家到底是个什么东西 , 我们不care 。即使哪天变成了马桶 , 「开门」和「关门」的具体实现交给负责马桶对象的同事 , 我们只管调用就可以了 。
面向对象就先讲这些吧 , 封装、继承和多态暂且当做一个坑 , 以后来填 。年纪大了好忘事儿 , 你们如果想了解的话 , 记得提醒我哈 。
#专栏作家#给产品经理讲技术 , 微信公众号(pm_teacher) , 人人都是产品经理专栏作家 。资深程序猿 , 专注客户端开发若干年 , 对前端、后台技术略懂 , 热衷于对新的科技领域的探索 。