给小白解释「面向对象」(问答体)

昨天有个不太懂编程的同事问我「什么是面向对象编程」,我觉得自己回答得蛮好,便厚着脸皮征得同意,把聊天记录稍加编辑发到这里。

什么叫面向对象编程?

  • 面向对象就像小组做任务(比如发传单)
    1. 有 Object A, B, C, D 分别能做分配任务,打印传单,发传单,收传单这几件事
    2. 然后计算机就负责把 A, B, C, D 生成好,并告诉他们怎么互相联络。程序开始运行时:
      1. 计算机告诉 A 去发 100 张传单
      2. A 就会叫 B 打印 100 张传单
      3. A 再拿着 100 张传单告诉 C 去发传单
      4. 最后,A 再叫 D 去收传单
  • 面向对象的关注点就在 各个对象之间怎么「互相联络」
  • 每个对象自己的任务都是很小,很简单的,单独理解起来比纯过程式的容易

C 里面是没有对象的,后来的语言里有对象,这个对象怎么被创造出来的呢?

  • 所有程序都是对算法的抽象
    • 「对象」也是一种抽象
    • 「对象」代表的抽象就是

      一个函数或者结构,它能接收很多不同的用来联络的 消息 (Message),然后能根据这些消息做不同的任务或者返回不同的值

  • 因此 C 里面也可以有「对象」的
    • C 的函数和 Struct 就能做出「对象」了
  • C 之后的语言
    • 比如 Ruby 就是基于 C 的,Ruby 里的对象就是 CStruct 以及一堆函数组成的

「对象」像不像 PCB 上的芯片?

你们不用考虑这个芯片集成的,只需要知道它的属性就可以了,然后按照不同的需要放芯片(对象),然后 tada~功能就出来了,是这样吗?

  • 差不多
  • 只要芯片的接口(能接收的消息)对了,就能换不同牌子的芯片用
    • 接口是一个对象能接收的消息的集合
  • 属性也能用消息来传递的
    • 对象的函数是叫它做事情的消息
    • 对象的属性是问它问题的消息

关键就是对象之间互通消息,对吧?

  • 对的
  • 我现在的理解是,面向对象只要理解这一点就算掌握了
  • 其他的多态、继承、集合都是对怎么处理消息的不同实现
  • 本质都是要设计合理的接口

这个合理的接口指什么呢?

  • 就是一个对象的接口不能太大(能接收的消息太多)
  • 使用「对象」要实现的目标就是能「换不同牌子的芯片用」
  • 如果接口太大了,要做一个满足这个接口的对象就太难了,不够灵活

是不是里面的函数或者算法结构不能特别多?不然就能处理很多消息

  • 对,一个对象里的函数、算法结构不能太多
  • 一个对象只做一件事(发传单/分配任务/etc.)