上一节(面向过程编程),我们浅谈了面向过程编程,目的是为了让读者正视过程式编程且不应该过度使用“对象”。
对象(object)
对象是:
- 函数(function)
- 数据(data)
- 方法(method)+数据(data)
函数和方法的区别:
- 对象=方法+数据
- if(对象没有数据) 对象=函数
类(class) => 对象(object)
类相当于模板,通过模板可以生产出若干个对象(object)。另外,”类和对象“相似的有:
静态网站生成器
1
静态网站= 若干个页面模块 + 静态数据
之所以将网站分分割成这样,是为:
- 模块的重用
- 数据的集中化处理
而这里的若干个模块对应的是类,对象对应的是静态网站。
通过这个例子,我们大致清楚了类和对象的关系。然而
类(class) <= 对象(object)
类作为模板,生成对象是理所当然。那么反过来,对象可以影响类吗?
答:为了结构的清晰化,对象不可能影响类文件。(形成互相依赖,造成隐患)
1
2
3
4
类的行为+数据=对象的行为
if(数据==null){
类的行为==对象的行为
}
为了达到类的动态化【假象】(=对象的行为)的假象,我们必须依靠数据。
为了达到永久化地修改类的行为【假象】(=对象做出某一情况行为),我们可以依靠数据库或者文件系统,进行存储数据。
反射 reflection
上文提到对象不可操作类,那么反射也肯定是无法违背该原则的。因此,反射仅仅是获取信息,而这些信息有什么用呢?
- 制造对象
这就有点”编译器“的感觉,获取信息(类文件)并制造对象。(效率低,由此可见)
编译器是按照类文件的内容依次进行编译,而反射的依据却是数据,具有可变性。因此,反射常常给予项目的灵活度。
但是也正因为数据的可变性,使用反射的项目具有一定的不稳定性。
类关系
静态网站生成器中,存在include、layout,对应着生活中的组装和镶嵌,对应着编程中的调用函数和继承。模板一般也就这两种。
封装
对象=数据+方法,对象拥有若干个方法和数据,其实可以被视为一个颗粒度较小的完整程序,并且该程序拥有了入口。若是用静态网站生成器的例子,我们可以把该对象比喻成页面。若干个页面可以组成一个较为大的网站应用。值得思考的是:
- 网页和网站应用的界限并不是那么清楚。当所有页面都拥有一个目的时,这些页面的集合便是网站应用。
- 当页面的元素不齐全时,我们能称”页面“为页面吗?
较为大的封装体是由较小的封装体(此处特指对象)所构成。对象作为一个完整封装体,它是由有明显规定的类文件所生成的,通过private、protect、public等进行对外暴露的控制。而对象/类组成的更为大的封装体,他们并没有一个规则。
为了解决较大封装体的不完整,我们不得不设立规则。
多态:多态与接口常常是一起使用的,用于将共同特征的对象归档的策略。就像我们不会把鞋子放到衣服里一样,拿鞋子都是从鞋柜里拿的。
封装体(1)
这种封装体,封装程度十分弱,大部分封装体外的对象要使用该封装体,都是直接进去封装体内部进行调用。也可以说不是封装体,只是单纯的堆积。
封装体(2)
相对于封装体(1),封装体(2)使用了代理,将需要暴露的内容集中化暴露,使封装体更具有”对象“的感觉。更像一个完整的程序。价值是:增加了不少代码,花费不少时间。
评价
通过对对象等名词的解释和思考,我们会发现,日常中随意写的代码由于没有强硬的规范而显得不太”面向对象“。另一方面可以说是,面向编程语言没有很好的引导,导致这种思维的方式。