2007年02月14日

什麼是 Reflection ?

動態語言 reflection

Reflection ,一般譯為「反射」。但我一般說這是 讓 object 看到自己的外貌的功能(PHP5 的動態函數/行為調用效率測試) 。這說法似乎和「反射」一詞扯不上關係。事實上,我稱這種能力為「自識」能力。


藉由翻譯《To Ruby From PHP》之機會,我整理了我的觀點。我認為 Reflection 其實是 Java/C# 等缺乏個體自識能力之語言才有的詞彙。因為它們的個體不具自識能力,當一個體欲觀察自身輪廓時,必須先配置另一個可反射對象輪廓的個體,該個體才能藉由觀察反射體而得知自身輪廓。而優秀的動態語言 (如 Ruby, Python) 中之個體,不需要藉助其他個體反射自身就能察知自身輪廓。

以現實事物為喻,在 Java/C# 中的個體,要拿一面鏡子 (an instance of reflection class) 擺在自己面前,藉由鏡子反射的影像才能看到自己有幾隻手、幾雙腳。而 Ruby, Python 中的個體,不需要靠鏡子就能知道自己有幾隻手、幾雙腳,它們有與生俱來的能力可以察知自身狀態,故我稱之為「自識」能力。談 Ruby, Python 可能讓多數人覺得陌生,我用 JavaScript 這個大家可能都會寫個幾行的語言為例。 JavaScript 這個 Java 的冒名雙生兄弟之自識能力都比 Java 優秀。如下所示:

就這麼簡單囉。在《PHP5 的動態函數/行為調用效率測試》中,則是比較在 PHP5 中用 Reflection class 和傳統函數之執行效率。在 PHP5 , Reflection class 不論使用方式與效率,都不及傳統函數。在動態語言中,個體有自識能力,所以 reflection 顯得多餘了。


Posted by shirock at 樂多Roodo! │22:18 │回應(2)引用(1)Programming
樂多分類:學術/學習 工具:編輯本文
Ads by Roodo! 

引用URL

http://cgi.blog.roodo.com/trackback/2728221
引用列表:
我這幾天嘗試分別以 JavaScript, PHP, Ruby (排名按字母順序) 實現同一個簡單的功能,這個功能用了簡單的反射與中介編程技巧。主要目的是看這些語言在動態型別、中介編程、迭代與反射語法方面的表現。
JavaScript的中介編程與反射能力示範【石頭閒語】 at 2009年11月9日 12:01
回應文章
最近碰到一個分割程式功能的問題,不得已必須用到反映的功能,寫了一個簡單的抽象插件類別
http://blog.pixnet.net/HACGIS/post/15612808
不知道你有沒有更好的解法?
Posted by tokimeki at 2008年03月21日 11:46
我的回答有些長,所以我另外寫了一篇 blog:
關於分割程式功能以及 mix-in 和 include
Posted by 遊手好閒的石頭成 at 2008年03月25日 18:32