面向对象编程

  1. 对象(object)
  2. 类(class) => 对象(object)
  3. 类(class) <= 对象(object)
    1. 反射 reflection
  4. 类关系
  5. 封装
  6. 评价

上一节(面向过程编程),我们浅谈了面向过程编程,目的是为了让读者正视过程式编程且不应该过度使用“对象”。


对象(object)

对象是:

  • 函数(function)
  • 数据(data)
  • 方法(method)+数据(data)

函数和方法的区别:

  • 对象=方法+数据
  • if(对象没有数据) 对象=函数


类(class) => 对象(object)

Image result for 饼干 制作

类相当于模板,通过模板可以生产出若干个对象(object)。另外,”类和对象“相似的有:

静态网站生成器

1
静态网站= 若干个页面模块 + 静态数据

之所以将网站分分割成这样,是为:

  • 模块的重用
  • 数据的集中化处理

而这里的若干个模块对应的是对象对应的是静态网站

通过这个例子,我们大致清楚了类和对象的关系。然而


类(class) <= 对象(object)

类作为模板,生成对象是理所当然。那么反过来,对象可以影响类吗?

答:为了结构的清晰化,对象不可能影响类文件。(形成互相依赖,造成隐患)

1
2
3
4
类的行为+数据=对象的行为
if(数据==null){
    类的行为==对象的行为
}

为了达到类的动态化【假象】(=对象的行为)的假象,我们必须依靠数据

为了达到永久化地修改类的行为【假象】(=对象做出某一情况行为),我们可以依靠数据库或者文件系统,进行存储数据。


反射 reflection

上文提到对象不可操作类,那么反射也肯定是无法违背该原则的。因此,反射仅仅是获取信息,而这些信息有什么用呢?

  • 制造对象

这就有点”编译器“的感觉,获取信息(类文件)并制造对象。(效率低,由此可见)

编译器是按照类文件的内容依次进行编译,而反射的依据却是数据,具有可变性。因此,反射常常给予项目的灵活度。

但是也正因为数据的可变性,使用反射的项目具有一定的不稳定性。


类关系

静态网站生成器中,存在include、layout,对应着生活中的组装和镶嵌,对应着编程中的调用函数和继承。模板一般也就这两种。


封装

对象=数据+方法,对象拥有若干个方法和数据,其实可以被视为一个颗粒度较小的完整程序,并且该程序拥有了入口。若是用静态网站生成器的例子,我们可以把该对象比喻成页面。若干个页面可以组成一个较为大的网站应用。值得思考的是:

  • 网页和网站应用的界限并不是那么清楚。当所有页面都拥有一个目的时,这些页面的集合便是网站应用。
  • 当页面的元素不齐全时,我们能称”页面“为页面吗?


较为大的封装体是由较小的封装体(此处特指对象)所构成。对象作为一个完整封装体,它是由有明显规定的类文件所生成的,通过private、protect、public等进行对外暴露的控制。而对象/类组成的更为大的封装体,他们并没有一个规则。

为了解决较大封装体的不完整,我们不得不设立规则。

多态:多态与接口常常是一起使用的,用于将共同特征的对象归档的策略。就像我们不会把鞋子放到衣服里一样,拿鞋子都是从鞋柜里拿的。

封装体(1)

1547621863831

这种封装体,封装程度十分弱,大部分封装体外的对象要使用该封装体,都是直接进去封装体内部进行调用。也可以说不是封装体,只是单纯的堆积。

封装体(2)

1547622273962

相对于封装体(1),封装体(2)使用了代理,将需要暴露的内容集中化暴露,使封装体更具有”对象“的感觉。更像一个完整的程序。价值是:增加了不少代码,花费不少时间。


评价

通过对对象等名词的解释和思考,我们会发现,日常中随意写的代码由于没有强硬的规范而显得不太”面向对象“。另一方面可以说是,面向编程语言没有很好的引导,导致这种思维的方式。


「编程思想」 系列文章
Part 1 -面向过程编程
Part 2 -面向对象编程