面向对象的反思
<p$1$2$3$4$5$6>
面向对象有三个特性:封装、继承、多态。
封装是不容置疑的,就算不是面向对象,一样有封装的开发思想。
多态,是能够减少阅读难度的方法,对合作开发有很大的帮助。
<p$1$2$3$4$5$6>
最让人质疑,也是最有特色的是继承。
面向对象用很形象的思维,创造性的将现实世界的种类关系纳入开发指导中,但是正是这种类比,让我产生了一种忧虑。是不是这个目标太过理想,反而让人们忽视了其实质。
肯定的,现实世界的种类关系确实很普遍,我们完全有理由相信,编程使用类似的思想是有价值的,但是对于如何借鉴值得研究。
现在的面向对象继承方法,实质是什么?举例说:有个类D,继承自类B,类D实质上就是类B的简单修改版。用面向对象的语言来说,就是“使用原有功能,保持接口,添加功能”,或者“修正基类的功能”。
第一、接口基本一致。
第二、功能稍作改变。
因此,一般来说,继承就是为了建立一组“类族”,他们有很强的相似性。
为什么说继承有问题,在于继承极为容易被滥用。
最近我重新思考了这个问题,得出来的结论是:继承是一项高层应用,而不是一个基本设计概念。将一个具体的应用策略作为基础设计思想,是相当危险的,降低了设计的成效。
我认为,面向对象其实质是模块化的组件思想,其中“封装”作为基础,“接口”作为通信手段,“多态”作为“接口”的基本属性,从而达到组件于组件之间的松耦合,搞内聚状态。如果,没有封装,就不可能达到高内聚的设计要求,如果没有接口,或者接口不具备多态,组件和组件之间就没有真正意义上的分离,封装也没有任何意义,也不能达到松耦合的设计目标。
因此,我觉得,“面向对象”这个提法,着眼于将概念模型实例化这个角度,虽说有一定的合理性,但是从另一个角度,称作“面向组件”编程或者更能概括其设计思想。
总结:
面向对象有几个相关的理论。
1.概念模型。所谓的概念模型,就是将现实中的一组相关操作和对应的数据,组成一个单一的概念来描述的思想。比如,吃,喝,拉,撒,就可以组成人这个概念来描述。概念模型是将现实的事物,抽象化成一组操作和数据的方法。
2.组件化思想。根据建立的概念模型,引入封装,接口等技术手段,实现组件化,达到高内聚松耦合的设计目标。
3.设计模式。设计模式基于组件化,建立一套卓有成效的,关于组件和组件之间的结构关系的设计方案。
面向对象理论不包含:
1.算法
2.数据结构
我们知道“程序=算法+数据结构”,面向对象却不包含这两个,说明面向对象只是上层建筑,而不包含其底层支持。学习面向对象,是无法“做程序”的,但是对于本身懂得“做程序”的人来说,他就是一个有力的帮手。