热门问题
时间线
聊天
视角
元對象
来自维基百科,自由的百科全书
Remove ads
在計算機科學中,元對象(metaobject)是操縱、創建、描述或實現對象(包括自身)的對象。適用於元對象的對象叫做基礎對象。元對象可以定義的一些信息包括:基礎對象的類型、接口、類、方法、特性、解析樹等。元對象是計算機科學反射概念的例子,這裡的系統(通常在運行時間)能訪問它自己的內部結構。反射在根本上確使一個系統能現場重寫自身,在其運行時改變自己的實現[1]。
元對象協議
元對象協議(MOP:metaobject protocol)提供了訪問和操縱對象系統的結構和行為的詞彙表即協議。元對象協議的典型功能包括[2]:
- 創建或刪除一個新類,
- 創建一個新屬性或方法,
- 致使一個類繼承自一個不同的類(「變更類結構」),
- 產生或變更定義一個類的方法的代碼。
進一步的說,元對象協議不只是到底層實現的接口,轉而,通過元對象協議,對象系統是依據元對象系統而遞歸實現的,而它自身在理論上是依據元-元對象系統來實現的,以此類推直到任意一個基礎情況(對象系統的一個一致性狀態)被確定,協議就自身而言,是在這些實現層級之間的遞歸泛函聯繫。
元對象協議對立於伯特蘭·邁耶的開閉原則,它聲稱軟件對象系統,應當「開放擴展」而「關閉修改」。這個原則有效的劃分了,對其做出增加的擴展對象,和對其重定義的修改對象之間的不同,提出前者是需要的品質(「對象應當可以擴展來滿足將來使用情況的要求」),而後者是不需要的(「對象應當提供拒絕概要修訂的穩定的接口」)。元對象協議與之相反,透明的暴露對象的內部構成,和就系統自身而言的整個對象系統。實際上,這意味着編程者可以使用對象來重定義自身,可能要以非常複雜的方式。
以元對象協議方式實現對象系統,開放了徹底自主的重新設計的可能性,提供了深度靈活性,但介入了可能的複雜性,和難以理解的元穩定性問題(例如,對象系統不可以破壞性更新它自己的元對象協議,這是它的內部自我表示,但是某些更新的潛在破壞性要預測出來,是件不平凡之事,並可能難以推理),這依賴於想要的修改所傳播到的遞歸深度[3]。由於這些原因,當元對象協議出現於一個語言之中的時候,通常被適度使用並用於特殊用途,比如以複雜方式轉換其他軟件或自身的軟件,例如在逆向工程中用到的那些軟件[4]。
Remove ads
在於運行時間不能獲得編譯的時候,元對象協議的實現就有額外的複雜性。例如,有可能通過這種協議變更類型層級,但是這麼做可能導致,用可替代類模型定義編譯的代碼出問題。一些環境找到了有創意的解決方法,比如通過在編譯時間處理元對象問題。一個好例子是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。
參見
- 種類 (類型論)
- 元類
- OJ
- Joose,JavaScript元對象系統
- Moose,Perl元對象系統
- 統一建模語言:UML
引用
外部連結
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads