在電腦科學中,元對象(metaobject)是操縱、建立、描述或實現對象(包括自身)的對象。適用於元對象的對象叫做基礎對象。元對象可以定義的一些資訊包括:基礎對象的類型、介面、類、方法、特性、解析樹等。元對象是電腦科學反射概念的例子,這裡的系統(通常在執行時間)能訪問它自己的內部結構。反射在根本上確使一個系統能現場重寫自身,在其執行時改變自己的實現[1]。
元對象協定
元對象協定(MOP:metaobject protocol)提供了訪問和操縱對象系統的結構和行為的詞彙表(協定)。元對象協定的典型功能包括[2]:
- 建立或刪除一個新類,
- 建立一個新屬性或方法,
- 致使一個類繼承自一個不同的類(「變更類結構」),
- 產生或變更定義一個類的方法的代碼。
進一步的說,元對象協定不只是到底層實現的介面,轉而,通過元對象協定,對象系統是依據元對象系統而遞迴實現的,而它自身在理論上是依據元-元對象系統來實現的,以此類推直到任意一個基礎情況(對象系統的一個一致性狀態)被確定,協定就自身而言,是在這些實現層級之間的遞迴泛函聯絡。
元對象協定對立於伯特蘭·邁耶的開閉原則,它聲稱軟體對象系統,應當「開放擴充」而「關閉修改」。這個原則有效的劃分了,對其做出增加的擴充對象,和對其重定義的修改對象之間的不同,提出前者是需要的品質(「對象應當可以擴充來滿足將來使用情況的要求」),而後者是不需要的(「對象應當提供拒絕概要修訂的穩定的介面」)。元對象協定與之相反,透明的暴露對象的內部構成,和就系統自身而言的整個對象系統。實際上,這意味著編程者可以使用對象來重定義自身,可能要以非常複雜的方式。
以元對象協定方式實現對象系統,開放了徹底自主的重新設計的可能性,提供了深度靈活性,但介入了可能的複雜性,和難以理解的元穩定性問題(例如,對象系統不可以破壞性更新它自己的元對象協定,這是它的內部自我表示,但是某些更新的潛在破壞性要預測出來,是件不平凡之事,並可能難以推理),這依賴於想要的修改所傳播到的遞迴深度[3]。由於這些原因,當元對象協定出現於一個語言之中的時候,通常被適度使用並用於特殊用途,比如以複雜方式轉換其他軟體或自身的軟體,例如在逆向工程中用到的那些軟體[4]。
在於執行時間不能獲得編譯的時候,元對象協定的實現就有額外的複雜性。例如,有可能通過這種協定變更類型層級,但是這麼做可能導致,用可替代類模型定義編譯的代碼出問題。一些環境找到了有創意的解決方法,比如通過在編譯時間處理元對象問題。一個好例子是OpenC++[5]。語意網的物件導向模型,比多數標準對象系統更加動態,並一致於執行時間元對象協定。例如,在語意網中模型類被預期變更它們的相互關係,並有叫做分類器的一個特殊的推論引擎,可以驗證和分析演化中的類模型[6]。
第一個元對象協定,是在Xerox PARC開發的物件導向程式設計語言Smalltalk之中的元類。隨後的Common Lisp對象系統(CLOS),受到Smalltalk協定,還有Brian C. Smith在3-Lisp作為求值器無窮塔上的原創研究的影響[7]。CLOS模型,不像Smalltalk模型,允許一個類有多於一個超類;這引起了額外的複雜性,比如有解決某些對象實例的類沿襲(lineage)的問題。CLOS還允許動態多方法分派,這是通過泛化函式來處理的,而非Smalltalk的單一分派中的訊息傳遞[8]。描述Common Lisp中元對象協定的語意和實現的最有影響的圖書,是Gregor Kiczales等人的《元對象協定的藝術》[9]。
元對象協定還廣泛的用於軟體工程應用中。在幾乎所有的商業CASE、代碼重構和整合式開發環境中,都有某種形式的元對象協定,用來表示和操縱設計工件[10][11][12]。
元對象協定是實現面向方面編程的一種方式。很多MOP的早期創立者,包括Gregor Kiczales,此後成為了面向切面編程的主要倡導者。PARC雇用了Kiczales等人,為不擁有原生元對象協定的Java設計了AspectJ。
參見
參照
外部連結
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.