Posted on 2006-12-04 00:15
canonical 閱讀(1389)
評論(2) 編輯 收藏 所屬分類:
設計理論
??? 面向對象技術中最重要的概念是什么?在面向對象理論發展的初期,幾乎所有的正統聲音都在鼓吹繼承(inheritance)概念,言必稱虛擬函數和多態性。但是依賴繼承這種推導關系來構建龐大系統的弊病在實踐中逐漸暴露出來,隨著組件(Component)技術的發展,所謂的封裝概念逐漸被推崇為面向對象思想的精華。在此過程中,接口(interface)概念作為系統細粒度正交分解的手段也逐漸發展起來。在軟件系統結構的日益復雜化的今天,封裝概念開始成為了質疑的對象。是否與一個概念相關的所有實現都要統一封裝到一個具體的對象中?伴隨著Java,C#等語言進入主流程序界的AOP(Aspect Oriented Programming)給出了不同的答案。在AOP的環境中,Object不再是牢不可破的黑箱模型,而是成為了外部嵌入的方面(Aspect)的容器。在應用AOP這種大范圍結構操縱技術的對象構成體系中,封裝不再是問題的核心,我們所關注的是面向對象技術中更為本原的概念:this指針。
??? 在純粹的技術層面上,面向對象所指的首先是一組相關性的聚集:它指代了一組相關的數據和函數。為了配合這種相關性的表達,在調用形式上發生了重大變化。從全局函數的調用方式轉變到了基于對象指針的調用方式:
??? func(this) ==> this.func();
??? 這里關鍵性的區別在于從全局性的,絕對的表達方式轉變為局域化的,相對的表達方式。this指針限定了一個知識域(domain),調用對象函數是在限定知識域的情況下提供一些相對信息,即調用的時候只需要相對知識。例如現在界面上有兩個按鈕,其中一個跳轉到編輯頁面,另外一個跳轉到列表頁面。為了表達出這兩個按鈕的不同,我們只需要提供非常少的信息。
??? 〈input value="編輯" onclick="stdPage.gotoEditPage('${pkValue}')" /〉
??? 〈input value="列表" onclick="stdPage.gotoListPage()" /〉
所有的公共知識集中在stdPage這個對象指針中。所謂組件技術,關鍵點也正在于這里。基于一個給定的組件對象,我們只需要知道如何調用它的函數,就可以使系統呈現不同的表現形態。我們所關心的并不是如何構造這個知識域(對象本身),而是如何使用相對知識構造出我們最終所需的系統。封裝性使我們擺脫了對系統全局知識的依賴。
?? 從形式主義的角度上說,任何一種調用方式都只是一種表達,它的具體含義需要一個詮釋的步驟。基于對象指針的調用形式直接導向了詮釋的多樣化:我們只需要替換this指針,就可以改變整個一組調用的具體含義。傳統上,對象指針是封閉的,指代的是具體的實現,所有的信息都必須來自于對象指針本身,這造成詮釋的局限性。但是在AOP的支持下,詮釋可以不僅僅是源于其內的,而且可以是發自其外的。例如基于POJO的ORM框架中,我們只需要純粹的基于對象自身的知識對其進行操作,ORM引擎通過enhance POJO對象來重新將其詮釋為對數據庫的持久化操作。