為什麼物件是大勢所趨?

banq發表於2013-09-15
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);
<p class="indent">


而ADT如下程式碼:

module SetModule1 {
// implementation...
} with signature {
type IntSet;
bool contains(IntSet set, int element);
bool isSubsetOf(IntSet s1, IntSet s2);
}
<p class="indent">

或者用如下Java程式碼:

final class IntSetA {
bool contains(int element) { ... }
bool isSubsetOf(IntSetA other) { ... }
}
<p class="indent">


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!
<p class="indent">

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
}
<p class="indent">

如果沒有服務的抽象,將會按照不同的內容性質將輸入的請求分發到不同的內容提供者,每個應用都必須重新實現這些程式碼,這使得協同性interoperability非常困難,降低了整個經濟系統的價值,使用物件進行服務的抽象著重重用,使得內容提供框架能夠被重用。

[該貼被banq於2013-09-15 16:34修改過]

相關文章