给小白解释「面向对象」(问答体)
昨天有个不太懂编程的同事问我「什么是面向对象编程」,我觉得自己回答得蛮好,便厚着脸皮征得同意,把聊天记录稍加编辑发到这里。
什么叫面向对象编程?
- 面向对象就像小组做任务(比如发传单)
- 有 Object A, B, C, D 分别能做分配任务,打印传单,发传单,收传单这几件事
- 然后计算机就负责把 A, B, C, D 生成好,并告诉他们怎么互相联络。程序开始运行时:
- 计算机告诉 A 去发 100 张传单
- A 就会叫 B 打印 100 张传单
- A 再拿着 100 张传单告诉 C 去发传单
- 最后,A 再叫 D 去收传单
- 面向对象的关注点就在 各个对象之间怎么「互相联络」 上
- 每个对象自己的任务都是很小,很简单的,单独理解起来比纯过程式的容易
C
里面是没有对象的,后来的语言里有对象,这个对象怎么被创造出来的呢?
- 所有程序都是对算法的抽象
- 「对象」也是一种抽象
「对象」代表的抽象就是
一个函数或者结构,它能接收很多不同的用来联络的 消息 (Message),然后能根据这些消息做不同的任务或者返回不同的值
- 因此
C
里面也可以有「对象」的- 用
C
的函数和Struct
就能做出「对象」了
- 用
C
之后的语言- 比如
Ruby
就是基于 C 的,Ruby 里的对象就是C
的Struct
以及一堆函数组成的
- 比如
「对象」像不像 PCB 上的芯片?
你们不用考虑这个芯片集成的,只需要知道它的属性就可以了,然后按照不同的需要放芯片(对象),然后 tada~功能就出来了,是这样吗?
- 差不多
- 只要芯片的接口(能接收的消息)对了,就能换不同牌子的芯片用
- 接口是一个对象能接收的消息的集合
- 属性也能用消息来传递的
- 对象的函数是叫它做事情的消息
- 对象的属性是问它问题的消息
关键就是对象之间互通消息,对吧?
- 对的
- 我现在的理解是,面向对象只要理解这一点就算掌握了
- 其他的多态、继承、集合都是对怎么处理消息的不同实现
- 本质都是要设计合理的接口
这个合理的接口指什么呢?
- 就是一个对象的接口不能太大(能接收的消息太多)
- 使用「对象」要实现的目标就是能「换不同牌子的芯片用」
- 如果接口太大了,要做一个满足这个接口的对象就太难了,不够灵活
是不是里面的函数或者算法结构不能特别多?不然就能处理很多消息
- 对,一个对象里的函数、算法结构不能太多
- 一个对象只做一件事(发传单/分配任务/etc.)