元對象
在電腦科學中,元對象(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。
參見
[編輯]參照
[編輯]- ^ Smith, Brian C. Procedural Reflection In Programming Languages. MIT Technical Report. 1982-01-01, (MIT-LCS-TR-272) [16 December 2013]. (原始內容存檔於13 December 2015).
- ^ Foote, Brian; Ralph Johnson. Reflective Facilities in Smalltalk-80. Oopsla '89. 1–6 October 1989: 327–335 [16 December 2013]. ISBN 0897913337. doi:10.1145/74877.74911. (原始內容存檔於2021-03-24).
- ^ The Art of the Metaobject Protocol, Appendix C — Living with Circularity
- ^ Favre, Lilliana; Liliana Martinez; Claudia Pereira. MDA-Based Reverse Engineering of Object Oriented Code. Springer. 2009. ISBN 978-3-642-01861-9. doi:10.1007/978-3-642-01862-6_21.
- ^ Chiba, Shigeru. A Metaobject Protocol for C++. Oopsla '95. 1995: 285–299 [27 December 2013]. ISBN 978-0897917032. doi:10.1145/217838.217868. (原始內容存檔於2013-12-29).
- ^ Knublauch, Holger; Oberle, Daniel; Tetlow, Phil; Wallace, Evan. A Semantic Web Primer for Object-Oriented Software Developers. W3C. 2006-03-09 [2008-07-30]. (原始內容存檔於2018-01-06).
- ^ Brian Cantwell Smith, Procedural Reflection in Programming Languages, Department of Electrical Engineering and Computer Science, Massachusetts Institute of Technology, PhD dissertation, 1982.
3-lisp: an infinite tower of meta-circular interpreters. [2023-01-26]. (原始內容存檔於2023-01-26).
Daniel P. Friedman; Mitchell Wand. The mystery of the tower revealed. The mystery of the tower revealed: A non-reflective description of the reflective tower. 1988: 298–307 [2023-01-26]. ISBN 978-0897912006. doi:10.1145/319838.319871. (原始內容存檔於2023-01-26). - ^ Integrating Object-Oriented and Functional Programming (PDF). [7 July 2016]. (原始內容存檔 (PDF)於2020-07-09).
- ^ Gregor Kiczales, Jim des Rivieres, Daniel G. Bobrow. The Art of the Metaobject Protocol (PDF). MIT Press. 1991 [2022-03-11]. ISBN 0-262-61074-4. (原始內容 (PDF)存檔於2022-02-05).
The Art of the Metaobject Protocol, Chapters 5 and 6 in Hypertext (頁面存檔備份,存於網際網路檔案館) - ^ Johnson, Lewis; David R. Harris; Kevin M. Benner; Martin S. Feather. Aries: The Requirements/Specification Facet for KBSA. Rome Laboratory Final Technical Report. October 1992,. RL-TR-92-248.
- ^ The Origin of Refine (PDF). www.metaware.fr. Metaware White Paper. [6 January 2014]. (原始內容 (PDF)存檔於7 January 2014).
- ^ OMG's MetaObject Facility. omg.org. Object Management Group. [7 January 2014]. (原始內容存檔於2021-05-11).
- ^ OpenC++ Home Page. [2021-03-28]. (原始內容存檔於2020-12-05).
外部連結
[編輯]- The Guile MOP specification (GOOPS, based on Tiny CLOS) (頁面存檔備份,存於網際網路檔案館)
- Metaobjects and the Metaobject Protocol (頁面存檔備份,存於網際網路檔案館)
- Common Lisp Object System Metaobject Protocol (頁面存檔備份,存於網際網路檔案館) (contains two chapters from The Art of the Metaobject Protocol)
- Python 2.6 Metaprogramming (頁面存檔備份,存於網際網路檔案館)