为什么对象是大势所趋?

The Power of Interoperability:Why Objects Are Inevitable一文谈了面向对象为什么如此取得成功的本质原因是什么?是协同的魅力。

以前对象的本质被看成是数据结构,如果数据结构确实是对象本质,难道是这样才促成面向对象今天如此成功吗?

作者认为这个原因是源自于服务的抽象,这种服务的能力可以被拓展,这种拓展具有协同的。而协同性正是可重用以及现代软件模块化的重要基础。

文章对这个观点进行了严密的论证,首先作者区别了对象和抽象数据类型ADT的区别:

假设有一个对象类型:


type IntSet = {
bool contains(int element);
bool isSubsetOf(IntSet otherSet);
}

class IntSet1 implements IntSet { ... }
class IntSet2 implements IntSet { ... }
// in main()
IntSet s1 = new IntSet1(...);
IntSet s2 = new IntSet2(...);
boolean x = s1.isSubsetOf(s2);

而ADT如下代码:


module SetModule1 {
// implementation...
} with signature {
type IntSet;
bool contains(IntSet set, int element);
bool isSubsetOf(IntSet s1, IntSet s2);
}

或者用如下Java代码:

final class IntSetA {
bool contains(int element) { ... }
bool isSubsetOf(IntSetA other) { ... }
}

ADT相比对象缺少的是interoperability协同性或称互操作性或共同操作性,如果我们再定义一个与inSetA有共同接口的不同类叫IntSetB,如下:


// different code but the same interface
final class IntSetB {
bool contains(int element) { ... }
bool isSubsetOf(IntSetB other) { ... }
}
// in main()
IntSetA sA = new IntSetA(...);
IntSetB sB = new IntSetB(...);
boolean x = sA.isSubsetOf(sB);
// ERROR!

IntSetA和IntSetB并不能比较它们的内容,因为它们是不同的抽象类型,也不是互为子类等情况。

而比较之前的IntSet1和IntSet2它们是共同继承一个接口,所以,它们能够进行相互比较。

interoperability的定义:是计算机系统运行来自不同开发商开发的应用程序能力,不管操作系统或物理架构如何,这些程序都可以跨本地和其他计算机交互工作。

对象除了数据以外,还有行为Behavior, 消息Messages,和服务Services

关于服务抽象,文章以Servlet和Android的ContentProvider为例说明。


class ContentProvider {
abstract Cursor query(Uri uri, ...);
abstract int insert(Uri uri, ContentValues vals);
abstract Uri update(Uri uri,ContentValues vals,...);
abstract int delete(Uri uri, ...);
... // other methods not shown
}

如果没有服务的抽象,将会按照不同的内容性质将输入的请求分发到不同的内容提供者,每个应用都必须重新实现这些代码,这使得协同性interoperability非常困难,降低了整个经济系统的价值,使用对象进行服务的抽象着重重用,使得内容提供框架能够被重用。
[该贴被banq于2013-09-15 16:34修改过]