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修改过]