OO之美:面向对象和基于对象

本节将介绍以下内容:

  • 基于对象的澄清
  • 面向对象的差别

引言

这是一个常常被问起的话题,对于面向对象(Object-Oriented)我们可能有清晰的概念,对于基于对象(Object-Based)我们可能有模糊的认知,而对于二者一词之差的细节,又有多少概念值得深究呢?

关于面向对象的论述,本书第1章“OO的智慧”已经有相对全面的介绍,对于继承、封装和多态这些基本要素,已经有了较为深入浅出的了解,基于如此背景,就先从关注基于对象开始。

基于对象

所谓基于对象,就是一种对数据类型的抽象,封装一个结构包含了数据和函数,然后以对象为目标进行操作。

构建的基础是对象,但是操作对象并不体现出面向对象的继承性,也就是说基于对象局限了通过对象模板产生对象的福利。基于对象,不具有继承特性,也就更无所谓多态,但是对象本身的封装性仍然作为很多技术的基础,例如可以设置属性、调用方法,基于对象的语言特征就是将属性或者方法,包含在以对象为结构的组织中。然而,并不能通过“继承”访问父类对象的属性、方法,这是二者本质的区别所在。

从运行时的角度来看,基于对象的操作可以在编译时确定,不需要虚分派机制的额外消耗,但是必然少了多态带来的类型决断在运行时的灵活性。

二者的差别

面向对象与基于对象,其核心的差别是对于继承的支持。例如 C# 或者 C++ 是面向对象语言,提供了对继承的原生态支持;而VB和 JavaScript 是基于对象语言,以 JavaScript 为例,其 Prototype-Based 特性实现了以函数为单元的基于对象表现。

举个例子,我们基本认为C#是面向对象的语言,而 JavaScript 是基于对象的语言。在 C# 中封装、继承和多态构成了面向对象丰富体验的理论基础;而JavaScript中虽然只有简单的几种基本类型,但是对象这一基本概念还是成就了 JavaScript 的无限灵活性。但是,JavaScript却不是纯粹的面向对象语言,可以以对象进行数据的操作,但是它没有继承和多态带来的面向对象体验。所以面向对象和基于对象的分水岭就定格于此。

关于OO的核心和抽象,广义上的核心就是“面向抽象,封装变化”这一基本思想,而狭义上的核心就是多态。

那么,抽象算是什么呢?在3.2节“依赖的哲学”中,已经有相当全面的阐释。所谓抽象,代表了软件系统中相对稳定的东西,依赖于稳定的因素可以使得整个系统的耦合度降低,因为稳定就是不变或者不易变。因为不变,所以永恒。架构在永恒之上的东西,正是软件设计理想的交互作用,不过这种理想无法在现实中存在,只能无限地接近,这个被接近的东西就是:抽象。

总结而言,面向对象与基于对象,二者的概念主要体现在:

  • 继承是区别面向对象与基于对象的核心所在,对于少了继承性的基于对象来说,自然少了多态性支持。
  • 封装是面向对象与基于对象的共同特征。

结论

关于面向对象与基于对象,存在概念上的不清晰界定,在面向对象概念大行其道的今天,本没有特别的意义对二者的差别进行特别的了解。然而,透过对象演义的历史,更能帮助我们理解对象本身被赋予的使命。

简而言之:面向对象基于对象而设计,基于对象面向对象而操作。

你可能感兴趣的:(架构)